From 55885d9053158e9ca721ee490334ff62fcb1c436 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 10:58:45 +0200 Subject: [PATCH 001/156] Be more lenient in ignoring LICENSE and COPYING-like files Also ignore such files separated by a dash instead of a full stop. Also ignore the UK spelling LICENCE. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 5 +++-- tests/test_project.py | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 7b98506c0..9bd35c2fb 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -64,8 +64,9 @@ ] _IGNORE_FILE_PATTERNS = [ - re.compile(r"^LICENSE(\..*)?$"), - re.compile(r"^COPYING(\..*)?$"), + # LICENSE, LICENSE-MIT, LICENSE.txt + re.compile(r"^LICEN[CS]E([-\.].*)?$"), + re.compile(r"^COPYING([-\.].*)?$"), # ".git" as file happens in submodules re.compile(r"^\.git$"), re.compile(r"^\.gitkeep$"), diff --git a/tests/test_project.py b/tests/test_project.py index 0041466ea..a7196eeac 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -112,13 +112,23 @@ def test_all_files_ignore_hg(empty_directory): def test_all_files_ignore_license_copying(empty_directory): - """When there are files names LICENSE, LICENSE.ext, COPYING, or COPYING.ext, - ignore them. + """When there are files named LICENSE, LICENSE.ext, LICENSE-MIT, COPYING, + COPYING.ext, or COPYING-MIT, ignore them. """ (empty_directory / "LICENSE").write_text("foo") (empty_directory / "LICENSE.txt").write_text("foo") + (empty_directory / "LICENSE-MIT").write_text("foo") (empty_directory / "COPYING").write_text("foo") (empty_directory / "COPYING.txt").write_text("foo") + (empty_directory / "COPYING-MIT").write_text("foo") + + project = Project.from_directory(empty_directory) + assert not list(project.all_files()) + + +def test_all_files_ignore_uk_license(empty_directory): + """Ignore UK spelling of licence.""" + (empty_directory / "LICENCE").write_text("foo") project = Project.from_directory(empty_directory) assert not list(project.all_files()) From 03f793843ac3ff76a1540fda35253377a78d0dac Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 11:38:48 +0200 Subject: [PATCH 002/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/changed/unspecly-changes.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog.d/changed/unspecly-changes.md diff --git a/changelog.d/changed/unspecly-changes.md b/changelog.d/changed/unspecly-changes.md new file mode 100644 index 000000000..8c8e85d58 --- /dev/null +++ b/changelog.d/changed/unspecly-changes.md @@ -0,0 +1,6 @@ +- Changes that are not strictly compatible with + [REUSE Specification v3.2](https://reuse.software/spec-3.2): + - More `LICENSE` and `COPYING`-like files are ignored. Now, such files + suffixed by `-anything` are also ignored, typically something like + `LICENSE-MIT`. Files with the UK spelling `LICENCE` are also ignored. + (#1041) From aa2c3e08a65cc6a0f57d819896f501f304ed6f2b Mon Sep 17 00:00:00 2001 From: James Wainwright Date: Fri, 9 Aug 2024 14:52:38 +0100 Subject: [PATCH 003/156] Allow Python-style comments in Cargo.lock files --- changelog.d/changed/comment-cargo-lock.md | 1 + src/reuse/comment.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/changed/comment-cargo-lock.md diff --git a/changelog.d/changed/comment-cargo-lock.md b/changelog.d/changed/comment-cargo-lock.md new file mode 100644 index 000000000..fa3351020 --- /dev/null +++ b/changelog.d/changed/comment-cargo-lock.md @@ -0,0 +1 @@ +- Allow Python-style comments in Cargo.lock files diff --git a/src/reuse/comment.py b/src/reuse/comment.py index 533bc3c0c..ad7b4f2db 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -875,7 +875,7 @@ class XQueryCommentStyle(CommentStyle): ".yarnrc": PythonCommentStyle, "ansible.cfg": PythonCommentStyle, "archive.sctxar": UncommentableCommentStyle, # SuperCollider global archive - "Cargo.lock": UncommentableCommentStyle, + "Cargo.lock": PythonCommentStyle, "CMakeLists.txt": PythonCommentStyle, "CODEOWNERS": PythonCommentStyle, "configure.ac": M4CommentStyle, From 04cff09fd4c7c81f597ff934c49b8fc57cabeae5 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Tue, 13 Aug 2024 09:04:44 +0200 Subject: [PATCH 004/156] Add `.envrc` comment detection --- src/reuse/comment.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/reuse/comment.py b/src/reuse/comment.py index 533bc3c0c..a4b552f67 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -851,6 +851,7 @@ class XQueryCommentStyle(CommentStyle): ".dockerignore": PythonCommentStyle, ".earthlyignore": PythonCommentStyle, ".editorconfig": PythonCommentStyle, + ".envrc": PythonCommentStyle, ".empty": EmptyCommentStyle, ".eslintignore": PythonCommentStyle, ".eslintrc": UncommentableCommentStyle, From 56e4758f82ee87068e04b69ce78a314001b6a566 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Tue, 13 Aug 2024 09:05:46 +0200 Subject: [PATCH 005/156] Add `flake.lock` as uncommentable file --- src/reuse/comment.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/reuse/comment.py b/src/reuse/comment.py index a4b552f67..cc6ba9543 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -884,6 +884,7 @@ class XQueryCommentStyle(CommentStyle): "Dockerfile": PythonCommentStyle, "Doxyfile": PythonCommentStyle, "Earthfile": PythonCommentStyle, + "flake.lock": UncommentableCommentStyle, # is a JSON file "Gemfile": PythonCommentStyle, "go.mod": CppCommentStyle, "go.sum": UncommentableCommentStyle, From 2ed327704252a0448e80fd192bc93e59bcb7d268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Wed, 14 Aug 2024 20:36:51 +0000 Subject: [PATCH 006/156] Translated using Weblate (Czech) Currently translated at 84.8% (151 of 178 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 92 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/po/cs.po b/po/cs.po index 5bb915b9c..170db386e 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-08 08:43+0000\n" -"PO-Revision-Date: 2023-04-12 13:49+0000\n" +"PO-Revision-Date: 2024-08-15 21:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -17,8 +17,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.17-dev\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 5.7\n" #: src/reuse/_annotate.py:74 #, python-brace-format @@ -36,19 +36,19 @@ msgid "" msgstr "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" #: src/reuse/_annotate.py:136 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Skipped unrecognised file '{path}'" -msgstr "Přeskočen nerozpoznaný soubor {path}" +msgstr "Přeskočen nerozpoznaný soubor '{path}'" #: src/reuse/_annotate.py:142 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "" +msgstr "'{path}' není rozpoznán; vytváří se '{path}.license'" #: src/reuse/_annotate.py:158 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" -msgstr "Přeskočený soubor '{path}' již obsahuje informace SPDX" +msgstr "Přeskočený soubor '{path}' již obsahuje informace REUSE" #: src/reuse/_annotate.py:192 #, python-brace-format @@ -78,9 +78,8 @@ msgstr "" "--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" #: src/reuse/_annotate.py:231 -#, fuzzy msgid "option --contributor, --copyright or --license is required" -msgstr "je vyžadována volba --copyright nebo --licence" +msgstr "je vyžadována možnost --contributor, --copyright nebo --license" #: src/reuse/_annotate.py:272 #, python-brace-format @@ -92,13 +91,12 @@ msgid "can't write to '{}'" msgstr "nelze zapisovat do '{}'" #: src/reuse/_annotate.py:366 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" msgstr "" -"Následující soubory nemají rozpoznanou příponu. Použijte prosím --style, --" -"force-dot-licence nebo --skip-unrecognised:" +"Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" +"dot-license, --fallback-dot-license nebo --skip-unrecognised:" #: src/reuse/_annotate.py:382 msgid "copyright statement, repeatable" @@ -109,9 +107,8 @@ msgid "SPDX Identifier, repeatable" msgstr "Identifikátor SPDX, opakovatelný" #: src/reuse/_annotate.py:395 -#, fuzzy msgid "file contributor, repeatable" -msgstr "Identifikátor SPDX, opakovatelný" +msgstr "přispěvatel souboru, opakovatelný" #: src/reuse/_annotate.py:403 msgid "year of copyright statement, optional" @@ -122,9 +119,8 @@ msgid "comment style to use, optional" msgstr "styl komentáře, který se má použít, nepovinné" #: src/reuse/_annotate.py:417 -#, fuzzy msgid "copyright prefix to use, optional" -msgstr "styl autorských práv, který se má použít, nepovinné" +msgstr "předpona autorských práv, která se má použít, nepovinné" #: src/reuse/_annotate.py:430 msgid "name of template to use, optional" @@ -157,23 +153,20 @@ msgid "do not replace the first header in the file; just add a new one" msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" #: src/reuse/_annotate.py:473 -#, fuzzy msgid "always write a .license file instead of a header inside the file" -msgstr "zapsat soubor .license místo hlavičky uvnitř souboru" +msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" #: src/reuse/_annotate.py:480 -#, fuzzy msgid "write a .license file to files with unrecognised comment styles" -msgstr "přeskočit soubory s nerozpoznanými styly komentářů" +msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" #: src/reuse/_annotate.py:486 msgid "skip files with unrecognised comment styles" msgstr "přeskočit soubory s nerozpoznanými styly komentářů" #: src/reuse/_annotate.py:497 -#, fuzzy msgid "skip files that already contain REUSE information" -msgstr "přeskočit soubory, které již obsahují informace SPDX" +msgstr "přeskočit soubory, které již obsahují informace REUSE" #: src/reuse/_annotate.py:532 #, python-brace-format @@ -216,7 +209,7 @@ msgstr "povolit příkazy pro ladění" #: src/reuse/_main.py:80 msgid "hide deprecation warnings" -msgstr "" +msgstr "skrýt varování o zastarání" #: src/reuse/_main.py:85 msgid "do not skip over Git submodules" @@ -256,15 +249,21 @@ msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"Přidání autorských práv a licencí do záhlaví jednoho nebo více souborů.\n" +"\n" +"Pomocí parametrů --copyright a --license můžete určit, kteří držitelé " +"autorských práv a licencí mají být přidáni do záhlaví daných souborů.\n" +"\n" +"Pomocí parametru --contributor můžete určit osoby nebo subjekty, které " +"přispěly, ale nejsou držiteli autorských práv daných souborů." #: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" #: src/reuse/_main.py:142 -#, fuzzy msgid "Download a license and place it in the LICENSES/ directory." -msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" +msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." #: src/reuse/_main.py:151 msgid "list all non-compliant files" @@ -316,12 +315,12 @@ msgstr "seznam všech podporovaných licencí SPDX" #: src/reuse/_main.py:198 msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" +msgstr "Převeďte .reuse/dep5 do REUSE.toml" #: src/reuse/_main.py:263 -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{path}' could not be decoded as UTF-8." -msgstr ".reuse/dep5 nelze analyzovat jako utf-8" +msgstr "'{path}' se nepodařilo dekódovat jako UTF-8." #: src/reuse/_main.py:269 #, python-brace-format @@ -329,6 +328,8 @@ msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" +"'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové hlášení: " +"{message}" #: src/reuse/_util.py:369 src/reuse/global_licensing.py:218 #, python-brace-format @@ -383,9 +384,8 @@ msgstr "" "spdx.org/licenses/>." #: src/reuse/convert_dep5.py:118 -#, fuzzy msgid "no '.reuse/dep5' file" -msgstr "Vytvoření .reuse/dep5" +msgstr "žádný soubor '.reuse/dep5'" #: src/reuse/download.py:130 msgid "SPDX License Identifier of license" @@ -400,6 +400,8 @@ msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" +"zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " +"který soubor obsahuje, nebo samotný soubor" #: src/reuse/download.py:156 #, python-brace-format @@ -409,7 +411,7 @@ msgstr "Chyba: {spdx_identifier} již existuje." #: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." -msgstr "" +msgstr "Chyba: {path} neexistuje." #: src/reuse/download.py:166 msgid "Error: Failed to download license." @@ -440,7 +442,7 @@ msgstr "nelze použít --output s více než jednou licencí" #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." -msgstr "" +msgstr "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." #: src/reuse/global_licensing.py:122 #, python-brace-format @@ -448,22 +450,25 @@ msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" +"Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, která " +"je {item_class})." #: src/reuse/global_licensing.py:133 #, python-brace-format msgid "{attr_name} must not be empty." -msgstr "" +msgstr "{attr_name} nesmí být prázdný." #: src/reuse/global_licensing.py:156 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." -msgstr "" +msgstr "{name} musí být {type} (má {value}, která je {value_type})." #: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" +"Hodnota 'precedence' musí být jedna z {precedence_vals} (got {received})" #: src/reuse/header.py:99 msgid "generated comment is missing copyright lines or license expressions" @@ -473,19 +478,19 @@ msgstr "" #: src/reuse/lint.py:30 msgid "prevents output" -msgstr "" +msgstr "brání výstupu" #: src/reuse/lint.py:33 msgid "formats output as JSON" -msgstr "" +msgstr "formátuje výstup jako JSON" #: src/reuse/lint.py:39 msgid "formats output as plain text" -msgstr "" +msgstr "formátuje výstup jako prostý text" #: src/reuse/lint.py:45 msgid "formats output as errors per line" -msgstr "" +msgstr "formátuje výstup jako chyby na řádek" #: src/reuse/lint.py:64 msgid "BAD LICENSES" @@ -578,19 +583,16 @@ msgid "Used licenses:" msgstr "Použité licence:" #: src/reuse/lint.py:179 -#, fuzzy msgid "Read errors:" -msgstr "Chyby čtení: {count}" +msgstr "Chyby čtení:" #: src/reuse/lint.py:181 -#, fuzzy msgid "Files with copyright information:" -msgstr "Soubory s informacemi o autorských právech: {count} / {total}" +msgstr "Soubory s informacemi o autorských právech:" #: src/reuse/lint.py:185 -#, fuzzy msgid "Files with license information:" -msgstr "Soubory s licenčními informacemi: {count} / {total}" +msgstr "Soubory s licenčními informacemi:" #: src/reuse/lint.py:202 msgid "" From 1738708ffbcc3ac09f9dbab771415257c4bdbcef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Fri, 16 Aug 2024 14:04:59 +0000 Subject: [PATCH 007/156] Translated using Weblate (Czech) Currently translated at 100.0% (178 of 178 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 84 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/po/cs.po b/po/cs.po index 170db386e..8956ef7c2 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-08 08:43+0000\n" -"PO-Revision-Date: 2024-08-15 21:09+0000\n" +"PO-Revision-Date: 2024-08-17 00:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -608,58 +608,58 @@ msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-( #: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" -msgstr "" +msgstr "DOPORUČENÍ" #: src/reuse/lint.py:289 #, python-brace-format msgid "{path}: bad license {lic}\n" -msgstr "" +msgstr "{path}: špatná licence {lic}\n" #: src/reuse/lint.py:296 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: deprecated license\n" -msgstr "Zastaralé licence:" +msgstr "{lic_path}: zastaralá licence\n" #: src/reuse/lint.py:303 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: license without file extension\n" -msgstr "Licence bez přípony souboru:" +msgstr "{lic_path}: licence bez přípony souboru\n" #: src/reuse/lint.py:312 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: unused license\n" -msgstr "Nepoužité licence:" +msgstr "{lic_path}: nepoužitá licence\n" #: src/reuse/lint.py:319 #, python-brace-format msgid "{path}: missing license {lic}\n" -msgstr "" +msgstr "{path}: chybí licence {lic}\n" #: src/reuse/lint.py:326 #, python-brace-format msgid "{path}: read error\n" -msgstr "" +msgstr "{path}: chyba čtení\n" #: src/reuse/lint.py:330 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: no license identifier\n" -msgstr "'{}' není platný identifikátor licence SPDX." +msgstr "{path}: žádný identifikátor licence\n" #: src/reuse/lint.py:334 #, python-brace-format msgid "{path}: no copyright notice\n" -msgstr "" +msgstr "{path}: žádné upozornění na autorská práva\n" #: src/reuse/project.py:262 -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{path}' covered by {global_path}" -msgstr "'{path}' zahrnuto v .reuse/dep5" +msgstr "'{path}' zahrnuto v {global_path}" #: src/reuse/project.py:270 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." -msgstr "" +msgstr "'{path}' je zahrnuta výhradně v REUSE.toml. Nečte obsah souboru." #: src/reuse/project.py:277 #, python-brace-format @@ -667,12 +667,16 @@ msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" +"'{path}' byl rozpoznán jako binární soubor; v jeho obsahu nebyly hledány " +"informace o REUSE." #: src/reuse/project.py:334 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" +"'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor " +"REUSE.toml. Pro konverzi použijte `reuse convert-dep5`." #: src/reuse/project.py:348 #, python-brace-format @@ -680,6 +684,8 @@ msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" +"Nalezeno '{new_path}' i '{old_path}'. Oba soubory nelze uchovávat současně, " +"nejsou vzájemně kompatibilní." #: src/reuse/project.py:414 #, python-brace-format @@ -716,6 +722,8 @@ msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" +"projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný software " +"VCS" #: src/reuse/report.py:310 #, python-brace-format @@ -734,6 +742,11 @@ msgid "" "valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" +"Oprava špatných licencí: Alespoň jedna licence v adresáři LICENSES a/nebo " +"poskytnutá pomocí značek 'SPDX-License-Identifier' je neplatná. Nejsou to " +"platné identifikátory licencí SPDX nebo nezačínají znakem 'LicenseRef-'. " +"Často kladené otázky o vlastních licencích: https://reuse.software/faq/" +"#custom-license" #: src/reuse/report.py:449 msgid "" @@ -743,6 +756,10 @@ msgid "" "recommended new identifiers can be found here: " msgstr "" +"Oprava zastaralých licencí: Alespoň jedna z licencí v adresáři LICENSES a/" +"nebo poskytnutých pomocí tagu 'SPDX-License-Identifier' nebo v souboru '." +"reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " +"nové identifikátory naleznete zde: " #: src/reuse/report.py:460 msgid "" @@ -750,6 +767,9 @@ msgid "" "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" +"Oprava licencí bez přípony souboru: Nejméně jeden textový soubor licence v " +"adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím způsobem " +"přejmenujte." #: src/reuse/report.py:469 msgid "" @@ -759,6 +779,12 @@ msgid "" "simply run 'reuse download --all' to get any missing ones. For custom " "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" +"Oprava chybějících licencí: V adresáři 'LICENSES' není k dispozici " +"odpovídající textový soubor s licencí pro alespoň jeden z identifikátorů " +"licencí poskytovaných pomocí značek 'SPDX-License-Identifier'. Pro " +"identifikátory licencí SPDX můžete jednoduše spustit příkaz 'reuse download " +"--all' a získat všechny chybějící. Pro vlastní licence (začínající na " +"'LicenseRef-') musíte tyto soubory přidat sami." #: src/reuse/report.py:481 msgid "" @@ -768,6 +794,11 @@ msgid "" "delete the unused license text if you are sure that no file or code snippet " "is licensed as such." msgstr "" +"Oprava nepoužívaných licencí: Alespoň jeden z textových souborů licencí v " +"'LICENSES' není odkazován žádným souborem, např. značkou 'SPDX-License-" +"Identifier'. Ujistěte se, že jste odpovídajícím způsobem licencované soubory " +"buď správně označili, nebo nepoužitý licenční text odstranili, pokud jste si " +"jisti, že žádný soubor nebo kousek kódu není takto licencován." #: src/reuse/report.py:492 msgid "" @@ -775,6 +806,9 @@ msgid "" "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" +"Oprava chyb čtení: Nástroj nemůže přečíst alespoň jeden ze souborů v " +"adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v horní " +"části výstupu jako součást zaznamenaných chybových hlášení." #: src/reuse/report.py:501 msgid "" @@ -784,26 +818,36 @@ msgid "" "file. The tutorial explains additional ways to do this: " msgstr "" +"Oprava chybějících informací o autorských právech/licencích: U jednoho nebo " +"více souborů nemůže nástroj najít informace o autorských právech a/nebo " +"licenční informace. To obvykle provedete přidáním značek 'SPDX-" +"FileCopyrightText' a 'SPDX-License-Identifier' ke každému souboru. V návodu " +"jsou vysvětleny další způsoby, jak to provést: " #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" +"vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " +"zaručit, že pole bude přesné" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" -msgstr "" +msgstr "jméno osoby podepisující zprávu SPDX" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" -msgstr "" +msgstr "název organizace, která podepsala zprávu SPDX" #: src/reuse/spdx.py:60 msgid "" "error: --creator-person=NAME or --creator-organization=NAME required when --" "add-license-concluded is provided" msgstr "" +"chyba: --creator-person=NAME nebo --creator-organization=NAME je vyžadováno " +"při zadání parametru --add-licence-concluded" #: src/reuse/spdx.py:75 #, python-brace-format @@ -883,7 +927,7 @@ msgstr "poziční argumenty" #: /usr/lib/python3.10/argparse.py:1749 msgid "options" -msgstr "" +msgstr "možnosti" #: /usr/lib/python3.10/argparse.py:1764 msgid "show this help message and exit" From bfa327e1449b4918e35c741ca773f86ed096056c Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 22 Aug 2024 09:37:27 +0000 Subject: [PATCH 008/156] Update reuse.pot --- po/cs.po | 33 +++++++++++++++++---------------- po/de.po | 26 +++++++++++++------------- po/eo.po | 26 +++++++++++++------------- po/es.po | 26 +++++++++++++------------- po/fr.po | 26 +++++++++++++------------- po/gl.po | 26 +++++++++++++------------- po/it.po | 26 +++++++++++++------------- po/nl.po | 26 +++++++++++++------------- po/pt.po | 26 +++++++++++++------------- po/reuse.pot | 28 ++++++++++++++-------------- po/ru.po | 26 +++++++++++++------------- po/sv.po | 26 +++++++++++++------------- po/tr.po | 26 +++++++++++++------------- po/uk.po | 26 +++++++++++++------------- 14 files changed, 187 insertions(+), 186 deletions(-) diff --git a/po/cs.po b/po/cs.po index 8956ef7c2..b8d83b67d 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-08-17 00:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech for a list of valid SPDX License " "Identifiers." @@ -442,7 +442,8 @@ msgstr "nelze použít --output s více než jednou licencí" #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." -msgstr "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." +msgstr "" +"{attr_name} musí být {type_name} (mít {value}, který je {value_class})." #: src/reuse/global_licensing.py:122 #, python-brace-format @@ -675,8 +676,8 @@ msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -"'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor " -"REUSE.toml. Pro konverzi použijte `reuse convert-dep5`." +"'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor REUSE." +"toml. Pro konverzi použijte `reuse convert-dep5`." #: src/reuse/project.py:348 #, python-brace-format diff --git a/po/de.po b/po/de.po index 2ffbd9bce..264b5102c 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German for a list of valid SPDX License " "Identifiers." diff --git a/po/eo.po b/po/eo.po index 5afd79dba..c1f8d1ed7 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for a list of valid SPDX License " "Identifiers." diff --git a/po/es.po b/po/es.po index 910842269..467b0bb99 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-05-09 08:19+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish for a list of valid SPDX License " "Identifiers." diff --git a/po/fr.po b/po/fr.po index cf94be2c8..a3262d8ac 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French for a list of valid SPDX License " "Identifiers." diff --git a/po/gl.po b/po/gl.po index 8ba734e82..56c2b55ce 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for a list of valid SPDX License " "Identifiers." diff --git a/po/it.po b/po/it.po index af91844a9..6ddc32d84 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for a list of valid SPDX License " "Identifiers." diff --git a/po/nl.po b/po/nl.po index 05883dd94..413b196d3 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for a list of valid SPDX License " "Identifiers." diff --git a/po/pt.po b/po/pt.po index 2ed509001..3b2286656 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese for a list of valid SPDX License " "Identifiers." diff --git a/po/reuse.pot b/po/reuse.pot index 27e849462..0a4e2fd6b 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -90,7 +90,7 @@ msgstr "" msgid "template {template} could not be found" msgstr "" -#: src/reuse/_annotate.py:341 src/reuse/_util.py:574 +#: src/reuse/_annotate.py:341 src/reuse/_util.py:581 msgid "can't write to '{}'" msgstr "" @@ -301,50 +301,50 @@ msgid "" "{message}" msgstr "" -#: src/reuse/_util.py:369 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" -#: src/reuse/_util.py:425 +#: src/reuse/_util.py:432 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:557 +#: src/reuse/_util.py:564 msgid "'{}' is not a file" msgstr "" -#: src/reuse/_util.py:560 +#: src/reuse/_util.py:567 msgid "'{}' is not a directory" msgstr "" -#: src/reuse/_util.py:563 +#: src/reuse/_util.py:570 msgid "can't open '{}'" msgstr "" -#: src/reuse/_util.py:568 +#: src/reuse/_util.py:575 msgid "can't write to directory '{}'" msgstr "" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:594 msgid "can't read or write '{}'" msgstr "" -#: src/reuse/_util.py:597 +#: src/reuse/_util.py:604 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "" -#: src/reuse/_util.py:625 +#: src/reuse/_util.py:632 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:639 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:646 msgid "" "See for a list of valid SPDX License " "Identifiers." diff --git a/po/ru.po b/po/ru.po index c27ce3cb8..feb14e65a 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-05-25 05:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian for a list of valid SPDX License " "Identifiers." diff --git a/po/sv.po b/po/sv.po index 8da3c6bb8..8acf274d2 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-01-08 20:06+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish for a list of valid SPDX License " "Identifiers." diff --git a/po/tr.po b/po/tr.po index 5b3781b4d..0ade67ed9 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for a list of valid SPDX License " "Identifiers." diff --git a/po/uk.po b/po/uk.po index c9e5896dd..7342e0c34 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-08 08:43+0000\n" +"POT-Creation-Date: 2024-08-22 09:37+0000\n" "PO-Revision-Date: 2024-07-02 21:10+0000\n" "Last-Translator: Hotripak \n" "Language-Team: Ukrainian for a list of valid SPDX License " "Identifiers." From 23d99d76d2f9686aaa9e6cfb8c040e1d3960b176 Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Sat, 24 Aug 2024 05:43:40 +0000 Subject: [PATCH 009/156] Translated using Weblate (Russian) Currently translated at 100.0% (178 of 178 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/ru/ --- po/ru.po | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/po/ru.po b/po/ru.po index feb14e65a..d083a16c3 100644 --- a/po/ru.po +++ b/po/ru.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-08-22 09:37+0000\n" -"PO-Revision-Date: 2024-05-25 05:09+0000\n" +"PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7.1-dev\n" #: src/reuse/_annotate.py:74 #, python-brace-format @@ -121,9 +121,8 @@ msgid "comment style to use, optional" msgstr "стиль комментария, который следует использовать, необязательно" #: src/reuse/_annotate.py:417 -#, fuzzy msgid "copyright prefix to use, optional" -msgstr "стиль авторского права, который будет использоваться, необязательно" +msgstr "используемый префикс авторского права, необязательно" #: src/reuse/_annotate.py:430 msgid "name of template to use, optional" @@ -507,9 +506,8 @@ msgid "formats output as plain text" msgstr "Форматирует вывод в виде обычного текста" #: src/reuse/lint.py:45 -#, fuzzy msgid "formats output as errors per line" -msgstr "Форматирует вывод в виде обычного текста" +msgstr "Форматирует вывод в виде ошибок на строку" #: src/reuse/lint.py:64 msgid "BAD LICENSES" @@ -632,42 +630,42 @@ msgstr "РЕКОМЕНДАЦИИ" #: src/reuse/lint.py:289 #, python-brace-format msgid "{path}: bad license {lic}\n" -msgstr "" +msgstr "{path}: плохая лицензия {lic}\n" #: src/reuse/lint.py:296 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: deprecated license\n" -msgstr "Утраченные лицензии:" +msgstr "{lic_path}: устаревшая лицензия\n" #: src/reuse/lint.py:303 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: license without file extension\n" -msgstr "Лицензии без расширения файла:" +msgstr "{lic_path}: лицензия без расширения файла\n" #: src/reuse/lint.py:312 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{lic_path}: unused license\n" -msgstr "Неиспользованные лицензии:" +msgstr "{lic_path}: неиспользуемая лицензия\n" #: src/reuse/lint.py:319 #, python-brace-format msgid "{path}: missing license {lic}\n" -msgstr "" +msgstr "{path}: отсутствует лицензия {lic}\n" #: src/reuse/lint.py:326 #, python-brace-format msgid "{path}: read error\n" -msgstr "" +msgstr "{path}: ошибка чтения\n" #: src/reuse/lint.py:330 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: no license identifier\n" -msgstr "'{}' не является действительным идентификатором лицензии SPDX." +msgstr "{path}: нет идентификатора лицензии\n" #: src/reuse/lint.py:334 #, python-brace-format msgid "{path}: no copyright notice\n" -msgstr "" +msgstr "{path}: нет уведомления об авторских правах\n" #: src/reuse/project.py:262 #, python-brace-format From 6f3ce11a7933dd21cec341e7d752eb49929a09e0 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 30 Aug 2024 20:12:33 +0000 Subject: [PATCH 010/156] Translated using Weblate (Ukrainian) Currently translated at 100.0% (178 of 178 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/uk/ --- po/uk.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/po/uk.po b/po/uk.po index 7342e0c34..51704e927 100644 --- a/po/uk.po +++ b/po/uk.po @@ -9,17 +9,17 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-08-22 09:37+0000\n" -"PO-Revision-Date: 2024-07-02 21:10+0000\n" -"Last-Translator: Hotripak \n" -"Language-Team: Ukrainian \n" +"PO-Revision-Date: 2024-08-31 21:09+0000\n" +"Last-Translator: Ihor Hordiichuk \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: src/reuse/_annotate.py:74 #, python-brace-format @@ -267,7 +267,7 @@ msgstr "завантажити ліцензію та розмістити її #: src/reuse/_main.py:142 msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Завантажте ліцензію та помістіть її в папку LICENSES/." +msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." #: src/reuse/_main.py:151 msgid "list all non-compliant files" @@ -332,8 +332,8 @@ msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -"'{path}' не вдалося розібрати. Ми отримали наступне повідомлення про " -"помилку: {message}" +"'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " +"{message}" #: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 #, python-brace-format @@ -455,7 +455,7 @@ msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -"Елемент у колекції {attr_name} має бути {type_name} (отримав {item_value}, " +"Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " "що є {item_class})." #: src/reuse/global_licensing.py:133 @@ -617,7 +617,7 @@ msgstr "РЕКОМЕНДАЦІЇ" #: src/reuse/lint.py:289 #, python-brace-format msgid "{path}: bad license {lic}\n" -msgstr "{path}: bad license {lic}\n" +msgstr "{path}: погана ліцензія {lic}\n" #: src/reuse/lint.py:296 #, python-brace-format @@ -637,7 +637,7 @@ msgstr "{lic_path}: невикористана ліцензія\n" #: src/reuse/lint.py:319 #, python-brace-format msgid "{path}: missing license {lic}\n" -msgstr "{path}: зникла ліцензія {lic}\n" +msgstr "{path}: пропущена ліцензія {lic}\n" #: src/reuse/lint.py:326 #, python-brace-format From 9e7c627fc1da8eb2b62dac683e174311e8a0a9c5 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 2 Sep 2024 08:25:02 +0000 Subject: [PATCH 011/156] Translated using Weblate (Ukrainian) Currently translated at 100.0% (178 of 178 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/uk/ --- po/uk.po | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/po/uk.po b/po/uk.po index 51704e927..0681f4fe9 100644 --- a/po/uk.po +++ b/po/uk.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-08-22 09:37+0000\n" -"PO-Revision-Date: 2024-08-31 21:09+0000\n" +"PO-Revision-Date: 2024-09-03 09:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -95,9 +95,8 @@ msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" msgstr "" -"Наступні файли не мають розпізнаного файлового розширення. Будь ласка, " -"використовуйте --style, --force-dot-license, --fallback-dot-license або --" -"skip-unrecognised:" +"Ці файли не мають розпізнаного файлового розширення. Використовуйте --style, " +"--force-dot-license, --fallback-dot-license або --skip-unrecognised:" #: src/reuse/_annotate.py:382 msgid "copyright statement, repeatable" @@ -663,7 +662,7 @@ msgstr "'{path}' покрито за рахунок {global_path}" #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." -msgstr "'{path}' покрито виключно файлом REUSE.toml. Не читаючи вміст файлу." +msgstr "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." #: src/reuse/project.py:277 #, python-brace-format From c5fa54a5b1e592c1bb742db8336bc01ee3440bb5 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 5 Sep 2024 16:11:48 +0200 Subject: [PATCH 012/156] Override LANGUAGE when running tests Apparently LANGUAGE has precedence over LC_ALL. By setting it to an empty string, LC_ALL takes precedence again, and we forcefully use the English translations. Signed-off-by: Carmen Bianca BAKKER --- tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/conftest.py b/tests/conftest.py index d9b145922..d7f2f6a2c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,6 +28,7 @@ from jinja2 import Environment os.environ["LC_ALL"] = "C" +os.environ["LANGUAGE"] = "" # A trick that tries to import the installed version of reuse. If that doesn't # work, import from the src directory. If that also doesn't work (for some From 222be97e33d070730ab380175fcbf378451a76ca Mon Sep 17 00:00:00 2001 From: klmcadams <58492561+klmcadams@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:20:28 -0400 Subject: [PATCH 013/156] lint specific file(s) --- .pre-commit-hooks.yaml | 2 +- src/reuse/_main.py | 9 +++++++ src/reuse/lint_file.py | 61 ++++++++++++++++++++++++++++++++++++++++++ src/reuse/project.py | 34 +++++++++++++++++++++++ src/reuse/report.py | 12 +++++++-- 5 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 src/reuse/lint_file.py diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 2dd0cccb6..d18780413 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -5,7 +5,7 @@ - id: reuse name: reuse entry: reuse - args: ["lint"] + args: ["lint", "lint-file"] language: python pass_filenames: false description: diff --git a/src/reuse/_main.py b/src/reuse/_main.py index fec1f7318..7c69129f9 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -23,6 +23,7 @@ convert_dep5, download, lint, + lint_file, spdx, supported_licenses, ) @@ -173,6 +174,14 @@ def parser() -> argparse.ArgumentParser: ), ) + add_command( + subparsers, + "lint-file", + lint_file.add_arguments, + lint_file.run, + help=_("list non-compliant files from specified list of files"), + ) + add_command( subparsers, "spdx", diff --git a/src/reuse/lint_file.py b/src/reuse/lint_file.py new file mode 100644 index 000000000..ce63f4181 --- /dev/null +++ b/src/reuse/lint_file.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: 2024 Kerry McAdams +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Linting specific files happens here. The linting here is nothing more than +reading the reports and printing some conclusions. +""" + +import sys +from argparse import ArgumentParser, Namespace +from gettext import gettext as _ +from typing import IO + +from .lint import format_json, format_lines, format_plain +from .project import Project +from .report import ProjectReport + + +def add_arguments(parser: ArgumentParser) -> None: + """Add arguments to parser.""" + mutex_group = parser.add_mutually_exclusive_group() + mutex_group.add_argument( + "-q", "--quiet", action="store_true", help=_("prevents output") + ) + mutex_group.add_argument( + "-j", "--json", action="store_true", help=_("formats output as JSON") + ) + mutex_group.add_argument( + "-p", + "--plain", + action="store_true", + help=_("formats output as plain text"), + ) + mutex_group.add_argument( + "-l", + "--lines", + action="store_true", + help=_("formats output as errors per line"), + ) + parser.add_argument("files", nargs="*") + + +def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: + """List all non-compliant files from specified file list.""" + report = ProjectReport.generate( + project, + do_checksum=False, + file_list=args.files, + multiprocessing=not args.no_multiprocessing, + ) + + if args.quiet: + pass + elif args.json: + out.write(format_json(report)) + elif args.lines: + out.write(format_lines(report)) + else: + out.write(format_plain(report)) + + return 0 if report.is_compliant else 1 diff --git a/src/reuse/project.py b/src/reuse/project.py index 9fc8b48de..a793c2867 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -157,6 +157,40 @@ def from_directory( return project + def specific_files( + self, files: Optional[List], directory: Optional[StrPath] = None + ) -> Iterator[Path]: + """Yield all files in the specified file list within a directory. + + The files that are not yielded are: + + - Files ignored by VCS (e.g., see .gitignore) + + - Files matching IGNORE_*_PATTERNS. + """ + if directory is None: + directory = self.root + directory = Path(directory) + + # Filter files. + for file_ in files: + the_file = directory / file_ + if self._is_path_ignored(the_file): + _LOGGER.debug("ignoring '%s'", the_file) + continue + if the_file.is_symlink(): + _LOGGER.debug("skipping symlink '%s'", the_file) + continue + # Suppressing this error because I simply don't want to deal + # with that here. + with contextlib.suppress(OSError): + if the_file.stat().st_size == 0: + _LOGGER.debug("skipping 0-sized file '%s'", the_file) + continue + + _LOGGER.debug("yielding '%s'", the_file) + yield the_file + def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: """Yield all files in *directory* and its subdirectories. diff --git a/src/reuse/report.py b/src/reuse/report.py index 4c7eec314..71b86ee00 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -103,7 +103,7 @@ class _MultiprocessingResult(NamedTuple): class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" - def __init__(self, do_checksum: bool = True): + def __init__(self, do_checksum: bool = True, file_list: list = list[Any]): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} @@ -114,6 +114,7 @@ def __init__(self, do_checksum: bool = True): self.licenses_without_extension: Dict[str, Path] = {} self.do_checksum = do_checksum + self.file_list = file_list self._unused_licenses: Optional[Set[str]] = None self._used_licenses: Optional[Set[str]] = None @@ -276,6 +277,7 @@ def generate( cls, project: Project, do_checksum: bool = True, + file_list: list = list[Any], multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, ) -> "ProjectReport": @@ -298,7 +300,13 @@ def generate( ) pool.join() else: - results = map(container, project.all_files()) + # Search specific file list if files are provided with + # `reuse lint-file`. Otherwise, lint all files + results = ( + map(container, project.specific_files(file_list)) + if file_list + else map(container, project.all_files()) + ) for result in results: if result.error: From d6aca8568aeddf74a696ece06567eb232cbed1cb Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Thu, 1 Aug 2024 11:53:10 +0200 Subject: [PATCH 014/156] fix: Methods signature --- src/reuse/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/reuse/report.py b/src/reuse/report.py index 71b86ee00..f1a06c508 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -103,7 +103,7 @@ class _MultiprocessingResult(NamedTuple): class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" - def __init__(self, do_checksum: bool = True, file_list: list = list[Any]): + def __init__(self, do_checksum: bool = True, file_list: list[Any] = None): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} @@ -277,7 +277,7 @@ def generate( cls, project: Project, do_checksum: bool = True, - file_list: list = list[Any], + file_list: list[Any] = None, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, ) -> "ProjectReport": From d5e4b8e9b4ed0b567c246fc6523f50ce660b40a1 Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Thu, 1 Aug 2024 11:54:31 +0200 Subject: [PATCH 015/156] refactor: Iterating over files --- src/reuse/report.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/reuse/report.py b/src/reuse/report.py index f1a06c508..a05096c4a 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -293,20 +293,17 @@ def generate( project, do_checksum, add_license_concluded ) + # Iterate over specific file list if files are provided with + # `reuse lint-file`. Otherwise, lint all files. + iter_files = project.specific_files(file_list) if file_list else project.all_files() if multiprocessing: with mp.Pool() as pool: results: Iterable[_MultiprocessingResult] = pool.map( - container, project.all_files() + container, iter_files ) pool.join() else: - # Search specific file list if files are provided with - # `reuse lint-file`. Otherwise, lint all files - results = ( - map(container, project.specific_files(file_list)) - if file_list - else map(container, project.all_files()) - ) + results = (map(container, iter_files)) for result in results: if result.error: From 39f0f52ea267186f2839bf16664b9e05a41bd1de Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Thu, 1 Aug 2024 12:19:14 +0200 Subject: [PATCH 016/156] fix: Methods signature --- src/reuse/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/reuse/report.py b/src/reuse/report.py index a05096c4a..8edfe30ca 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -103,7 +103,7 @@ class _MultiprocessingResult(NamedTuple): class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" - def __init__(self, do_checksum: bool = True, file_list: list[Any] = None): + def __init__(self, do_checksum: bool = True, file_list: Optional[List[str]] = None): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} @@ -277,7 +277,7 @@ def generate( cls, project: Project, do_checksum: bool = True, - file_list: list[Any] = None, + file_list: Optional[List[str]] = None, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, ) -> "ProjectReport": From 701fafb9cbcbfd5d50ffe2659214f72faaede2c8 Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Thu, 1 Aug 2024 12:32:21 +0200 Subject: [PATCH 017/156] tests: Check lint-file subcommand --- tests/test_lint.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_lint.py b/tests/test_lint.py index 6ca93f9fd..131e1a0d4 100644 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -270,5 +270,18 @@ def test_lint_lines_read_errors(fake_repository): assert "restricted.py" in result assert "read error" in result +def test_lint_specific_files(fake_repository): + """Check lint-file subcommand.""" + (fake_repository / "foo.py").write_text("foo") + (fake_repository / "bar.py").write_text("bar") + + project = Project.from_directory(fake_repository) + report = ProjectReport.generate(project, file_list=["foo.py"]) + result = format_plain(report) + + assert ":-(" in result + assert "# UNUSED LICENSES" in result + assert "bar.py" not in result + # REUSE-IgnoreEnd From 7f86cc8c556ae243d81691528d6e4ef6aee936a9 Mon Sep 17 00:00:00 2001 From: klmcadams <58492561+klmcadams@users.noreply.github.com> Date: Thu, 1 Aug 2024 15:44:26 -0400 Subject: [PATCH 018/156] add copyright lines & adjust code to work with pre-commit --- src/reuse/_main.py | 1 + src/reuse/project.py | 34 ++++++++++++++++++---------------- src/reuse/report.py | 14 +++++++++++--- tests/test_lint.py | 5 +++-- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/reuse/_main.py b/src/reuse/_main.py index 7c69129f9..0327d85eb 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -2,6 +2,7 @@ # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# SPDX-FileCopyrightText: 2024 Kerry McAdams # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/reuse/project.py b/src/reuse/project.py index a793c2867..d1e5d6870 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -3,6 +3,7 @@ # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # SPDX-FileCopyrightText: 2023 Matthias Riße # SPDX-FileCopyrightText: 2023 DB Systel GmbH +# SPDX-FileCopyrightText: 2024 Kerry McAdams # # SPDX-License-Identifier: GPL-3.0-or-later @@ -172,24 +173,25 @@ def specific_files( directory = self.root directory = Path(directory) - # Filter files. - for file_ in files: - the_file = directory / file_ - if self._is_path_ignored(the_file): - _LOGGER.debug("ignoring '%s'", the_file) - continue - if the_file.is_symlink(): - _LOGGER.debug("skipping symlink '%s'", the_file) - continue - # Suppressing this error because I simply don't want to deal - # with that here. - with contextlib.suppress(OSError): - if the_file.stat().st_size == 0: - _LOGGER.debug("skipping 0-sized file '%s'", the_file) + if files is not None: + # Filter files. + for file_ in files: + the_file = directory / file_ + if self._is_path_ignored(the_file): + _LOGGER.debug("ignoring '%s'", the_file) + continue + if the_file.is_symlink(): + _LOGGER.debug("skipping symlink '%s'", the_file) continue + # Suppressing this error because I simply don't want to deal + # with that here. + with contextlib.suppress(OSError): + if the_file.stat().st_size == 0: + _LOGGER.debug("skipping 0-sized file '%s'", the_file) + continue - _LOGGER.debug("yielding '%s'", the_file) - yield the_file + _LOGGER.debug("yielding '%s'", the_file) + yield the_file def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: """Yield all files in *directory* and its subdirectories. diff --git a/src/reuse/report.py b/src/reuse/report.py index 8edfe30ca..8a93457a9 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -3,6 +3,8 @@ # SPDX-FileCopyrightText: 2022 Pietro Albini # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Sebastien Morais # # SPDX-License-Identifier: GPL-3.0-or-later @@ -103,7 +105,9 @@ class _MultiprocessingResult(NamedTuple): class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" - def __init__(self, do_checksum: bool = True, file_list: Optional[List[str]] = None): + def __init__( + self, do_checksum: bool = True, file_list: Optional[List[str]] = None + ): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} @@ -295,7 +299,11 @@ def generate( # Iterate over specific file list if files are provided with # `reuse lint-file`. Otherwise, lint all files. - iter_files = project.specific_files(file_list) if file_list else project.all_files() + iter_files = ( + project.specific_files(file_list) + if file_list + else project.all_files() + ) if multiprocessing: with mp.Pool() as pool: results: Iterable[_MultiprocessingResult] = pool.map( @@ -303,7 +311,7 @@ def generate( ) pool.join() else: - results = (map(container, iter_files)) + results = map(container, iter_files) for result in results: if result.error: diff --git a/tests/test_lint.py b/tests/test_lint.py index 131e1a0d4..d9b353d65 100644 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -1,6 +1,6 @@ -# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2024 Nico Rikken +# SPDX-FileCopyrightText: 2024 Sebastien Morais # # SPDX-License-Identifier: GPL-3.0-or-later @@ -270,11 +270,12 @@ def test_lint_lines_read_errors(fake_repository): assert "restricted.py" in result assert "read error" in result + def test_lint_specific_files(fake_repository): """Check lint-file subcommand.""" (fake_repository / "foo.py").write_text("foo") (fake_repository / "bar.py").write_text("bar") - + project = Project.from_directory(fake_repository) report = ProjectReport.generate(project, file_list=["foo.py"]) result = format_plain(report) From 1862aacb6b35a4f5ce7fd134dcfdc298da122fcc Mon Sep 17 00:00:00 2001 From: klmcadams <58492561+klmcadams@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:32:30 -0400 Subject: [PATCH 019/156] updated contact info & added files for PR --- AUTHORS.rst | 2 + changelog.d/added/lint-file.md | 1 + docs/man/reuse-lint-file.rst | 105 +++++++++++++++++++++++++++++++++ src/reuse/_main.py | 2 +- src/reuse/lint_file.py | 2 +- src/reuse/project.py | 2 +- src/reuse/report.py | 4 +- tests/test_lint.py | 4 +- 8 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 changelog.d/added/lint-file.md create mode 100644 docs/man/reuse-lint-file.rst diff --git a/AUTHORS.rst b/AUTHORS.rst index 1a40a48b9..7b46b5762 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -120,6 +120,7 @@ Contributors - Jon Burdo - Josef Andersson - José Vieira +- Kerry McAdams - Kevin Meagher <11620178+kjmeagher@users.noreply.github.com> - Lars Francke - Libor Pechacek @@ -139,6 +140,7 @@ Contributors - Romain Tartière - Ryan Schmidt - Sebastian Crane +- Sebastien Morais - T. E. Kalaycı - Vishesh Handa - Vlad-Stefan Harbuz diff --git a/changelog.d/added/lint-file.md b/changelog.d/added/lint-file.md new file mode 100644 index 000000000..a349d03c8 --- /dev/null +++ b/changelog.d/added/lint-file.md @@ -0,0 +1 @@ +- Add lint-file subcommand to enable running lint on specific files. diff --git a/docs/man/reuse-lint-file.rst b/docs/man/reuse-lint-file.rst new file mode 100644 index 000000000..f6030c646 --- /dev/null +++ b/docs/man/reuse-lint-file.rst @@ -0,0 +1,105 @@ +.. + SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. + SPDX-FileCopyrightText: © 2020 Liferay, Inc. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-lint-file +================ + +Synopsis +-------- + +**reuse lint-file** [*options*] + +Description +----------- + +:program:`reuse-lint-file` verifies whether a file in a project is compliant with the REUSE +Specification located at ``_. + +Criteria +-------- + +These are the criteria that the linter checks against. + +Bad licenses +~~~~~~~~~~~~ + +Licenses that are found in ``LICENSES/`` that are not found in the SPDX License +List or do not start with ``LicenseRef-`` are bad licenses. + +Deprecated licenses +~~~~~~~~~~~~~~~~~~~ + +Licenses whose SPDX License Identifier has been deprecated by SPDX. + +Licenses without file extension +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +These are licenses whose file names are a valid SPDX License Identifier, but +which do not have a file extension. + +Missing licenses +~~~~~~~~~~~~~~~~ + +A license which is referred to in a comment header, but which is not found in +the ``LICENSES/`` directory. + +Unused licenses +~~~~~~~~~~~~~~~ + +A license found in the ``LICENSES/`` directory, but which is not referred to in +any comment header. + +Read errors +~~~~~~~~~~~ + +Not technically a criterion, but files that cannot be read by the operating +system are read errors, and need to be fixed. + +Files without copyright and license information +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Every file needs to have copyright and licensing information associated with it. +The REUSE Specification details several ways of doing it. By and large, these +are the methods: + +- Placing tags in the header of the file. +- Placing tags in a ``.license`` file adjacent to the file. +- Putting the information in the ``REUSE.toml`` file. +- Putting the information in the ``.reuse/dep5`` file. (Deprecated) + +If a file is found that does not have copyright and/or license information +associated with it, then the project is not compliant. + +Options +------- + +.. option:: + + File(s) that are linted. For example, ``reuse lint-file src/reuse/lint_file.py src/reuse/download.py``. + +.. option:: -q, --quiet + + Do not print anything to STDOUT. + +.. + TODO: specify the JSON output. + +.. option:: -j, --json + + Output the results of the lint as JSON. + +.. option:: -p, --plain + + Output the results of the lint as descriptive text. The text is valid + Markdown. + +.. option:: -l, --lines + + Output one line per error, prefixed by the file path. + +.. option:: -h, --help + + Display help and exit. diff --git a/src/reuse/_main.py b/src/reuse/_main.py index 0327d85eb..6e52b474d 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -2,7 +2,7 @@ # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Kerry McAdams # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/reuse/lint_file.py b/src/reuse/lint_file.py index ce63f4181..003076972 100644 --- a/src/reuse/lint_file.py +++ b/src/reuse/lint_file.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Kerry McAdams # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/reuse/project.py b/src/reuse/project.py index d1e5d6870..a002320ad 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -3,7 +3,7 @@ # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # SPDX-FileCopyrightText: 2023 Matthias Riße # SPDX-FileCopyrightText: 2023 DB Systel GmbH -# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Kerry McAdams # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/reuse/report.py b/src/reuse/report.py index 8a93457a9..7c6288f89 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -3,8 +3,8 @@ # SPDX-FileCopyrightText: 2022 Pietro Albini # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER -# SPDX-FileCopyrightText: 2024 Kerry McAdams -# SPDX-FileCopyrightText: 2024 Sebastien Morais +# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Sebastien Morais # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/tests/test_lint.py b/tests/test_lint.py index d9b353d65..1b89084ff 100644 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -1,10 +1,10 @@ # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2024 Nico Rikken -# SPDX-FileCopyrightText: 2024 Sebastien Morais +# SPDX-FileCopyrightText: 2024 Sebastien Morais # # SPDX-License-Identifier: GPL-3.0-or-later -"""All tests for reuse.lint""" +"""All tests for reuse.lint and reuse.lint_files""" import re import shutil From fbef82d5d3d18f1f82e598fd6b7ba6e6ca480420 Mon Sep 17 00:00:00 2001 From: klmcadams <58492561+klmcadams@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:42:52 -0400 Subject: [PATCH 020/156] fix pylint failure --- src/reuse/report.py | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/reuse/report.py b/src/reuse/report.py index 7c6288f89..364408478 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -277,22 +277,15 @@ def bill_of_materials( return out.getvalue() @classmethod - def generate( + def get_lint_results( cls, project: Project, do_checksum: bool = True, file_list: Optional[List[str]] = None, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, - ) -> "ProjectReport": - """Generate a ProjectReport from a Project.""" - project_report = cls(do_checksum=do_checksum) - project_report.path = project.root - project_report.licenses = project.licenses - project_report.licenses_without_extension = ( - project.licenses_without_extension - ) - + ) -> list | Iterable[_MultiprocessingResult]: + """Get lint results based on multiprocessing and file_list.""" container = _MultiprocessingContainer( project, do_checksum, add_license_concluded ) @@ -313,6 +306,33 @@ def generate( else: results = map(container, iter_files) + return results + + @classmethod + def generate( + cls, + project: Project, + do_checksum: bool = True, + file_list: Optional[List[str]] = None, + multiprocessing: bool = cpu_count() > 1, # type: ignore + add_license_concluded: bool = False, + ) -> "ProjectReport": + """Generate a ProjectReport from a Project.""" + project_report = cls(do_checksum=do_checksum) + project_report.path = project.root + project_report.licenses = project.licenses + project_report.licenses_without_extension = ( + project.licenses_without_extension + ) + + results = cls.get_lint_results( + project, + do_checksum, + file_list, + multiprocessing, # type: ignore + add_license_concluded, + ) + for result in results: if result.error: # Facilitate better debugging by being able to quit the program. @@ -333,6 +353,7 @@ def generate( ) project_report.read_errors.add(Path(result.path)) continue + file_report = cast(FileReport, result.report) # File report. From d36748fb2abcc2bfb49c3cac74484f8e2f793486 Mon Sep 17 00:00:00 2001 From: klmcadams <58492561+klmcadams@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:49:31 -0400 Subject: [PATCH 021/156] use Union instead of pipe for multiple return types --- src/reuse/report.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/reuse/report.py b/src/reuse/report.py index 364408478..508eb51ce 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -21,7 +21,17 @@ from io import StringIO from os import cpu_count from pathlib import Path, PurePath -from typing import Any, Dict, Iterable, List, NamedTuple, Optional, Set, cast +from typing import ( + Any, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Set, + Union, + cast, +) from uuid import uuid4 from . import __REUSE_version__, __version__ @@ -284,7 +294,7 @@ def get_lint_results( file_list: Optional[List[str]] = None, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, - ) -> list | Iterable[_MultiprocessingResult]: + ) -> Union[list, Iterable[_MultiprocessingResult]]: """Get lint results based on multiprocessing and file_list.""" container = _MultiprocessingContainer( project, do_checksum, add_license_concluded From 5bba598c2cc13e0c10bbcb9f02d163ce2c865be2 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 14:10:07 +0200 Subject: [PATCH 022/156] Move ProjectReport.generate tests into class Signed-off-by: Carmen Bianca BAKKER --- tests/test_report.py | 359 ++++++++++++++++++++++--------------------- 1 file changed, 184 insertions(+), 175 deletions(-) diff --git a/tests/test_report.py b/tests/test_report.py index 084d591e0..b1c01ed32 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -260,213 +260,222 @@ def test_generate_file_report_to_dict_lint_source_information( assert expression["value"] == "MIT OR 0BSD" -def test_generate_project_report_simple(fake_repository, multiprocessing): - """Simple generate test, just to see if it sort of works.""" - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) - - assert not result.bad_licenses - assert not result.licenses_without_extension - assert not result.missing_licenses - assert not result.unused_licenses - assert result.used_licenses - assert not result.read_errors - assert result.file_reports - - -def test_generate_project_report_licenses_without_extension( - fake_repository, multiprocessing -): - """Licenses without extension are detected.""" - (fake_repository / "LICENSES/CC0-1.0.txt").rename( - fake_repository / "LICENSES/CC0-1.0" - ) - - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) - - assert "CC0-1.0" in result.licenses_without_extension - - -def test_generate_project_report_missing_license( - fake_repository, multiprocessing -): - """Missing licenses are detected.""" - (fake_repository / "LICENSES/GPL-3.0-or-later.txt").unlink() - - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) - - assert "GPL-3.0-or-later" in result.missing_licenses - assert not result.bad_licenses - - -def test_generate_project_report_bad_license(fake_repository, multiprocessing): - """Bad licenses are detected.""" - (fake_repository / "LICENSES/bad.txt").write_text("foo") - - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) - - assert result.bad_licenses - assert not result.missing_licenses - - -def test_generate_project_report_unused_license( - fake_repository, multiprocessing -): - """Unused licenses are detected.""" - (fake_repository / "LICENSES/MIT.txt").write_text("foo") - - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) - - assert result.unused_licenses == {"MIT"} - +class TestGenerateProjectReport: + """Tests for ProjectReport.generate.""" + + def test_simple(self, fake_repository, multiprocessing): + """Simple generate test, just to see if it sort of works.""" + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) -def test_generate_project_report_unused_license_plus( - fake_repository, multiprocessing -): - """Apache-1.0+ is not an unused license if LICENSES/Apache-1.0.txt - exists. + assert not result.bad_licenses + assert not result.licenses_without_extension + assert not result.missing_licenses + assert not result.unused_licenses + assert result.used_licenses + assert not result.read_errors + assert result.file_reports + + def test__licenses_without_extension( + self, fake_repository, multiprocessing + ): + """Licenses without extension are detected.""" + (fake_repository / "LICENSES/CC0-1.0.txt").rename( + fake_repository / "LICENSES/CC0-1.0" + ) - Furthermore, Apache-1.0+ is separately identified as a used license. - """ - (fake_repository / "foo.py").write_text( - "SPDX-License-Identifier: Apache-1.0+" - ) - (fake_repository / "bar.py").write_text( - "SPDX-License-Identifier: Apache-1.0" - ) - (fake_repository / "LICENSES/Apache-1.0.txt").touch() + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + assert "CC0-1.0" in result.licenses_without_extension - assert not result.unused_licenses - assert {"Apache-1.0", "Apache-1.0+"}.issubset(result.used_licenses) + def test_missing_license(self, fake_repository, multiprocessing): + """Missing licenses are detected.""" + (fake_repository / "LICENSES/GPL-3.0-or-later.txt").unlink() + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) -def test_generate_project_report_unused_license_plus_only_plus( - fake_repository, multiprocessing -): - """If Apache-1.0+ is the only declared license in the project, - LICENSES/Apache-1.0.txt should not be an unused license. - """ - (fake_repository / "foo.py").write_text( - "SPDX-License-Identifier: Apache-1.0+" - ) - (fake_repository / "LICENSES/Apache-1.0.txt").touch() + assert "GPL-3.0-or-later" in result.missing_licenses + assert not result.bad_licenses - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + def test_bad_license(self, fake_repository, multiprocessing): + """Bad licenses are detected.""" + (fake_repository / "LICENSES/bad.txt").write_text("foo") - assert not result.unused_licenses - assert "Apache-1.0+" in result.used_licenses - assert "Apache-1.0" not in result.used_licenses + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) + assert result.bad_licenses + assert not result.missing_licenses -def test_generate_project_report_bad_license_in_file( - fake_repository, multiprocessing -): - """Bad licenses in files are detected.""" - (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") + def test_unused_license(self, fake_repository, multiprocessing): + """Unused licenses are detected.""" + (fake_repository / "LICENSES/MIT.txt").write_text("foo") - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) - assert "bad" in result.bad_licenses + assert result.unused_licenses == {"MIT"} + def test_unused_license_plus(self, fake_repository, multiprocessing): + """Apache-1.0+ is not an unused license if LICENSES/Apache-1.0.txt + exists. -def test_generate_project_report_bad_license_can_also_be_missing( - fake_repository, multiprocessing -): - """Bad licenses can also be missing licenses.""" - (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") + Furthermore, Apache-1.0+ is separately identified as a used license. + """ + (fake_repository / "foo.py").write_text( + "SPDX-License-Identifier: Apache-1.0+" + ) + (fake_repository / "bar.py").write_text( + "SPDX-License-Identifier: Apache-1.0" + ) + (fake_repository / "LICENSES/Apache-1.0.txt").touch() - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) - assert "bad" in result.bad_licenses - assert "bad" in result.missing_licenses + assert not result.unused_licenses + assert {"Apache-1.0", "Apache-1.0+"}.issubset(result.used_licenses) + + def test_unused_license_plus_only_plus( + self, fake_repository, multiprocessing + ): + """If Apache-1.0+ is the only declared license in the project, + LICENSES/Apache-1.0.txt should not be an unused license. + """ + (fake_repository / "foo.py").write_text( + "SPDX-License-Identifier: Apache-1.0+" + ) + (fake_repository / "LICENSES/Apache-1.0.txt").touch() + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) -def test_generate_project_report_deprecated_license( - fake_repository, multiprocessing -): - """Deprecated licenses are detected.""" - (fake_repository / "LICENSES/GPL-3.0-or-later.txt").rename( - fake_repository / "LICENSES/GPL-3.0.txt" - ) + assert not result.unused_licenses + assert "Apache-1.0+" in result.used_licenses + assert "Apache-1.0" not in result.used_licenses - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + def test_bad_license_in_file(self, fake_repository, multiprocessing): + """Bad licenses in files are detected.""" + (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") - assert "GPL-3.0" in result.deprecated_licenses + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) + assert "bad" in result.bad_licenses -@cpython -@posix -def test_generate_project_report_read_error(fake_repository, multiprocessing): - """Files that cannot be read are added to the read error list.""" - (fake_repository / "bad").write_text("foo") - (fake_repository / "bad").chmod(0o000) + def test_bad_license_can_also_be_missing( + self, fake_repository, multiprocessing + ): + """Bad licenses can also be missing licenses.""" + (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") - project = Project.from_directory(fake_repository) - result = ProjectReport.generate(project, multiprocessing=multiprocessing) + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) - # pylint: disable=superfluous-parens - assert (fake_repository / "bad") in result.read_errors + assert "bad" in result.bad_licenses + assert "bad" in result.missing_licenses + def test_deprecated_license(self, fake_repository, multiprocessing): + """Deprecated licenses are detected.""" + (fake_repository / "LICENSES/GPL-3.0-or-later.txt").rename( + fake_repository / "LICENSES/GPL-3.0.txt" + ) -def test_generate_project_report_to_dict_lint(fake_repository, multiprocessing): - """Generate dictionary output and verify correct ordering.""" - project = Project.from_directory(fake_repository) - report = ProjectReport.generate(project, multiprocessing=multiprocessing) - result = report.to_dict_lint() + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) - # Check if the top three keys are at the beginning of the dictionary - assert list(result.keys())[:3] == [ - "lint_version", - "reuse_spec_version", - "reuse_tool_version", - ] + assert "GPL-3.0" in result.deprecated_licenses - # Check if the recommendation key is at the bottom of the dictionary - assert list(result.keys())[-1] == "recommendations" + @cpython + @posix + def test_read_error(self, fake_repository, multiprocessing): + """Files that cannot be read are added to the read error list.""" + (fake_repository / "bad").write_text("foo") + (fake_repository / "bad").chmod(0o000) - # Check if the rest of the keys are sorted alphabetically - assert list(result.keys())[3:-1] == sorted(list(result.keys())[3:-1]) + project = Project.from_directory(fake_repository) + result = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) + # pylint: disable=superfluous-parens + assert (fake_repository / "bad") in result.read_errors -def test_generate_project_partial_info_in_toml( - empty_directory, multiprocessing -): - """Some information is in REUSE.toml, and some is inside of the file.""" - (empty_directory / "REUSE.toml").write_text( - cleandoc( - """ - version = 1 - - [[annotations]] - path = "foo.py" - precedence = "closest" - SPDX-FileCopyrightText = "Jane Doe" - # This is ignored because it's in the file! - SPDX-License-Identifier = "MIT" - """ + def test_to_dict_lint(self, fake_repository, multiprocessing): + """Generate dictionary output and verify correct ordering.""" + project = Project.from_directory(fake_repository) + report = ProjectReport.generate( + project, multiprocessing=multiprocessing ) - ) - (empty_directory / "foo.py").write_text("# SPDX-License-Identifier: 0BSD") - project = Project.from_directory(empty_directory) - report = ProjectReport.generate(project, multiprocessing=multiprocessing) - file_report = next( - report for report in report.file_reports if report.path.name == "foo.py" - ) - infos = file_report.reuse_infos - assert len(infos) == 2 - assert file_report.copyright == "Jane Doe" - assert file_report.licenses_in_file == ["0BSD"] + result = report.to_dict_lint() + + # Check if the top three keys are at the beginning of the dictionary + assert list(result.keys())[:3] == [ + "lint_version", + "reuse_spec_version", + "reuse_tool_version", + ] + + # Check if the recommendation key is at the bottom of the dictionary + assert list(result.keys())[-1] == "recommendations" + + # Check if the rest of the keys are sorted alphabetically + assert list(result.keys())[3:-1] == sorted(list(result.keys())[3:-1]) + + def test_partial_info_in_toml(self, empty_directory, multiprocessing): + """Some information is in REUSE.toml, and some is inside of the file.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "closest" + SPDX-FileCopyrightText = "Jane Doe" + # This is ignored because it's in the file! + SPDX-License-Identifier = "MIT" + """ + ) + ) + (empty_directory / "foo.py").write_text( + "# SPDX-License-Identifier: 0BSD" + ) + project = Project.from_directory(empty_directory) + report = ProjectReport.generate( + project, multiprocessing=multiprocessing + ) + file_report = next( + report + for report in report.file_reports + if report.path.name == "foo.py" + ) + infos = file_report.reuse_infos + assert len(infos) == 2 + assert file_report.copyright == "Jane Doe" + assert file_report.licenses_in_file == ["0BSD"] def test_bill_of_materials(fake_repository, multiprocessing): From f7f65865b70f50bf2625faf391f5a91cd23525c9 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 15:20:54 +0200 Subject: [PATCH 023/156] Populate files in resources/fake_repository Signed-off-by: Carmen Bianca BAKKER --- tests/conftest.py | 19 ------------------- tests/resources/fake_repository/src/custom.py | 4 +++- .../fake_repository/src/exception.py | 4 +++- .../fake_repository/src/multiple_licenses.rs | 4 +++- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index d7f2f6a2c..7b95763c8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -167,25 +167,6 @@ def fake_repository(tmpdir_factory) -> Path: # Get rid of those pesky pyc files. shutil.rmtree(directory / "src/__pycache__", ignore_errors=True) - # Adding this here to avoid conflict in main project. - (directory / "src/exception.py").write_text( - "SPDX-FileCopyrightText: 2017 Jane Doe\n" - "SPDX-License-Identifier: GPL-3.0-or-later WITH Autoconf-exception-3.0", - encoding="utf-8", - ) - (directory / "src/custom.py").write_text( - "SPDX-FileCopyrightText: 2017 Jane Doe\n" - "SPDX-License-Identifier: LicenseRef-custom", - encoding="utf-8", - ) - (directory / "src/multiple_licenses.rs").write_text( - "SPDX-FileCopyrightText: 2022 Jane Doe\n" - "SPDX-License-Identifier: GPL-3.0-or-later\n" - "SPDX-License-Identifier: Apache-2.0 OR CC0-1.0" - " WITH Autoconf-exception-3.0\n", - encoding="utf-8", - ) - os.chdir(directory) return directory diff --git a/tests/resources/fake_repository/src/custom.py b/tests/resources/fake_repository/src/custom.py index 9c81a2c2c..0f0845086 100644 --- a/tests/resources/fake_repository/src/custom.py +++ b/tests/resources/fake_repository/src/custom.py @@ -1 +1,3 @@ -# This file is overridden by the fake_repository fixture. +# SPDX-FileCopyrightText: 2017 Jane Doe +# +# SPDX-License-Identifier: LicenseRef-custom diff --git a/tests/resources/fake_repository/src/exception.py b/tests/resources/fake_repository/src/exception.py index 9c81a2c2c..c45980dd1 100644 --- a/tests/resources/fake_repository/src/exception.py +++ b/tests/resources/fake_repository/src/exception.py @@ -1 +1,3 @@ -# This file is overridden by the fake_repository fixture. +# SPDX-FileCopyrightText: 2017 Jane Doe +# +# SPDX-License-Identifier: GPL-3.0-or-later WITH Autoconf-exception-3.0 diff --git a/tests/resources/fake_repository/src/multiple_licenses.rs b/tests/resources/fake_repository/src/multiple_licenses.rs index 9768b946c..226b37266 100644 --- a/tests/resources/fake_repository/src/multiple_licenses.rs +++ b/tests/resources/fake_repository/src/multiple_licenses.rs @@ -1 +1,3 @@ -// This file is overridden by the fake_repository fixture. +// SPDX-FileCopyrightText: 2022 Jane Doe +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-License-Identifier: Apache-2.0 OR CC0-1.0 WITH Autoconf-exception-3.0 From 46e42a167b1e467b172e4765972ad857d1e290ea Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 11:02:05 +0200 Subject: [PATCH 024/156] Make lint-file work Signed-off-by: Carmen Bianca BAKKER --- .pylintrc | 3 +- src/reuse/{lint_file.py => _lint_file.py} | 38 ++-- src/reuse/_main.py | 6 +- src/reuse/lint.py | 67 ++++--- src/reuse/project.py | 111 ++++++----- src/reuse/report.py | 230 ++++++++++++++++------ tests/test_lint.py | 16 +- tests/test_main.py | 48 +++++ tests/test_project.py | 71 +++++++ tests/test_report.py | 69 ++++++- 10 files changed, 483 insertions(+), 176 deletions(-) rename src/reuse/{lint_file.py => _lint_file.py} (59%) diff --git a/.pylintrc b/.pylintrc index f71bd6ceb..5d5ace11e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -11,7 +11,8 @@ jobs=0 disable=duplicate-code, logging-fstring-interpolation, - implicit-str-concat + implicit-str-concat, + inconsistent-quotes enable=useless-suppression [REPORTS] diff --git a/src/reuse/lint_file.py b/src/reuse/_lint_file.py similarity index 59% rename from src/reuse/lint_file.py rename to src/reuse/_lint_file.py index 003076972..ceeb02652 100644 --- a/src/reuse/lint_file.py +++ b/src/reuse/_lint_file.py @@ -9,11 +9,13 @@ import sys from argparse import ArgumentParser, Namespace from gettext import gettext as _ +from pathlib import Path from typing import IO -from .lint import format_json, format_lines, format_plain +from ._util import PathType +from .lint import format_lines_subset from .project import Project -from .report import ProjectReport +from .report import ProjectSubsetReport def add_arguments(parser: ArgumentParser) -> None: @@ -22,40 +24,34 @@ def add_arguments(parser: ArgumentParser) -> None: mutex_group.add_argument( "-q", "--quiet", action="store_true", help=_("prevents output") ) - mutex_group.add_argument( - "-j", "--json", action="store_true", help=_("formats output as JSON") - ) - mutex_group.add_argument( - "-p", - "--plain", - action="store_true", - help=_("formats output as plain text"), - ) mutex_group.add_argument( "-l", "--lines", action="store_true", - help=_("formats output as errors per line"), + help=_("formats output as errors per line (default)"), ) - parser.add_argument("files", nargs="*") + parser.add_argument("files", action="store", nargs="*", type=PathType("r")) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """List all non-compliant files from specified file list.""" - report = ProjectReport.generate( + subset_files = {Path(file_) for file_ in args.files} + for file_ in subset_files: + if not file_.resolve().is_relative_to(project.root.resolve()): + args.parser.error( + _("'{file}' is not inside of '{root}'").format( + file=file_, root=project.root + ) + ) + report = ProjectSubsetReport.generate( project, - do_checksum=False, - file_list=args.files, + subset_files, multiprocessing=not args.no_multiprocessing, ) if args.quiet: pass - elif args.json: - out.write(format_json(report)) - elif args.lines: - out.write(format_lines(report)) else: - out.write(format_plain(report)) + out.write(format_lines_subset(report)) return 0 if report.is_compliant else 1 diff --git a/src/reuse/_main.py b/src/reuse/_main.py index 6e52b474d..37d133056 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -21,10 +21,10 @@ __REUSE_version__, __version__, _annotate, + _lint_file, convert_dep5, download, lint, - lint_file, spdx, supported_licenses, ) @@ -178,8 +178,8 @@ def parser() -> argparse.ArgumentParser: add_command( subparsers, "lint-file", - lint_file.add_arguments, - lint_file.run, + _lint_file.add_arguments, + _lint_file.run, help=_("list non-compliant files from specified list of files"), ) diff --git a/src/reuse/lint.py b/src/reuse/lint.py index 257d41b9b..97277edf0 100644 --- a/src/reuse/lint.py +++ b/src/reuse/lint.py @@ -20,7 +20,7 @@ from . import __REUSE_version__ from .project import Project -from .report import ProjectReport +from .report import ProjectReport, ProjectReportSubsetProtocol def add_arguments(parser: ArgumentParser) -> None: @@ -36,7 +36,7 @@ def add_arguments(parser: ArgumentParser) -> None: "-p", "--plain", action="store_true", - help=_("formats output as plain text"), + help=_("formats output as plain text (default)"), ) mutex_group.add_argument( "-l", @@ -264,13 +264,43 @@ def custom_serializer(obj: Any) -> Any: ) +def format_lines_subset(report: ProjectReportSubsetProtocol) -> str: + """Formats a subset of a report, namely missing licenses, read errors, files + without licenses, and files without copyright. + + Args: + report: A populated report. + """ + output = StringIO() + + # Missing licenses + for lic, files in sorted(report.missing_licenses.items()): + for path in sorted(files): + output.write( + _("{path}: missing license {lic}\n").format(path=path, lic=lic) + ) + + # Read errors + for path in sorted(report.read_errors): + output.write(_("{path}: read error\n").format(path=path)) + + # Without licenses + for path in report.files_without_licenses: + output.write(_("{path}: no license identifier\n").format(path=path)) + + # Without copyright + for path in report.files_without_copyright: + output.write(_("{path}: no copyright notice\n").format(path=path)) + + return output.getvalue() + + def format_lines(report: ProjectReport) -> str: - """Formats data dictionary as plaintext strings to be printed to sys.stdout - Sorting of output is not guaranteed. - Symbolic links can result in multiple entries per file. + """Formats report as plaintext strings to be printed to sys.stdout. Sorting + of output is not guaranteed. Args: - report: ProjectReport data + report: A populated report. Returns: String (in plaintext) that can be output to sys.stdout @@ -281,6 +311,7 @@ def license_path(lic: str) -> Optional[Path]: """Resolve a license identifier to a license path.""" return report.licenses.get(lic) + subset_output = "" if not report.is_compliant: # Bad licenses for lic, files in sorted(report.bad_licenses.items()): @@ -312,28 +343,10 @@ def license_path(lic: str) -> Optional[Path]: _("{lic_path}: unused license\n").format(lic_path=lic_path) ) - # Missing licenses - for lic, files in sorted(report.missing_licenses.items()): - for path in sorted(files): - output.write( - _("{path}: missing license {lic}\n").format( - path=path, lic=lic - ) - ) - - # Read errors - for path in sorted(report.read_errors): - output.write(_("{path}: read error\n").format(path=path)) - - # Without licenses - for path in report.files_without_licenses: - output.write(_("{path}: no license identifier\n").format(path=path)) - - # Without copyright - for path in report.files_without_copyright: - output.write(_("{path}: no copyright notice\n").format(path=path)) + # Everything else. + subset_output = format_lines_subset(report) - return output.getvalue() + return output.getvalue() + subset_output def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: diff --git a/src/reuse/project.py b/src/reuse/project.py index a002320ad..0585f85a0 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -18,7 +18,18 @@ from collections import defaultdict from gettext import gettext as _ from pathlib import Path -from typing import DefaultDict, Dict, Iterator, List, NamedTuple, Optional, Type +from typing import ( + Collection, + DefaultDict, + Dict, + Iterator, + List, + NamedTuple, + Optional, + Set, + Type, + cast, +) from binaryornot.check import is_binary @@ -158,53 +169,19 @@ def from_directory( return project - def specific_files( - self, files: Optional[List], directory: Optional[StrPath] = None + def _iter_files( + self, + directory: Optional[StrPath] = None, + subset_files: Optional[Collection[StrPath]] = None, ) -> Iterator[Path]: - """Yield all files in the specified file list within a directory. - - The files that are not yielded are: - - - Files ignored by VCS (e.g., see .gitignore) - - - Files matching IGNORE_*_PATTERNS. - """ - if directory is None: - directory = self.root - directory = Path(directory) - - if files is not None: - # Filter files. - for file_ in files: - the_file = directory / file_ - if self._is_path_ignored(the_file): - _LOGGER.debug("ignoring '%s'", the_file) - continue - if the_file.is_symlink(): - _LOGGER.debug("skipping symlink '%s'", the_file) - continue - # Suppressing this error because I simply don't want to deal - # with that here. - with contextlib.suppress(OSError): - if the_file.stat().st_size == 0: - _LOGGER.debug("skipping 0-sized file '%s'", the_file) - continue - - _LOGGER.debug("yielding '%s'", the_file) - yield the_file - - def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: - """Yield all files in *directory* and its subdirectories. - - The files that are not yielded are: - - - Files ignored by VCS (e.g., see .gitignore) - - - Files/directories matching IGNORE_*_PATTERNS. - """ + # pylint: disable=too-many-branches if directory is None: directory = self.root directory = Path(directory) + if subset_files is not None: + subset_files = cast( + Set[Path], {Path(file_).resolve() for file_ in subset_files} + ) for root_str, dirs, files in os.walk(directory): root = Path(root_str) @@ -213,6 +190,11 @@ def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: # Don't walk ignored directories for dir_ in list(dirs): the_dir = root / dir_ + if subset_files is not None and not any( + file_.is_relative_to(the_dir.resolve()) + for file_ in subset_files + ): + continue if self._is_path_ignored(the_dir): _LOGGER.debug("ignoring '%s'", the_dir) dirs.remove(dir_) @@ -231,6 +213,11 @@ def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: # Filter files. for file_ in files: the_file = root / file_ + if ( + subset_files is not None + and the_file.resolve() not in subset_files + ): + continue if self._is_path_ignored(the_file): _LOGGER.debug("ignoring '%s'", the_file) continue @@ -247,6 +234,42 @@ def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: _LOGGER.debug("yielding '%s'", the_file) yield the_file + def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: + """Yield all files in *directory* and its subdirectories. + + The files that are not yielded are those explicitly ignored by the REUSE + Specification. That means: + + - LICENSE/COPYING files. + - VCS directories. + - .license files. + - .spdx files. + - Files ignored by VCS. + - Symlinks. + - Submodules (depending on the value of :attr:`include_submodules`). + - Meson subprojects (depending on the value of + :attr:`include_meson_subprojects`). + - 0-sized files. + + Args: + directory: The directory in which to search. + """ + return self._iter_files(directory=directory) + + def subset_files( + self, files: Collection[StrPath], directory: Optional[StrPath] = None + ) -> Iterator[Path]: + """Like :meth:`all_files`, but all files that are not in *files* are + filtered out. + + Args: + files: A collection of paths relative to the current working + directory. Any files that are not in this collection are not + yielded. + directory: The directory in which to search. + """ + return self._iter_files(directory=directory, subset_files=files) + def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: """Return REUSE info of *path*. diff --git a/src/reuse/report.py b/src/reuse/report.py index 508eb51ce..e9267b280 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -23,13 +23,14 @@ from pathlib import Path, PurePath from typing import ( Any, + Collection, Dict, Iterable, List, NamedTuple, Optional, + Protocol, Set, - Union, cast, ) from uuid import uuid4 @@ -112,12 +113,81 @@ class _MultiprocessingResult(NamedTuple): error: Optional[Exception] +def _generate_file_reports( + project: Project, + do_checksum: bool = True, + subset_files: Optional[Collection[StrPath]] = None, + multiprocessing: bool = cpu_count() > 1, # type: ignore + add_license_concluded: bool = False, +) -> Iterable[_MultiprocessingResult]: + """Create a :class:`FileReport` for every file in the project, filtered + by *subset_files*. + """ + container = _MultiprocessingContainer( + project, do_checksum, add_license_concluded + ) + + files = ( + project.subset_files(subset_files) + if subset_files is not None + else project.all_files() + ) + if multiprocessing: + with mp.Pool() as pool: + results: Iterable[_MultiprocessingResult] = pool.map( + container, files + ) + pool.join() + else: + results = map(container, files) + return results + + +def _process_error(error: Exception, path: StrPath) -> None: + # Facilitate better debugging by being able to quit the program. + if isinstance(error, bdb.BdbQuit): + raise bdb.BdbQuit() from error + if isinstance(error, (OSError, UnicodeError)): + _LOGGER.error( + _("Could not read '{path}'").format(path=path), + exc_info=error, + ) + else: + _LOGGER.error( + _("Unexpected error occurred while parsing '{path}'").format( + path=path + ), + exc_info=error, + ) + + +class ProjectReportSubsetProtocol(Protocol): + """A :class:`Protocol` that defines a subset of functionality of + :class:`ProjectReport`, implemented by :class:`ProjectSubsetReport`. + """ + + path: StrPath + missing_licenses: Dict[str, Set[Path]] + read_errors: Set[Path] + file_reports: Set["FileReport"] + + @property + def files_without_licenses(self) -> Set[Path]: + """Set of paths that have no licensing information.""" + + @property + def files_without_copyright(self) -> Set[Path]: + """Set of paths that have no copyright information.""" + + @property + def is_compliant(self) -> bool: + """Whether the report subset is compliant with the REUSE Spec.""" + + class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" - def __init__( - self, do_checksum: bool = True, file_list: Optional[List[str]] = None - ): + def __init__(self, do_checksum: bool = True): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} @@ -128,7 +198,6 @@ def __init__( self.licenses_without_extension: Dict[str, Path] = {} self.do_checksum = do_checksum - self.file_list = file_list self._unused_licenses: Optional[Set[str]] = None self._used_licenses: Optional[Set[str]] = None @@ -286,48 +355,24 @@ def bill_of_materials( return out.getvalue() - @classmethod - def get_lint_results( - cls, - project: Project, - do_checksum: bool = True, - file_list: Optional[List[str]] = None, - multiprocessing: bool = cpu_count() > 1, # type: ignore - add_license_concluded: bool = False, - ) -> Union[list, Iterable[_MultiprocessingResult]]: - """Get lint results based on multiprocessing and file_list.""" - container = _MultiprocessingContainer( - project, do_checksum, add_license_concluded - ) - - # Iterate over specific file list if files are provided with - # `reuse lint-file`. Otherwise, lint all files. - iter_files = ( - project.specific_files(file_list) - if file_list - else project.all_files() - ) - if multiprocessing: - with mp.Pool() as pool: - results: Iterable[_MultiprocessingResult] = pool.map( - container, iter_files - ) - pool.join() - else: - results = map(container, iter_files) - - return results - @classmethod def generate( cls, project: Project, do_checksum: bool = True, - file_list: Optional[List[str]] = None, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, ) -> "ProjectReport": - """Generate a ProjectReport from a Project.""" + """Generate a :class:`ProjectReport` from a :class:`Project`. + + Args: + project: The :class:`Project` to lint. + do_checksum: Generate a checksum of every file. If this is + :const:`False`, generate a random checksum for every file. + multiprocessing: Whether to use multiprocessing. + add_license_concluded: Whether to aggregate all found SPDX + expressions into a concluded license. + """ project_report = cls(do_checksum=do_checksum) project_report.path = project.root project_report.licenses = project.licenses @@ -335,32 +380,15 @@ def generate( project.licenses_without_extension ) - results = cls.get_lint_results( + results = _generate_file_reports( project, - do_checksum, - file_list, - multiprocessing, # type: ignore - add_license_concluded, + do_checksum=do_checksum, + multiprocessing=multiprocessing, + add_license_concluded=add_license_concluded, ) - for result in results: if result.error: - # Facilitate better debugging by being able to quit the program. - if isinstance(result.error, bdb.BdbQuit): - raise bdb.BdbQuit() from result.error - if isinstance(result.error, (OSError, UnicodeError)): - _LOGGER.error( - _("Could not read '{path}'").format(path=result.path), - exc_info=result.error, - ) - project_report.read_errors.add(Path(result.path)) - continue - _LOGGER.error( - _( - "Unexpected error occurred while parsing '{path}'" - ).format(path=result.path), - exc_info=result.error, - ) + _process_error(result.error, result.path) project_report.read_errors.add(Path(result.path)) continue @@ -554,6 +582,86 @@ def recommendations(self) -> List[str]: return recommendations +class ProjectSubsetReport: + """Like a :class:`ProjectReport`, but for a subset of the files using a + subset of features. + """ + + def __init__(self) -> None: + self.path: StrPath = "" + self.missing_licenses: Dict[str, Set[Path]] = {} + self.read_errors: Set[Path] = set() + self.file_reports: Set[FileReport] = set() + + @classmethod + def generate( + cls, + project: Project, + subset_files: Collection[StrPath], + multiprocessing: bool = cpu_count() > 1, # type: ignore + ) -> "ProjectSubsetReport": + """Generate a :class:`ProjectSubsetReport` from a :class:`Project`. + + Args: + project: The :class:`Project` to lint. + subset_files: Only lint the files in this list. + multiprocessing: Whether to use multiprocessing. + """ + subset_report = cls() + subset_report.path = project.root + results = _generate_file_reports( + project, + do_checksum=False, + subset_files=subset_files, + multiprocessing=multiprocessing, + add_license_concluded=False, + ) + for result in results: + if result.error: + _process_error(result.error, result.path) + subset_report.read_errors.add(Path(result.path)) + continue + + file_report = cast(FileReport, result.report) + subset_report.file_reports.add(file_report) + + for missing_license in file_report.missing_licenses: + subset_report.missing_licenses.setdefault( + missing_license, set() + ).add(file_report.path) + return subset_report + + @property + def files_without_licenses(self) -> Set[Path]: + """Set of paths that have no licensing information.""" + return { + file_report.path + for file_report in self.file_reports + if not file_report.licenses_in_file + } + + @property + def files_without_copyright(self) -> Set[Path]: + """Set of paths that have no copyright information.""" + return { + file_report.path + for file_report in self.file_reports + if not file_report.copyright + } + + @property + def is_compliant(self) -> bool: + """Whether the report subset is compliant with the REUSE Spec.""" + return not any( + ( + self.missing_licenses, + self.files_without_copyright, + self.files_without_licenses, + self.read_errors, + ) + ) + + class FileReport: # pylint: disable=too-many-instance-attributes """Object that holds a linting report about a single file.""" diff --git a/tests/test_lint.py b/tests/test_lint.py index 1b89084ff..e680b82d3 100644 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -4,7 +4,7 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -"""All tests for reuse.lint and reuse.lint_files""" +"""All tests for reuse.lint.""" import re import shutil @@ -271,18 +271,4 @@ def test_lint_lines_read_errors(fake_repository): assert "read error" in result -def test_lint_specific_files(fake_repository): - """Check lint-file subcommand.""" - (fake_repository / "foo.py").write_text("foo") - (fake_repository / "bar.py").write_text("bar") - - project = Project.from_directory(fake_repository) - report = ProjectReport.generate(project, file_list=["foo.py"]) - result = format_plain(report) - - assert ":-(" in result - assert "# UNUSED LICENSES" in result - assert "bar.py" not in result - - # REUSE-IgnoreEnd diff --git a/tests/test_main.py b/tests/test_main.py index 461a15ca1..d5d977337 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -367,6 +367,54 @@ def test_lint_no_multiprocessing(fake_repository, stringio, multiprocessing): assert ":-)" in stringio.getvalue() +class TestLintFile: + """Tests for lint-file.""" + + def test_simple(self, fake_repository, stringio): + """A simple test to make sure it works.""" + result = main(["lint-file", "src/custom.py"], out=stringio) + assert result == 0 + assert not stringio.getvalue() + + def test_no_copyright_licensing(self, fake_repository, stringio): + """A file is correctly spotted when it has no copyright or licensing + info. + """ + (fake_repository / "foo.py").write_text("foo") + result = main(["lint-file", "foo.py"], out=stringio) + assert result == 1 + output = stringio.getvalue() + assert "foo.py" in output + assert "no license identifier" in output + assert "no copyright notice" in output + + def test_path_outside_project(self, empty_directory, capsys): + """A file can't be outside the project.""" + with pytest.raises(SystemExit): + main(["lint-file", "/"]) + assert "'/' is not in" in capsys.readouterr().err + + def test_file_not_exists(self, empty_directory, capsys): + """A file must exist.""" + with pytest.raises(SystemExit): + main(["lint-file", "foo.py"]) + assert "can't open 'foo.py'" in capsys.readouterr().err + + def test_ignored_file(self, fake_repository, stringio): + """A corner case where a specified file is ignored. It isn't checked at + all. + """ + (fake_repository / "COPYING").write_text("foo") + result = main(["lint-file", "COPYING"], out=stringio) + assert result == 0 + + def test_file_covered_by_toml(self, fake_repository_reuse_toml, stringio): + """If a file is covered by REUSE.toml, use its infos.""" + (fake_repository_reuse_toml / "doc/foo.md").write_text("foo") + result = main(["lint-file", "doc/foo.md"], out=stringio) + assert result == 0 + + @freeze_time("2024-04-08T17:34:00Z") def test_spdx(fake_repository, stringio): """Compile to an SPDX document.""" diff --git a/tests/test_project.py b/tests/test_project.py index fceba03e0..70a5af7e5 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -309,6 +309,77 @@ def test_all_files_pijul_ignored_contains_newline(pijul_repository): assert Path("hello\nworld.pyc").absolute() not in project.all_files() +class TestSubsetFiles: + """Tests for subset_files.""" + + def test_single(self, fake_repository): + """Only yield the single specified file.""" + project = Project.from_directory(fake_repository) + result = list(project.subset_files({fake_repository / "src/custom.py"})) + assert result == [fake_repository / "src/custom.py"] + + def test_two(self, fake_repository): + """Yield multiple specified files.""" + project = Project.from_directory(fake_repository) + result = list( + project.subset_files( + { + fake_repository / "src/custom.py", + fake_repository / "src/exception.py", + } + ) + ) + assert result == [ + fake_repository / "src/custom.py", + fake_repository / "src/exception.py", + ] + + def test_non_existent(self, fake_repository): + """If a file does not exist, don't yield it.""" + project = Project.from_directory(fake_repository) + result = list( + project.subset_files( + { + fake_repository / "src/custom.py", + fake_repository / "not_exist.py", + fake_repository / "also/does/not/exist.py", + } + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_outside_cwd(self, fake_repository): + """If a file is outside of the project, don't yield it.""" + project = Project.from_directory(fake_repository) + result = list( + project.subset_files( + { + fake_repository / "src/custom.py", + (fake_repository / "../outside.py").resolve(), + } + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_empty(self, fake_repository): + """If no files are provided, yield nothing.""" + project = Project.from_directory(fake_repository) + result = list(project.subset_files(set())) + assert not result + + def test_list_arg(self, fake_repository): + """Also accepts a list argument.""" + project = Project.from_directory(fake_repository) + result = list(project.subset_files([fake_repository / "src/custom.py"])) + assert result == [fake_repository / "src/custom.py"] + + def test_relative_path(self, fake_repository): + """Also handles relative paths.""" + project = Project.from_directory(fake_repository) + result = list(project.subset_files({"src/custom.py"})) + assert result == [fake_repository / "src/custom.py"] + + def test_reuse_info_of_file_does_not_exist(fake_repository): """Raise FileNotFoundError when asking for the REUSE info of a file that does not exist. diff --git a/tests/test_report.py b/tests/test_report.py index b1c01ed32..3afc9d951 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -17,7 +17,7 @@ from reuse import SourceType from reuse.project import Project -from reuse.report import FileReport, ProjectReport +from reuse.report import FileReport, ProjectReport, ProjectSubsetReport # REUSE-IgnoreStart @@ -278,9 +278,7 @@ def test_simple(self, fake_repository, multiprocessing): assert not result.read_errors assert result.file_reports - def test__licenses_without_extension( - self, fake_repository, multiprocessing - ): + def test_licenses_without_extension(self, fake_repository, multiprocessing): """Licenses without extension are detected.""" (fake_repository / "LICENSES/CC0-1.0.txt").rename( fake_repository / "LICENSES/CC0-1.0" @@ -478,6 +476,69 @@ def test_partial_info_in_toml(self, empty_directory, multiprocessing): assert file_report.licenses_in_file == ["0BSD"] +class TestProjectSubsetReport: + """Tests for ProjectSubsetReport.""" + + def test_simple(self, fake_repository, multiprocessing): + """Simple generate test.""" + project = Project.from_directory(fake_repository) + result = ProjectSubsetReport.generate( + project, + {fake_repository / "src/custom.py"}, + multiprocessing=multiprocessing, + ) + + assert not result.missing_licenses + assert not result.read_errors + assert not result.files_without_licenses + assert not result.files_without_copyright + assert len(result.file_reports) == 1 + + @cpython + @posix + def test_read_error(self, fake_repository, multiprocessing): + """Files that cannot be read are added to the read error list.""" + (fake_repository / "bad").write_text("foo") + (fake_repository / "bad").chmod(0o000) + + project = Project.from_directory(fake_repository) + result = ProjectSubsetReport.generate( + project, {fake_repository / "bad"}, multiprocessing=multiprocessing + ) + + # pylint: disable=superfluous-parens + assert (fake_repository / "bad") in result.read_errors + + def test_missing_license(self, fake_repository, multiprocessing): + """Missing licenses are detected.""" + (fake_repository / "LICENSES/GPL-3.0-or-later.txt").unlink() + + project = Project.from_directory(fake_repository) + result = ProjectSubsetReport.generate( + project, + {fake_repository / "src/exception.py"}, + multiprocessing=multiprocessing, + ) + + assert result.missing_licenses == { + "GPL-3.0-or-later": {fake_repository / "src/exception.py"} + } + + def test_missing_copyright_license(self, empty_directory, multiprocessing): + """Missing copyright and license is detected.""" + (empty_directory / "foo.py").write_text("foo") + project = Project.from_directory(empty_directory) + result = ProjectSubsetReport.generate( + project, + {empty_directory / "foo.py"}, + multiprocessing=multiprocessing, + ) + + # pylint: disable=superfluous-parens + assert (empty_directory / "foo.py") in result.files_without_copyright + assert (empty_directory / "foo.py") in result.files_without_licenses + + def test_bill_of_materials(fake_repository, multiprocessing): """Generate a bill of materials.""" project = Project.from_directory(fake_repository) From 34a8bb23328c4b0b03bdb8c19d5660902e206360 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 17:03:04 +0200 Subject: [PATCH 025/156] Make compatible with Python 3.8 Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_lint_file.py | 4 ++-- src/reuse/_util.py | 13 +++++++++++-- src/reuse/global_licensing.py | 7 ++----- src/reuse/project.py | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/reuse/_lint_file.py b/src/reuse/_lint_file.py index ceeb02652..5caa6661e 100644 --- a/src/reuse/_lint_file.py +++ b/src/reuse/_lint_file.py @@ -12,7 +12,7 @@ from pathlib import Path from typing import IO -from ._util import PathType +from ._util import PathType, is_relative_to from .lint import format_lines_subset from .project import Project from .report import ProjectSubsetReport @@ -37,7 +37,7 @@ def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """List all non-compliant files from specified file list.""" subset_files = {Path(file_) for file_ in args.files} for file_ in subset_files: - if not file_.resolve().is_relative_to(project.root.resolve()): + if not is_relative_to(file_.resolve(), project.root.resolve()): args.parser.error( _("'{file}' is not inside of '{root}'").format( file=file_, root=project.root diff --git a/src/reuse/_util.py b/src/reuse/_util.py index d5cf16660..58de0d1f3 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -14,7 +14,7 @@ """Misc. utilities for reuse.""" - +import contextlib import logging import os import re @@ -29,7 +29,7 @@ from inspect import cleandoc from itertools import chain from os import PathLike -from pathlib import Path +from pathlib import Path, PurePath from typing import ( IO, Any, @@ -665,4 +665,13 @@ def cleandoc_nl(text: str) -> str: return cleandoc(text) + "\n" +def is_relative_to(path: PurePath, target: PurePath) -> bool: + """Like Path.is_relative_to, but working for Python <3.9.""" + # TODO: When Python 3.8 is dropped, remove this function. + with contextlib.suppress(ValueError): + path.relative_to(target) + return True + return False + + # REUSE-IgnoreEnd diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index b66adc45a..6a659c9ff 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -6,7 +6,6 @@ # mypy: disable-error-code=attr-defined -import contextlib import logging import re from abc import ABC, abstractmethod @@ -40,7 +39,7 @@ from license_expression import ExpressionError from . import ReuseInfo, SourceType -from ._util import _LICENSING, StrPath +from ._util import _LICENSING, StrPath, is_relative_to _LOGGER = logging.getLogger(__name__) @@ -555,9 +554,7 @@ def _find_relevant_tomls(self, path: StrPath) -> List[ReuseTOML]: found = [] for toml in self.reuse_tomls: # TODO: When Python 3.8 is dropped, use is_relative_to instead. - with contextlib.suppress(ValueError): - PurePath(path).relative_to(toml.directory) - # No error. + if is_relative_to(PurePath(path), toml.directory): found.append(toml) # Sort from topmost to deepest directory. found.sort(key=lambda toml: toml.directory.parts) diff --git a/src/reuse/project.py b/src/reuse/project.py index 0585f85a0..8ab6d37c4 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -45,6 +45,7 @@ _LICENSEREF_PATTERN, StrPath, _determine_license_path, + is_relative_to, relative_from_root, reuse_info_of_file, ) @@ -191,7 +192,7 @@ def _iter_files( for dir_ in list(dirs): the_dir = root / dir_ if subset_files is not None and not any( - file_.is_relative_to(the_dir.resolve()) + is_relative_to(file_, the_dir.resolve()) for file_ in subset_files ): continue From a15f4a7c1f5145c9ef0bd86f2fe1c33c45a0b938 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 17:04:57 +0200 Subject: [PATCH 026/156] Use set instead of list in test This worked on my machine, but not on the CI. I'm convinced that my filesystem (btrfs) iterates over files very differently compared to ext4. Signed-off-by: Carmen Bianca BAKKER --- tests/test_project.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_project.py b/tests/test_project.py index 70a5af7e5..ea3ad7ae5 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -321,7 +321,7 @@ def test_single(self, fake_repository): def test_two(self, fake_repository): """Yield multiple specified files.""" project = Project.from_directory(fake_repository) - result = list( + result = set( project.subset_files( { fake_repository / "src/custom.py", @@ -329,10 +329,10 @@ def test_two(self, fake_repository): } ) ) - assert result == [ + assert result == { fake_repository / "src/custom.py", fake_repository / "src/exception.py", - ] + } def test_non_existent(self, fake_repository): """If a file does not exist, don't yield it.""" From 7f04e3c998fdcb93d8fdfcb1919c7a89a333ee65 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 6 Sep 2024 17:11:33 +0200 Subject: [PATCH 027/156] Make test compatible with Windows Signed-off-by: Carmen Bianca BAKKER --- tests/test_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_main.py b/tests/test_main.py index d5d977337..94c078f9f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -391,8 +391,8 @@ def test_no_copyright_licensing(self, fake_repository, stringio): def test_path_outside_project(self, empty_directory, capsys): """A file can't be outside the project.""" with pytest.raises(SystemExit): - main(["lint-file", "/"]) - assert "'/' is not in" in capsys.readouterr().err + main(["lint-file", ".."]) + assert "'..' is not in" in capsys.readouterr().err def test_file_not_exists(self, empty_directory, capsys): """A file must exist.""" From 97074ed29d83f0efcdf9c5931d188330e3bb2571 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 10 Sep 2024 11:55:15 +0200 Subject: [PATCH 028/156] Improve documentation of lint-file Signed-off-by: Carmen Bianca BAKKER --- docs/conf.py | 13 ++++++ docs/man/reuse-lint-file.rst | 87 +++++++----------------------------- docs/man/reuse-lint.rst | 2 +- src/reuse/_lint_file.py | 8 +++- 4 files changed, 37 insertions(+), 73 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index f9674da75..9a53bb03e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -115,6 +115,14 @@ "Free Software Foundation Europe", 1, ), + ( + "man/reuse-lint-file", + "reuse-lint-file", + "Verify whether the specified files are compliant with the REUSE" + " Specification", + "Free Software Foundation Europe", + 1, + ), ( "man/reuse-spdx", "reuse-spdx", @@ -130,6 +138,11 @@ 1, ), ] +manpages_url = ( + "https://reuse.readthedocs.io/en/v{version}/man/{page}.html".format( + version=version, page="{page}" + ) +) # -- Custom ------------------------------------------------------------------ diff --git a/docs/man/reuse-lint-file.rst b/docs/man/reuse-lint-file.rst index f6030c646..314cc46da 100644 --- a/docs/man/reuse-lint-file.rst +++ b/docs/man/reuse-lint-file.rst @@ -5,100 +5,45 @@ SPDX-License-Identifier: CC-BY-SA-4.0 reuse-lint-file -================ +=============== Synopsis -------- -**reuse lint-file** [*options*] +**reuse lint-file** [*options*] [*file* ...] Description ----------- -:program:`reuse-lint-file` verifies whether a file in a project is compliant with the REUSE -Specification located at ``_. +:program:`reuse-lint-file` verifies whether the specified files are compliant +with the REUSE Specification located at ``_. It +runs the linter from :manpage:`reuse-lint(1)` against a subset of files, using a +subset of criteria. + +Files that are ignored by :program:`reuse-lint` are also ignored by +:program:`reuse-lint-file`, even if specified. Criteria -------- -These are the criteria that the linter checks against. - -Bad licenses -~~~~~~~~~~~~ - -Licenses that are found in ``LICENSES/`` that are not found in the SPDX License -List or do not start with ``LicenseRef-`` are bad licenses. - -Deprecated licenses -~~~~~~~~~~~~~~~~~~~ - -Licenses whose SPDX License Identifier has been deprecated by SPDX. - -Licenses without file extension -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -These are licenses whose file names are a valid SPDX License Identifier, but -which do not have a file extension. - -Missing licenses -~~~~~~~~~~~~~~~~ - -A license which is referred to in a comment header, but which is not found in -the ``LICENSES/`` directory. - -Unused licenses -~~~~~~~~~~~~~~~ - -A license found in the ``LICENSES/`` directory, but which is not referred to in -any comment header. - -Read errors -~~~~~~~~~~~ +The criteria are the same as used in :manpage:`reuse-lint(1)`, but using only a +subset: -Not technically a criterion, but files that cannot be read by the operating -system are read errors, and need to be fixed. - -Files without copyright and license information -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Every file needs to have copyright and licensing information associated with it. -The REUSE Specification details several ways of doing it. By and large, these -are the methods: - -- Placing tags in the header of the file. -- Placing tags in a ``.license`` file adjacent to the file. -- Putting the information in the ``REUSE.toml`` file. -- Putting the information in the ``.reuse/dep5`` file. (Deprecated) - -If a file is found that does not have copyright and/or license information -associated with it, then the project is not compliant. +- Missing licenses. +- Read errors. +- Files without copyright and license information. Options ------- -.. option:: - - File(s) that are linted. For example, ``reuse lint-file src/reuse/lint_file.py src/reuse/download.py``. - .. option:: -q, --quiet Do not print anything to STDOUT. -.. - TODO: specify the JSON output. - -.. option:: -j, --json - - Output the results of the lint as JSON. - -.. option:: -p, --plain - - Output the results of the lint as descriptive text. The text is valid - Markdown. - .. option:: -l, --lines - Output one line per error, prefixed by the file path. + Output one line per error, prefixed by the file path. This option is the + default. .. option:: -h, --help diff --git a/docs/man/reuse-lint.rst b/docs/man/reuse-lint.rst index 75bfcf945..e00d8470b 100644 --- a/docs/man/reuse-lint.rst +++ b/docs/man/reuse-lint.rst @@ -90,7 +90,7 @@ Options .. option:: -p, --plain Output the results of the lint as descriptive text. The text is valid - Markdown. + Markdown. This option is the default. .. option:: -l, --lines diff --git a/src/reuse/_lint_file.py b/src/reuse/_lint_file.py index 5caa6661e..39e5cd469 100644 --- a/src/reuse/_lint_file.py +++ b/src/reuse/_lint_file.py @@ -30,7 +30,13 @@ def add_arguments(parser: ArgumentParser) -> None: action="store_true", help=_("formats output as errors per line (default)"), ) - parser.add_argument("files", action="store", nargs="*", type=PathType("r")) + parser.add_argument( + "files", + action="store", + nargs="*", + type=PathType("r"), + help=_("files to lint"), + ) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: From 4f420afe28b27daaf94baadd134dc5b7da708ac8 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 10 Sep 2024 12:15:43 +0200 Subject: [PATCH 029/156] Fix pre-commit hook Signed-off-by: Carmen Bianca BAKKER --- .pre-commit-hooks.yaml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index d18780413..9533c2658 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -3,10 +3,18 @@ # SPDX-License-Identifier: GPL-3.0-or-later - id: reuse - name: reuse + name: reuse lint entry: reuse - args: ["lint", "lint-file"] + args: ["lint"] language: python pass_filenames: false description: - "Lint the project directory for compliance with the REUSE Specification" + "Lint the project directory for compliance with the REUSE Specification." + +- id: reuse-lint-file + name: reuse lint-file + entry: reuse + args: ["lint-file"] + language: python + description: + "Lint the changed files for compliance with the REUSE Specification." From 15861d23937fe80623cdc13ed6b494fa2782aac8 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 10 Sep 2024 12:22:15 +0200 Subject: [PATCH 030/156] Document in README Signed-off-by: Carmen Bianca BAKKER --- README.md | 13 ++++++++++++- docs/conf.py | 2 +- pyproject.toml | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1908df36a..33705fdc3 100644 --- a/README.md +++ b/README.md @@ -247,7 +247,7 @@ Git. This uses [pre-commit](https://pre-commit.com/). Once you ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v3.0.2 + rev: v4.0.3 hooks: - id: reuse ``` @@ -256,6 +256,17 @@ Then run `pre-commit install`. Now, every time you commit, `reuse lint` is run in the background, and will prevent your commit from going through if there was an error. +If you instead want to only lint files that were changed in your commit, you can +use the following configuration: + +```yaml +repos: + - repo: https://github.com/fsfe/reuse-tool + rev: v4.0.3 + hooks: + - id: reuse-lint-file +``` + ## Maintainers - Carmen Bianca Bakker diff --git a/docs/conf.py b/docs/conf.py index 9a53bb03e..18bcd02cf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ # The full version, including alpha/beta/rc tags. release = get_version("reuse") except PackageNotFoundError: - release = "3.0.2" + release = "4.0.3" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) diff --git a/pyproject.toml b/pyproject.toml index 02c3df14b..1f8e51d87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,6 +122,12 @@ push = false "src/reuse/__init__.py" = [ '__version__ = "{pep440_version}"$', ] +"docs/conf.py" = [ + 'release = "{pep440_version}"$', +] +"README.md" = [ + 'rev: {version}$', +] [tool.protokolo] changelog = "CHANGELOG.md" From 02bfe4761c9ed454e875b24b32eb14c57db6bb96 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Tue, 10 Sep 2024 10:35:02 +0000 Subject: [PATCH 031/156] Update reuse.pot --- po/cs.po | 173 +++++++++++++++++++++++++++---------------------- po/de.po | 173 +++++++++++++++++++++++++++---------------------- po/eo.po | 171 +++++++++++++++++++++++++++---------------------- po/es.po | 173 +++++++++++++++++++++++++++---------------------- po/fr.po | 173 +++++++++++++++++++++++++++---------------------- po/gl.po | 171 +++++++++++++++++++++++++++---------------------- po/it.po | 171 +++++++++++++++++++++++++++---------------------- po/nl.po | 171 +++++++++++++++++++++++++++---------------------- po/pt.po | 171 +++++++++++++++++++++++++++---------------------- po/reuse.pot | 159 ++++++++++++++++++++++++--------------------- po/ru.po | 173 +++++++++++++++++++++++++++---------------------- po/sv.po | 157 +++++++++++++++++++++++++-------------------- po/tr.po | 173 +++++++++++++++++++++++++++---------------------- po/uk.po | 177 ++++++++++++++++++++++++++++----------------------- 14 files changed, 1319 insertions(+), 1067 deletions(-) diff --git a/po/cs.po b/po/cs.po index b8d83b67d..0ecb955f1 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-08-17 00:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech for more information, and " @@ -183,17 +201,17 @@ msgstr "" "naleznete na adrese a online dokumentaci na adrese " "." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Podpořte činnost FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -203,43 +221,43 @@ msgstr "" "práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " "možnost přispět na ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "povolit příkazy pro ladění" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "skrýt varování o zastarání" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "nepřeskakovat submoduly systému Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "nepřeskakovat podprojekty Meson" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "nepoužívat multiprocessing" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "definovat kořen projektu" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit jej" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "dílčí příkazy" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "přidání autorských práv a licencí do záhlaví souborů" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -257,19 +275,19 @@ msgstr "" "Pomocí parametru --contributor můžete určit osoby nebo subjekty, které " "přispěly, ale nejsou držiteli autorských práv daných souborů." -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "seznam všech nevyhovujících souborů" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -305,24 +323,28 @@ msgstr "" "\n" "- Mají všechny soubory platné informace o autorských právech a licencích?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "seznam všech podporovaných licencí SPDX" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "Převeďte .reuse/dep5 do REUSE.toml" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{path}' se nepodařilo dekódovat jako UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -331,7 +353,7 @@ msgstr "" "'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové hlášení: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Nepodařilo se analyzovat '{expression}'" @@ -438,14 +460,14 @@ msgstr "jsou vyžadovány tyto argumenty: licence" msgid "cannot use --output with more than one license" msgstr "nelze použít --output s více než jednou licencí" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -454,17 +476,17 @@ msgstr "" "Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, která " "je {item_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} nesmí být prázdný." -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} musí být {type} (má {value}, která je {value_type})." -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -477,16 +499,13 @@ msgstr "" "ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " "výrazy" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "brání výstupu" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "formátuje výstup jako JSON" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "formátuje výstup jako prostý text" #: src/reuse/lint.py:45 @@ -611,58 +630,58 @@ msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-( msgid "RECOMMENDATIONS" msgstr "DOPORUČENÍ" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "{path}: chybí licence {lic}\n" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "{path}: chyba čtení\n" + #: src/reuse/lint.py:289 #, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "{path}: žádný identifikátor licence\n" + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "{path}: žádné upozornění na autorská práva\n" + +#: src/reuse/lint.py:320 +#, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: špatná licence {lic}\n" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: zastaralá licence\n" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: licence bez přípony souboru\n" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: nepoužitá licence\n" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: chybí licence {lic}\n" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: chyba čtení\n" - -#: src/reuse/lint.py:330 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: žádný identifikátor licence\n" - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: žádné upozornění na autorská práva\n" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' zahrnuto v {global_path}" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "'{path}' je zahrnuta výhradně v REUSE.toml. Nečte obsah souboru." -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -671,7 +690,7 @@ msgstr "" "'{path}' byl rozpoznán jako binární soubor; v jeho obsahu nebyly hledány " "informace o REUSE." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -679,7 +698,7 @@ msgstr "" "'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor REUSE." "toml. Pro konverzi použijte `reuse convert-dep5`." -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -688,17 +707,17 @@ msgstr "" "Nalezeno '{new_path}' i '{old_path}'. Oba soubory nelze uchovávat současně, " "nejsou vzájemně kompatibilní." -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "určující identifikátor '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} nemá příponu souboru" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -711,14 +730,14 @@ msgstr "" "adrese nebo zda začíná znakem 'LicenseRef-' a " "zda má příponu souboru." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -726,17 +745,17 @@ msgstr "" "projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný software " "VCS" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Nepodařilo se načíst '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -749,7 +768,7 @@ msgstr "" "Často kladené otázky o vlastních licencích: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -762,7 +781,7 @@ msgstr "" "reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " "nové identifikátory naleznete zde: " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -772,7 +791,7 @@ msgstr "" "adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím způsobem " "přejmenujte." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -787,7 +806,7 @@ msgstr "" "--all' a získat všechny chybějící. Pro vlastní licence (začínající na " "'LicenseRef-') musíte tyto soubory přidat sami." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -801,7 +820,7 @@ msgstr "" "buď správně označili, nebo nepoužitý licenční text odstranili, pokud jste si " "jisti, že žádný soubor nebo kousek kódu není takto licencován." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -811,7 +830,7 @@ msgstr "" "adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v horní " "části výstupu jako součást zaznamenaných chybových hlášení." -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/de.po b/po/de.po index 264b5102c..089029707 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German for more information, and " @@ -184,7 +202,7 @@ msgstr "" "überprüfen. Mehr Informationen finden Sie auf oder " "in der Online-Dokumentation auf ." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -192,11 +210,11 @@ msgstr "" "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" "Spezifikation." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Die Arbeit der FSFE unterstützen:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -206,44 +224,44 @@ msgstr "" "ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo immer es " "nötig ist. Bitte erwägen Sie eine Spende unter ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "Debug-Statements aktivieren" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "„Veraltet“-Warnung verbergen" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "Git-Submodules nicht überspringen" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "Meson-Teilprojekte nicht überspringen" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "kein Multiprocessing verwenden" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "Stammverzeichnis des Projekts bestimmen" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "zeige die Versionsnummer des Programms und beende" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "Unterkommandos" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -254,20 +272,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "alle nicht-konformen Dateien zeigen" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -305,24 +323,28 @@ msgstr "" "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " "versehen?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "Komponentenliste im SPDX-Format ausgeben" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "Listet alle unterstützten SPDX-Lizenzen auf" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' konnte nicht als UTF-8 decodiert werden." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -331,7 +353,7 @@ msgstr "" "'{dep5}' konnte nicht geparst werden. Wir erhielten folgende Fehlermeldung: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" @@ -438,30 +460,30 @@ msgstr "Die folgenden Argumente sind erforderlich: license" msgid "cannot use --output with more than one license" msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -472,16 +494,13 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "Verhindert Ausgabe" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "formatiert Ausgabe als JSON" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "formatiert Ausgabe als rohen Text" #: src/reuse/lint.py:45 @@ -612,58 +631,58 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "EMPFEHLUNGEN" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Veraltete Lizenzen:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Lizenzen ohne Dateiendung:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Unbenutzte Lizenzen:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' abgedeckt durch .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, fuzzy, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -673,30 +692,30 @@ msgstr "" "unkommentierbar gekennzeichnet; suche ihre Inhalte nicht nach REUSE-" "Informationen." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "erkenne Identifikator von '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} hat keine Dateiendung" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -709,14 +728,14 @@ msgstr "" "Lizenzliste unter steht oder mit 'LicenseRef-' " "beginnt und eine Dateiendung hat." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -724,17 +743,17 @@ msgstr "" "Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " "nicht installiert" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -747,7 +766,7 @@ msgstr "" "beginnen nicht mit 'LicenseRef-'. FAQ zu benutzerdefinierten Lizenzen: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -761,7 +780,7 @@ msgstr "" "aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " "hier: " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -771,7 +790,7 @@ msgstr "" "Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-Dateierweiterung. " "Bitte benennen Sie die Datei(en) entsprechend um." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -786,7 +805,7 @@ msgstr "" "fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " "'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -801,14 +820,14 @@ msgstr "" "Lizenztext löschen, wenn Sie sicher sind, dass keine Datei oder Code-" "Schnipsel darunter lizenziert ist." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/eo.po b/po/eo.po index c1f8d1ed7..0b3c6fbcd 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for more information, and " @@ -186,17 +203,17 @@ msgstr "" "reuse.software/> por pli da informo, kaj por " "la reta dokumentado." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Subtenu la laboradon de FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -206,44 +223,44 @@ msgstr "" "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " "pripensi fari donacon ĉe ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "ŝalti sencimigajn ordonojn" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "kaŝi avertojn de evitindaĵoj" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "ne preterpasi Git-submodulojn" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "ne preterpasi Meson-subprojektojn" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "ne uzi plurprocesoradon" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "difini radikon de la projekto" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "montri versionumeron de programo kaj eliri" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "subkomandoj" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -254,20 +271,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "listigi ĉiujn nekonformajn dosierojn" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -302,31 +319,35 @@ msgstr "" "\n" "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "presi la pecoliston de la projekto en SPDX-formo" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "ne povis malkodi '{dep5}' kiel UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" @@ -433,30 +454,30 @@ msgstr "la sekvaj argumentoj nepras: license" msgid "cannot use --output with more than one license" msgstr "ne povas uzi --output kun pli ol unu permesilo" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -466,16 +487,12 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -602,88 +619,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' ne estas valida SPDX Permesila Identigilo." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Arĥaikigitaj permesiloj:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Permesiloj sen dosiersufikso:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Neuzataj permesiloj:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' ne estas valida SPDX Permesila Identigilo." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' sub .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "precizigante identigilon de '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} ne havas dosiersufikson" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -695,7 +712,7 @@ msgstr "" "Certigu ke la permesilo estas en la listo ĉe aŭ " "ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -703,23 +720,23 @@ msgstr "" "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " "{other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -727,7 +744,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -736,14 +753,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -752,7 +769,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -761,14 +778,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/es.po b/po/es.po index 467b0bb99..d6de1a0d4 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-05-09 08:19+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish for more information, and " @@ -191,7 +209,7 @@ msgstr "" "información, y para acceder a la " "documentación en línea." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -199,11 +217,11 @@ msgstr "" "Esta versión de reuse es compatible con la versión {} de la Especificación " "REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Apoya el trabajo de la FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -214,43 +232,43 @@ msgstr "" "necesario. Por favor, considera el hacer una donación en ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "habilita instrucciones de depuración" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "ocultar las advertencias de que está obsoleto" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "no omitas los submódulos de Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "no te saltes los subproyectos de Meson" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "no utilices multiproceso" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "define el origen del proyecto" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "muestra la versión del programa y sale" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -261,20 +279,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -311,24 +329,28 @@ msgstr "" "\n" "- ¿Tienen todos los ficheros información válida sobre copyright y licencia?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la lista de materiales del proyecto en formato SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "Lista de todas las licencias SPDX compatibles" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' no pudo ser decodificado como UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -337,7 +359,7 @@ msgstr "" "{dep5}' no pudo ser analizado. Recibimos el siguiente mensaje de error: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" @@ -446,30 +468,30 @@ msgstr "se requieren los siguientes parámetros: license" msgid "cannot use --output with more than one license" msgstr "no se puede utilizar --output con más de una licencia" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -481,16 +503,13 @@ msgstr "" "el comentario generado carece del mensaje de copyright o de las frases de " "licencia" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "impide la producción" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "formato de salida JSON" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "formatea la salida como un texto plano" #: src/reuse/lint.py:45 @@ -621,58 +640,58 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "RECOMENDACIONES" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' no es un Identificador SPDX de Licencia válido." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licencias obsoletas:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licencias sin extensión de fichero:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licencias no utilizadas:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' no es un Identificador SPDX de Licencia válido." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' cubierto por .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -681,30 +700,30 @@ msgstr "" "Se ha detectado que '{path}' es un archivo binario; no se ha buscado " "información REUTILIZABLE en su contenido." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinando el identificador de '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} no tiene extensión de fichero" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -717,7 +736,7 @@ msgstr "" "alojada en , o de que empieza por 'LicenseRef-', " "y de que posee una extensión de fichero." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -725,7 +744,7 @@ msgstr "" "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " "{other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -733,17 +752,17 @@ msgstr "" "el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " "está instalado" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -756,7 +775,7 @@ msgstr "" "'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -770,7 +789,7 @@ msgstr "" "los nuevos identificadores recomendados se encuentran aquí: " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -780,7 +799,7 @@ msgstr "" "con la licencia en el directorio 'LICENCIAS' no tiene una extensión '.txt'. " "Cambie el nombre de los archivos en consecuencia." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -796,7 +815,7 @@ msgstr "" "En el caso de las licencias personalizadas (que empiezan por 'LicenseRef-'), " "deberá añadir estos archivos usted mismo." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -811,7 +830,7 @@ msgstr "" "elimine el texto de la licencia no utilizado si está seguro de que ningún " "archivo o fragmento de código tiene una licencia como tal." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -822,7 +841,7 @@ msgstr "" "archivos. Encontrará los archivos afectados en la parte superior como parte " "de los mensajes de los errores registrados." -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/fr.po b/po/fr.po index a3262d8ac..c44b0ccac 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French for more information, and " @@ -194,7 +212,7 @@ msgstr "" "REUSE. Voir pour plus d'informations, et pour la documentation en ligne." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -202,11 +220,11 @@ msgstr "" "Cette version de reuse est compatible avec la version {} de la spécification " "REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Soutenir le travail de la FSFE :" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -216,45 +234,45 @@ msgstr "" "permettent de continuer à travailler pour le Logiciel Libre partout où c'est " "nécessaire. Merci d'envisager de faire un don ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "activer les instructions de débogage" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "masquer les avertissements d'obsolescence" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "ne pas omettre les sous-modules Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "ne pas omettre les sous-projets Meson" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "ne pas utiliser le multiprocessing" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "définition de la racine (root) du projet" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "voir la version du programme et quitter" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "sous-commandes" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" "ajoute les informations de droits d'auteur et de licence dans les en-têtes " "des fichiers" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -274,19 +292,19 @@ msgstr "" "En utilisant --contributor, vous pouvez spécifier les personnes ou entités " "ayant contribué aux fichiers spécifiés sans être détenteurs de copyright." -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "télécharge une licence et la placer dans le répertoire LICENSES" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Télécharge une licence dans le répertoire LICENSES." -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "liste tous les fichiers non-conformes" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -324,24 +342,28 @@ msgstr "" "- Tous les fichiers disposent-ils de données de droits d'auteur et de " "licence valides ?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la nomenclature du projet au format SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "liste toutes les licences SPDX acceptées" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "convertit .reuse/dep5 en REUSE.toml" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{path}' n'a pas pu être lu en UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -350,7 +372,7 @@ msgstr "" "'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " "suivant : {message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" @@ -459,7 +481,7 @@ msgstr "les arguments suivants sont nécessaires : licence" msgid "cannot use --output with more than one license" msgstr "--output ne peut pas être utilisé avec plus d'une licence" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, fuzzy, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -467,7 +489,7 @@ msgstr "" "{attr_name} doit être un(e) {type_name} (obtenu {value} qui est un(e) " "{value_class})." -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, fuzzy, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -476,18 +498,18 @@ msgstr "" "Les éléments de la collection {attr_name} doivent être des {type_name} " "(obtenu {item_value} qui et un(e) {item_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} ne doit pas être vide." -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, fuzzy, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} doit être un(e) {type} (obtenu {value} qui est un {value_type})." -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, fuzzy, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -501,16 +523,13 @@ msgstr "" "les commentaires générés ne contiennent pas de ligne ou d'expression de " "droits d'auteur ou de licence" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "empêche la sortie" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "applique le format JSON à la sortie" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "applique le format texte brut pour la sortie" #: src/reuse/lint.py:45 @@ -643,52 +662,52 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "RECOMMANDATIONS" +#: src/reuse/lint.py:280 +#, fuzzy, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "{path} : la licence {lic} est manquante\n" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "{path} : erreur de lecture\n" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "{path}  : pas d'identifiant de licence\n" + +#: src/reuse/lint.py:293 +#, fuzzy, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "{path} : pas de copyright\n" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path} : mauvaise licence {lic}\n" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path} : licence dépréciée\n" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path} : licence sans extension de fichier\n" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path} : licence inutilisée\n" -#: src/reuse/lint.py:319 -#, fuzzy, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path} : la licence {lic} est manquante\n" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path} : erreur de lecture\n" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}  : pas d'identifiant de licence\n" - -#: src/reuse/lint.py:334 -#, fuzzy, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path} : pas de copyright\n" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' est couvert par {global_path}" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, fuzzy, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." @@ -696,7 +715,7 @@ msgstr "" "'{path}' est couvert en exclusivité par REUSE.toml. Contenu du fichier non " "lu." -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, fuzzy, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -705,7 +724,7 @@ msgstr "" "'{path}' a été détecté comme étant un fichier binaire, les informations " "REUSE n'y sont pas recherchées." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 #, fuzzy msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " @@ -714,7 +733,7 @@ msgstr "" "'.reuse/dep5' est déprécié. L'utilisation de REUSE.toml est recommandée. " "Utilisez `reuse convert-dep5` pour convertir." -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, fuzzy, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -724,17 +743,17 @@ msgstr "" "pas guarder les deux fichiers en même temps, ils ne sont pas inter-" "compatibles." -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "résolution de l'identifiant de '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} n'a pas d'extension de fichier" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -747,13 +766,13 @@ msgstr "" "fournie à, soit qu'elle débute par 'LicenseRef-' " "et qu'elle contient une extension de fichier." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " @@ -762,17 +781,17 @@ msgstr "" "le projet '{}' n'est pas un dépôt VCS ou le logiciel VCS requis n'est pas " "installé" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -785,7 +804,7 @@ msgstr "" "identifiants personnalisés ne commencent pas par 'LicenseRef-'. FAQ à propos " "des licences personnalisées : https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -799,7 +818,7 @@ msgstr "" "leur nouvel identifiant recommandé peut être trouvé ici : " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 #, fuzzy msgid "" "Fix licenses without file extension: At least one license text file in the " @@ -810,7 +829,7 @@ msgstr "" "licence dans le dossier 'LICENSES' n'a pas l'extension de fichier '.txt'. " "Veuillez renommes ce(s) fichier(s)." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -825,7 +844,7 @@ msgstr "" "fichiers licence manquants. Pour les licences personnalisées (commençant par " "'LicenseRef-'), vous devez ajouter ces fichiers vous-même." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 #, fuzzy msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " @@ -841,7 +860,7 @@ msgstr "" "de licence inutiles si vous êtes sûr qu'aucun document n'est concerné par " "ces licences." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 #, fuzzy msgid "" "Fix read errors: At least one of the files in your directory cannot be read " @@ -852,7 +871,7 @@ msgstr "" "peut pas être lu par l'outil. Vérifiez ces permissions. Vous trouverez les " "fichiers concernés en tête de la sortie, avec les messages d'erreur." -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/gl.po b/po/gl.po index 56c2b55ce..394d6d8ff 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for more information, and " @@ -183,18 +200,18 @@ msgstr "" " para máis información e para a documentación en liña." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versión de reuse é compatible coa versión {} da especificación REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Apoie o traballo da FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -204,44 +221,44 @@ msgstr "" "traballando polo software libre onde sexa necesario. Considere facer unha " "doazón a ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "habilitar sentencias de depuración" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "non empregue multiprocesamento" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "definir a raíz do proxecto" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "mostrar o número de versión do programa e saír" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "engadir copyright e licenza na cabeceira dos arquivos" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -252,20 +269,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "listar todos os arquivos que non cumplen os criterios" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -301,31 +318,35 @@ msgstr "" "\n" "- Todos os arquivos teñen información correcta de copyright e licenza?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiales do proxecto en formato SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" @@ -432,30 +453,30 @@ msgstr "requirense os seguintes argumentos: licenza" msgid "cannot use --output with more than one license" msgstr "non se pode usar --output con máis dunha licenza" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -466,16 +487,12 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "o comentario xerado non ten liñas de copyright ou expresións de licenza" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -606,88 +623,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' non é un Identificador de Licenza SPDX válido." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenzas obsoletas:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenzas sen extensión de arquivo:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenzas non usadas:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' non é un Identificador de Licenza SPDX válido." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' cuberto por .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "resolvendo o identificador de '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ten extensión de arquivo" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -700,7 +717,7 @@ msgstr "" " ou que comeza con 'LicenseRef-' e ten unha " "extensión de arquivo." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -708,23 +725,23 @@ msgstr "" "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " "{other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -732,7 +749,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -741,14 +758,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -757,7 +774,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -766,14 +783,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/it.po b/po/it.po index 6ddc32d84..900faf991 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for more information, and " @@ -184,7 +201,7 @@ msgstr "" " per maggiori informazioni, e per accedere alla documentazione in linea." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -192,11 +209,11 @@ msgstr "" "Questa versione di reuse è compatibile con la versione {} della Specifica " "REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Sostieni il lavoro della FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -207,46 +224,46 @@ msgstr "" "necessario. Prendi in considerazione di fare una donazione su ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "abilita le istruzioni di debug" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "non utilizzare il multiprocessing" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "impostare la directory principale del progetto" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "mostra la versione del programma ed esce" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "sottocomandi" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" "aggiunge le informazioni sul copyright e sulla licenza nell'intestazione dei " "file" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -257,20 +274,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "lista dei file non conformi" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -307,31 +324,35 @@ msgstr "" "\n" "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" @@ -438,30 +459,30 @@ msgstr "sono richiesti i seguenti parametri: license" msgid "cannot use --output with more than one license" msgstr "non puoi usare --output con più di una licenza" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -473,16 +494,12 @@ msgstr "" "nel commento generato mancano le linee sul copyright o le espressioni di " "licenza" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -612,88 +629,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' non è un valido Identificativo di Licenza SPDX." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenze obsolete:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenze senza estensione del file:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenze non utilizzate:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' non è un valido Identificativo di Licenza SPDX." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' verificato da .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinazione dell'identificativo di '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ha l'estensione del file" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -706,7 +723,7 @@ msgstr "" "licenze elencate su o che inizi con " "'LicenseRef-', e che abbia un'estensione del file." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -714,23 +731,23 @@ msgstr "" "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " "{other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -738,7 +755,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -747,14 +764,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -763,7 +780,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -772,14 +789,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/nl.po b/po/nl.po index 413b196d3..77d365389 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for more information, and " @@ -185,18 +202,18 @@ msgstr "" " voor meer informatie en voor de online documentatie." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Deze versie van reuse is compatibel met versie {} van de REUSE Specificatie." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Ondersteun het werk van de FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -206,45 +223,45 @@ msgstr "" "verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " "donatie te maken bij ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "zet debug statements aan" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "gebruik geen multiprocessing" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "bepaal de root van het project" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "versienummer van het programma laten zien en verlaten" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "subcommando's" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" "voeg auteursrechts- en licentie-informatie toe aan de headers van bestanden" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -255,20 +272,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "lijst maken van alle bestanden die tekortschieten" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -305,31 +322,35 @@ msgstr "" "\n" "- Bevatten alle bestanden geldige informatie over auteursricht en licenties?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "print de materiaallijst van het project in SPDX-formaat" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "%s kon niet gedecodeerd worden" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" @@ -437,30 +458,30 @@ msgstr "de volgende argumenten zijn verplicht: licentie" msgid "cannot use --output with more than one license" msgstr "kan --output niet met meer dan een licentie gebruiken" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -471,16 +492,12 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -609,89 +626,89 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' is geen geldige SPDX Licentie Identificatie." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Verouderde licenties:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenties zonder bestandsextensie:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Ongebruikte licenties:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' is geen geldige SPDX Licentie Identificatie." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' valt onder .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "identificatie van '{path}' bepalen" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} heeft geen bestandsextensie" # Niet helemaal duidelijk hoe resolving hier wordt bedoeld. -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -704,7 +721,7 @@ msgstr "" "die gevonden kan worden op of dat deze begint " "met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -712,23 +729,23 @@ msgstr "" "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " "{other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -736,7 +753,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -745,14 +762,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -761,7 +778,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -770,14 +787,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/pt.po b/po/pt.po index 3b2286656..b7fc7aac7 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese for more information, and " @@ -183,18 +200,18 @@ msgstr "" " para mais informação e para documentação em linha." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versão do reuse é compatível com a versão {} da especificação REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Apoiar o trabalho da FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -204,44 +221,44 @@ msgstr "" "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " "Considere fazer um donativo em ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "activar expressões de depuração" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "não usar multi-processamento" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "definir a raíz do projecto" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "mostrar o número de versão do programa e sair" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "sub-comandos" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -252,20 +269,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "listar todos os ficheiros não conformes" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -303,31 +320,35 @@ msgstr "" "- Todos os ficheiros têm informação válida de direitos de autor e de " "licenciamento?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiais do projecto em formato SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" @@ -434,30 +455,30 @@ msgstr "são requeridos os seguintes argumentos: licença" msgid "cannot use --output with more than one license" msgstr "não se pode usar --output com mais do que uma licença" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -469,16 +490,12 @@ msgstr "" "o comentário gerado não tem linhas de direitos de autor ou expressões de " "licenciamento" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -609,88 +626,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' não é um Identificador de Licença SPDX válido." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenças descontinuadas:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenças sem extensão de ficheiro:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenças não usadas:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' não é um Identificador de Licença SPDX válido." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' abrangido por .reuse/dep5" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "a determinar o identificador de '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} não tem extensão de ficheiro" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -703,30 +720,30 @@ msgstr "" "publicada em ou que começa por 'LicenseRef-' e " "tem uma extensão de ficheiro." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -734,7 +751,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -743,14 +760,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -759,7 +776,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -768,14 +785,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/reuse.pot b/po/reuse.pot index 0a4e2fd6b..554d42fa6 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -173,67 +173,84 @@ msgstr "" msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" -#: src/reuse/_main.py:39 +#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 +msgid "prevents output" +msgstr "" + +#: src/reuse/_lint_file.py:31 +msgid "formats output as errors per line (default)" +msgstr "" + +#: src/reuse/_lint_file.py:38 +msgid "files to lint" +msgstr "" + +#: src/reuse/_lint_file.py:48 +#, python-brace-format +msgid "'{file}' is not inside of '{root}'" +msgstr "" + +#: src/reuse/_main.py:41 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " "making a donation at ." msgstr "" -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -244,19 +261,19 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 msgid "Download a license and place it in the LICENSES/ directory." msgstr "" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -277,31 +294,35 @@ msgid "" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" @@ -403,30 +424,30 @@ msgstr "" msgid "cannot use --output with more than one license" msgstr "" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -436,16 +457,12 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -568,88 +585,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:280 #, python-brace-format -msgid "{path}: bad license {lic}\n" +msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:285 #, python-brace-format -msgid "{lic_path}: deprecated license\n" +msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:289 #, python-brace-format -msgid "{lic_path}: license without file extension\n" +msgid "{path}: no license identifier\n" msgstr "" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:293 #, python-brace-format -msgid "{lic_path}: unused license\n" +msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:319 +#: src/reuse/lint.py:320 #, python-brace-format -msgid "{path}: missing license {lic}\n" +msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:326 +#: src/reuse/lint.py:327 #, python-brace-format -msgid "{path}: read error\n" +msgid "{lic_path}: deprecated license\n" msgstr "" -#: src/reuse/lint.py:330 +#: src/reuse/lint.py:334 #, python-brace-format -msgid "{path}: no license identifier\n" +msgid "{lic_path}: license without file extension\n" msgstr "" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:343 #, python-brace-format -msgid "{path}: no copyright notice\n" +msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -658,29 +675,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -688,7 +705,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -697,14 +714,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -713,7 +730,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -722,14 +739,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/ru.po b/po/ru.po index d083a16c3..2e6b47be5 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian for more information, and " @@ -187,7 +205,7 @@ msgstr "" "информацию см. на сайте , а онлайн-документацию - " "на сайте ." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -195,11 +213,11 @@ msgstr "" "Эта версия повторного использования совместима с версией {} спецификации " "REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Поддержите работу ФСПО:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -210,44 +228,44 @@ msgstr "" "обеспечения везде, где это необходимо. Пожалуйста, рассмотрите возможность " "сделать пожертвование по адресу ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "включить отладочные операторы" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "скрыть предупреждения об устаревании" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "не пропускайте подмодули Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "не пропускайте мезонные подпроекты" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "не используйте многопроцессорную обработку" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "определить корень проекта" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "показать номер версии программы и выйти" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "подкоманды" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" "добавьте в заголовок файлов информацию об авторских правах и лицензировании" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -267,19 +285,19 @@ msgstr "" "которые внесли свой вклад, но не являются владельцами авторских прав на " "данные файлы." -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "список всех файлов, не соответствующих требованиям" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -317,24 +335,28 @@ msgstr "" "- Все ли файлы содержат достоверную информацию об авторских правах и " "лицензировании?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "распечатать ведомость материалов проекта в формате SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "список всех поддерживаемых лицензий SPDX" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "Преобразование .reuse/dep5 в REUSE.toml" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{path}' не может быть декодирован как UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -343,7 +365,7 @@ msgstr "" "'{path}' не может быть разобран. Мы получили следующее сообщение об ошибке: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не удалось разобрать '{expression}'" @@ -451,7 +473,7 @@ msgstr "необходимы следующие аргументы: лиценз msgid "cannot use --output with more than one license" msgstr "Невозможно использовать --output с более чем одной лицензией" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -459,7 +481,7 @@ msgstr "" "{attr_name} должно быть {type_name} (получено {value}, которое является " "{value_class})." -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -468,18 +490,18 @@ msgstr "" "Элемент в коллекции {attr_name} должен быть {type_name} (получил " "{item_value}, который является {item_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не должно быть пустым." -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} должно быть {type} (получено {value}, которое является {value_type})." -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -493,16 +515,13 @@ msgstr "" "В сгенерированном комментарии отсутствуют строки об авторских правах или " "выражениях лицензии" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "предотвращает выход" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "форматирует вывод в формате JSON" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "Форматирует вывод в виде обычного текста" #: src/reuse/lint.py:45 @@ -627,59 +646,59 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "РЕКОМЕНДАЦИИ" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "{path}: отсутствует лицензия {lic}\n" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "{path}: ошибка чтения\n" + #: src/reuse/lint.py:289 #, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "{path}: нет идентификатора лицензии\n" + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "{path}: нет уведомления об авторских правах\n" + +#: src/reuse/lint.py:320 +#, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: плохая лицензия {lic}\n" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: устаревшая лицензия\n" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: лицензия без расширения файла\n" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: неиспользуемая лицензия\n" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: отсутствует лицензия {lic}\n" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: ошибка чтения\n" - -#: src/reuse/lint.py:330 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: нет идентификатора лицензии\n" - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: нет уведомления об авторских правах\n" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' покрыт {global_path}" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" "'{path}' покрывается исключительно REUSE.toml. Не читать содержимое файла." -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -688,7 +707,7 @@ msgstr "" "'{path}' был обнаружен как двоичный файл; поиск информации о REUSE в его " "содержимом не производится." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -696,7 +715,7 @@ msgstr "" "'.reuse/dep5' является устаревшим. Вместо него рекомендуется использовать " "REUSE.toml. Для преобразования используйте `reuse convert-dep5`." -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -705,17 +724,17 @@ msgstr "" "Найдены оба файла '{new_path}' и '{old_path}'. Вы не можете хранить оба " "файла одновременно; они несовместимы." -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "определяющий идентификатор '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "У {path} нет расширения файла" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -728,14 +747,14 @@ msgstr "" " или что она начинается с 'LicenseRef-' и имеет " "расширение файла." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -743,17 +762,17 @@ msgstr "" "Проект '{}' не является репозиторием VCS или в нем не установлено " "необходимое программное обеспечение VCS" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не удалось прочитать '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "При разборе '{path}' произошла непредвиденная ошибка" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -767,7 +786,7 @@ msgstr "" "задаваемые вопросы о пользовательских лицензиях: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -780,7 +799,7 @@ msgstr "" "reuse/dep5', была устаревшей в SPDX. Текущий список и рекомендуемые новые " "идентификаторы можно найти здесь: " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -790,7 +809,7 @@ msgstr "" "лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. Пожалуйста, " "переименуйте файл(ы) соответствующим образом." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -806,7 +825,7 @@ msgstr "" "лицензий (начинающихся с 'LicenseRef-') вам нужно добавить эти файлы " "самостоятельно." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -821,7 +840,7 @@ msgstr "" "неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " "фрагмент кода не лицензируется как таковой." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -832,7 +851,7 @@ msgstr "" "Затронутые файлы вы найдете в верхней части вывода в виде сообщений об " "ошибках." -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/sv.po b/po/sv.po index 8acf274d2..94cc2f392 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-01-08 20:06+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish for more information, and " @@ -172,7 +189,7 @@ msgstr "" "reuse.software/> för mer information och för " "den web-baserade dokumentationen." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -180,11 +197,11 @@ msgstr "" "Den här versionen av reuse är kompatibel med version {} av REUSE-" "specifikationen." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Stötta FSFE's arbete:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -194,43 +211,43 @@ msgstr "" "möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. Vänligen " "överväg att göra en donation till ." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "hoppa inte över undermoduler för Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "hoppa inte över underprojekt för Meson" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "definiera roten av projektet" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "visa programmets versionsnummer och avsluta" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -241,20 +258,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "lista alla filer som inte uppfyller kraven" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -275,24 +292,28 @@ msgid "" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "lista alla SPDX-licenser som stöds" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' kunde inte avkodas som UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -300,7 +321,7 @@ msgid "" msgstr "" "'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kunde inte tolka '{expression}'" @@ -404,30 +425,30 @@ msgstr "följande argument behövs: licens" msgid "cannot use --output with more than one license" msgstr "kan inte använda --output med mer än en licens" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -437,16 +458,12 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +msgid "formats output as plain text (default)" msgstr "" #: src/reuse/lint.py:45 @@ -569,88 +586,88 @@ msgstr "" msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:280 #, python-brace-format -msgid "{path}: bad license {lic}\n" +msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:285 #, python-brace-format -msgid "{lic_path}: deprecated license\n" +msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:289 #, python-brace-format -msgid "{lic_path}: license without file extension\n" +msgid "{path}: no license identifier\n" msgstr "" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:293 #, python-brace-format -msgid "{lic_path}: unused license\n" +msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:319 +#: src/reuse/lint.py:320 #, python-brace-format -msgid "{path}: missing license {lic}\n" +msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:326 +#: src/reuse/lint.py:327 #, python-brace-format -msgid "{path}: read error\n" +msgid "{lic_path}: deprecated license\n" msgstr "" -#: src/reuse/lint.py:330 +#: src/reuse/lint.py:334 #, python-brace-format -msgid "{path}: no license identifier\n" +msgid "{lic_path}: license without file extension\n" msgstr "" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:343 #, python-brace-format -msgid "{path}: no copyright notice\n" +msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -659,29 +676,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -689,7 +706,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -698,14 +715,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -714,7 +731,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -723,14 +740,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/tr.po b/po/tr.po index 0ade67ed9..8683662cb 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for more information, and " @@ -184,17 +202,17 @@ msgstr "" " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "FSFE'nin çalışmalarını destekleyin:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -204,43 +222,43 @@ msgstr "" "Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "hata ayıklama cümlelerini etkinleştirir" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "kullanımdan kaldırma uyarılarını gizle" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "Git alt modüllerini atlamaz" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "Meson alt projelerini atlamaz" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "çoklu işlem kullanmaz" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "projenin kökünü tanımlar" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "programın sürüm numarasını gösterip çıkar" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "alt komutlar" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -251,20 +269,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "bütün uyumsuz dosyaları listeler" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -299,31 +317,35 @@ msgstr "" "\n" "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "tüm desteklenen SPDK lisanslarını listeler" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, fuzzy, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr ".reuse/dep5 utf-8 olarak çözümlenemiyor" -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" @@ -428,30 +450,30 @@ msgstr "şu değişkenler gerekiyor: license" msgid "cannot use --output with more than one license" msgstr "--output birden fazla lisansla birlikte kullanılamıyor" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -461,16 +483,13 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "çıktıyı önler" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "çıktıyı JSON olarak biçimlendirir" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "çıktıyı düz metin olarak biçimlendirir" #: src/reuse/lint.py:45 @@ -596,88 +615,88 @@ msgstr "Maalesef, projeniz REUSE Belirtiminin {} sürümüyle uyumlu değil :-(" msgid "RECOMMENDATIONS" msgstr "" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + #: src/reuse/lint.py:289 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/lint.py:320 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Modası geçmiş lisanslar:" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Dosya uzantısı olmayan lisanslar:" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Kullanılmayan lisanslar:" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "" - -#: src/reuse/lint.py:330 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' .reuse/dep5 ile kapsanıyor" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "'{path}' kimliği belirleniyor" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} dosya uzantısına sahip değil" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -690,31 +709,31 @@ msgstr "" "veya 'LicenseRef-' ile başladığından ve bir dosya uzantısına sahip " "olduğundan emin olun." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} hem {path} hem de {other_path} için SPDX Lisans Kimliğidir" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -722,7 +741,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -731,14 +750,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -747,7 +766,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -756,14 +775,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/uk.po b/po/uk.po index 0681f4fe9..0d71f37cd 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,11 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-22 09:37+0000\n" +"POT-Creation-Date: 2024-09-10 10:35+0000\n" "PO-Revision-Date: 2024-09-03 09:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -174,7 +174,25 @@ msgstr "" "'{path}' — це двійковий файл, тому для заголовка використовується " "'{new_path}'" -#: src/reuse/_main.py:39 +#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 +msgid "prevents output" +msgstr "запобігає виводу" + +#: src/reuse/_lint_file.py:31 +#, fuzzy +msgid "formats output as errors per line (default)" +msgstr "форматує вивід у вигляді помилок на рядок" + +#: src/reuse/_lint_file.py:38 +msgid "files to lint" +msgstr "" + +#: src/reuse/_lint_file.py:48 +#, python-brace-format +msgid "'{file}' is not inside of '{root}'" +msgstr "" + +#: src/reuse/_main.py:41 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -184,17 +202,17 @@ msgstr "" "software/> для отримання додаткових відомостей і перегляду онлайн-документації." -#: src/reuse/_main.py:45 +#: src/reuse/_main.py:47 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." -#: src/reuse/_main.py:48 +#: src/reuse/_main.py:50 msgid "Support the FSFE's work:" msgstr "Підтримати роботу FSFE:" -#: src/reuse/_main.py:52 +#: src/reuse/_main.py:54 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -205,43 +223,43 @@ msgstr "" "де це необхідно. Будь ласка, розгляньте можливість підтримати нас на " "." -#: src/reuse/_main.py:75 +#: src/reuse/_main.py:77 msgid "enable debug statements" msgstr "увімкнути інструкції налагодження" -#: src/reuse/_main.py:80 +#: src/reuse/_main.py:82 msgid "hide deprecation warnings" msgstr "сховати попередження про застарілість" -#: src/reuse/_main.py:85 +#: src/reuse/_main.py:87 msgid "do not skip over Git submodules" msgstr "не пропускати підмодулі Git" -#: src/reuse/_main.py:90 +#: src/reuse/_main.py:92 msgid "do not skip over Meson subprojects" msgstr "не пропускати підпроєкти Meson" -#: src/reuse/_main.py:95 +#: src/reuse/_main.py:97 msgid "do not use multiprocessing" msgstr "не використовувати багатопроцесорність" -#: src/reuse/_main.py:102 +#: src/reuse/_main.py:104 msgid "define root of project" msgstr "визначити кореневий каталог проєкту" -#: src/reuse/_main.py:107 +#: src/reuse/_main.py:109 msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" -#: src/reuse/_main.py:111 +#: src/reuse/_main.py:113 msgid "subcommands" msgstr "підкоманди" -#: src/reuse/_main.py:118 +#: src/reuse/_main.py:120 msgid "add copyright and licensing into the header of files" msgstr "додати авторські права та ліцензії в заголовок файлів" -#: src/reuse/_main.py:121 +#: src/reuse/_main.py:123 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -260,19 +278,19 @@ msgstr "" " За допомогою --contributor ви можете вказати особу або організацію, яка " "зробила внесок, але не є власником авторських прав на дані файли." -#: src/reuse/_main.py:140 +#: src/reuse/_main.py:142 msgid "download a license and place it in the LICENSES/ directory" msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:144 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." -#: src/reuse/_main.py:151 +#: src/reuse/_main.py:153 msgid "list all non-compliant files" msgstr "список усіх несумісних файлів" -#: src/reuse/_main.py:154 +#: src/reuse/_main.py:156 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -308,24 +326,28 @@ msgstr "" "\n" "- Чи всі файли мають дійсні відомості про авторські права та ліцензії?" -#: src/reuse/_main.py:181 +#: src/reuse/_main.py:183 +msgid "list non-compliant files from specified list of files" +msgstr "" + +#: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" msgstr "друкувати опис матеріалів проєкту у форматі SPDX" -#: src/reuse/_main.py:189 +#: src/reuse/_main.py:199 msgid "list all supported SPDX licenses" msgstr "список всіх підтримуваних ліцензій SPDX" -#: src/reuse/_main.py:198 +#: src/reuse/_main.py:208 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "конвертувати .reuse/dep5 у REUSE.toml" -#: src/reuse/_main.py:263 +#: src/reuse/_main.py:273 #, python-brace-format msgid "'{path}' could not be decoded as UTF-8." msgstr "'{path}' не може бути декодовано як UTF-8." -#: src/reuse/_main.py:269 +#: src/reuse/_main.py:279 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -334,7 +356,7 @@ msgstr "" "'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:218 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" @@ -441,14 +463,14 @@ msgstr "необхідні такі аргументи: license" msgid "cannot use --output with more than one license" msgstr "не можна використовувати --output з кількома ліцензіями" -#: src/reuse/global_licensing.py:109 +#: src/reuse/global_licensing.py:108 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/global_licensing.py:122 +#: src/reuse/global_licensing.py:121 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -457,17 +479,17 @@ msgstr "" "Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " "що є {item_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:132 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не повинне бути порожнім." -#: src/reuse/global_licensing.py:156 +#: src/reuse/global_licensing.py:155 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." -#: src/reuse/global_licensing.py:179 +#: src/reuse/global_licensing.py:178 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -481,16 +503,13 @@ msgstr "" "у згенерованому коментарі відсутні рядки про авторські права або вирази " "ліцензії" -#: src/reuse/lint.py:30 -msgid "prevents output" -msgstr "запобігає виводу" - #: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "форматує вивід як JSON" #: src/reuse/lint.py:39 -msgid "formats output as plain text" +#, fuzzy +msgid "formats output as plain text (default)" msgstr "форматує вивід як звичайний текст" #: src/reuse/lint.py:45 @@ -613,58 +632,58 @@ msgstr "На жаль, ваш проєкт не сумісний із версі msgid "RECOMMENDATIONS" msgstr "РЕКОМЕНДАЦІЇ" +#: src/reuse/lint.py:280 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "{path}: пропущена ліцензія {lic}\n" + +#: src/reuse/lint.py:285 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "{path}: помилка читання\n" + #: src/reuse/lint.py:289 #, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "{path}: немає ідентифікатора ліцензії\n" + +#: src/reuse/lint.py:293 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "{path}: без повідомлення про авторське право\n" + +#: src/reuse/lint.py:320 +#, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: погана ліцензія {lic}\n" -#: src/reuse/lint.py:296 +#: src/reuse/lint.py:327 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: застаріла ліцензія\n" -#: src/reuse/lint.py:303 +#: src/reuse/lint.py:334 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: ліцензія без розширення файлу\n" -#: src/reuse/lint.py:312 +#: src/reuse/lint.py:343 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: невикористана ліцензія\n" -#: src/reuse/lint.py:319 -#, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: пропущена ліцензія {lic}\n" - -#: src/reuse/lint.py:326 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: помилка читання\n" - -#: src/reuse/lint.py:330 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: немає ідентифікатора ліцензії\n" - -#: src/reuse/lint.py:334 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: без повідомлення про авторське право\n" - -#: src/reuse/project.py:262 +#: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' покрито за рахунок {global_path}" -#: src/reuse/project.py:270 +#: src/reuse/project.py:330 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." -#: src/reuse/project.py:277 +#: src/reuse/project.py:337 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -673,7 +692,7 @@ msgstr "" "'{path}' виявлено як двійковий файл або його розширення позначено таким, що " "не коментується; пошук інформації у його вмісті для REUSE не виконується." -#: src/reuse/project.py:334 +#: src/reuse/project.py:394 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -681,7 +700,7 @@ msgstr "" "'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " "REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." -#: src/reuse/project.py:348 +#: src/reuse/project.py:408 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -690,17 +709,17 @@ msgstr "" "Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати обидва " "файли одночасно, вони несумісні." -#: src/reuse/project.py:414 +#: src/reuse/project.py:474 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "визначення ідентифікатора '{path}'" -#: src/reuse/project.py:422 +#: src/reuse/project.py:482 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} не має розширення файлу" -#: src/reuse/project.py:432 +#: src/reuse/project.py:492 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -713,14 +732,14 @@ msgstr "" "spdx.org/licenses/> або що вона починається з 'LicenseRef-' і має розширення " "файлу." -#: src/reuse/project.py:444 +#: src/reuse/project.py:504 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" -#: src/reuse/project.py:483 +#: src/reuse/project.py:543 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -728,17 +747,17 @@ msgstr "" "проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS не " "встановлено" -#: src/reuse/report.py:310 +#: src/reuse/report.py:152 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не вдалося прочитати '{path}'" -#: src/reuse/report.py:317 +#: src/reuse/report.py:157 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Під час аналізу '{path}' сталася неочікувана помилка" -#: src/reuse/report.py:438 +#: src/reuse/report.py:510 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -751,7 +770,7 @@ msgstr "" "Часті запитання про користувацькі ліцензії: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:449 +#: src/reuse/report.py:521 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -764,7 +783,7 @@ msgstr "" "застаріла для SPDX. Поточний список і відповідні рекомендовані нові " "ідентифікатори можна знайти тут: " -#: src/reuse/report.py:460 +#: src/reuse/report.py:532 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -774,7 +793,7 @@ msgstr "" "ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " "файл(и) відповідно." -#: src/reuse/report.py:469 +#: src/reuse/report.py:541 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -789,7 +808,7 @@ msgstr "" "будь-які відсутні ідентифікатори. Для користувацьких ліцензій (починаючи з " "'LicenseRef-') вам потрібно додати ці файли самостійно." -#: src/reuse/report.py:481 +#: src/reuse/report.py:553 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -803,7 +822,7 @@ msgstr "" "відповідні ліцензовані файли, або видаліть невикористаний текст ліцензії, " "якщо ви впевнені, що жоден файл або фрагмент коду не ліцензований як такий." -#: src/reuse/report.py:492 +#: src/reuse/report.py:564 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -814,7 +833,7 @@ msgstr "" "відповідні файли у верхній частині виводу як частину зареєстрованих " "повідомлень про помилки." -#: src/reuse/report.py:501 +#: src/reuse/report.py:573 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " From 05ed3ffb272c77d3059e8e841bde4b412761aa38 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 10 Sep 2024 14:24:48 +0200 Subject: [PATCH 032/156] Bump to REUSE Specification 3.3 Signed-off-by: Carmen Bianca BAKKER --- README.md | 4 ++-- changelog.d/changed/00_spec-3.3.md | 3 +++ src/reuse/__init__.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 changelog.d/changed/00_spec-3.3.md diff --git a/README.md b/README.md index 33705fdc3..66107ce92 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ recommendations. - Documentation: and - Source code: - PyPI: -- REUSE: 3.2 +- REUSE: 3.3 - Python: 3.8+ ## Table of contents @@ -179,7 +179,7 @@ To check against the recommendations, use `reuse lint`: ~/Projects/reuse-tool $ reuse lint [...] -Congratulations! Your project is compliant with version 3.2 of the REUSE Specification :-) +Congratulations! Your project is compliant with version 3.3 of the REUSE Specification :-) ``` This tool can do various more things, detailed in the documentation. Here a diff --git a/changelog.d/changed/00_spec-3.3.md b/changelog.d/changed/00_spec-3.3.md new file mode 100644 index 000000000..823338dd0 --- /dev/null +++ b/changelog.d/changed/00_spec-3.3.md @@ -0,0 +1,3 @@ +- Bumped REUSE Specification version to + [version 3.3](https://reuse.software/spec-3.3). This is a small change. + (#1069) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 7325e9a71..d73cb9a34 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -36,7 +36,7 @@ __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" __license__ = "Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND GPL-3.0-or-later" -__REUSE_version__ = "3.2" +__REUSE_version__ = "3.3" _LOGGER = logging.getLogger(__name__) From 81a4ac45b89a8949e227f6219600b1b49dcea986 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 10 Sep 2024 19:07:12 +0000 Subject: [PATCH 033/156] Translated using Weblate (Ukrainian) Currently translated at 100.0% (182 of 182 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/uk/ --- po/uk.po | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/po/uk.po b/po/uk.po index 0d71f37cd..471cb6edb 100644 --- a/po/uk.po +++ b/po/uk.po @@ -9,10 +9,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-10 10:35+0000\n" -"PO-Revision-Date: 2024-09-03 09:09+0000\n" +"PO-Revision-Date: 2024-09-11 19:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -179,18 +179,17 @@ msgid "prevents output" msgstr "запобігає виводу" #: src/reuse/_lint_file.py:31 -#, fuzzy msgid "formats output as errors per line (default)" -msgstr "форматує вивід у вигляді помилок на рядок" +msgstr "форматує вивід у вигляді помилок на рядок (усталено)" #: src/reuse/_lint_file.py:38 msgid "files to lint" -msgstr "" +msgstr "файли для перевірки" #: src/reuse/_lint_file.py:48 #, python-brace-format msgid "'{file}' is not inside of '{root}'" -msgstr "" +msgstr "'{file}' не розміщено в '{root}'" #: src/reuse/_main.py:41 msgid "" @@ -328,7 +327,7 @@ msgstr "" #: src/reuse/_main.py:183 msgid "list non-compliant files from specified list of files" -msgstr "" +msgstr "список невідповідних файлів із вказаного списку файлів" #: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" @@ -508,9 +507,8 @@ msgid "formats output as JSON" msgstr "форматує вивід як JSON" #: src/reuse/lint.py:39 -#, fuzzy msgid "formats output as plain text (default)" -msgstr "форматує вивід як звичайний текст" +msgstr "форматує вивід як звичайний текст (усталено)" #: src/reuse/lint.py:45 msgid "formats output as errors per line" From b19d51fd7b37c6044eb3b9416bf3ddf97e277b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=2E=20E=2E=20Kalayc=C4=B1?= Date: Thu, 12 Sep 2024 16:02:47 +0200 Subject: [PATCH 034/156] Remove duplicates --- AUTHORS.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 7b46b5762..a4abbbce7 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -40,7 +40,6 @@ Contributors - flow - pd - Roberto Bauglir -- T. E. Kalayci - John Mulligan - Kevin Broch - Benoit Rolandeau @@ -141,7 +140,6 @@ Contributors - Ryan Schmidt - Sebastian Crane - Sebastien Morais -- T. E. Kalaycı - Vishesh Handa - Vlad-Stefan Harbuz - Yaman Qalieh From 9285a9797687a903d8df97beae205ce67fb565e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Fri, 13 Sep 2024 10:06:40 +0000 Subject: [PATCH 035/156] Translated using Weblate (Czech) Currently translated at 100.0% (182 of 182 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/po/cs.po b/po/cs.po index 0ecb955f1..1f74898e0 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-10 10:35+0000\n" -"PO-Revision-Date: 2024-08-17 00:09+0000\n" +"PO-Revision-Date: 2024-09-14 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.7\n" +"X-Generator: Weblate 5.8-dev\n" #: src/reuse/_annotate.py:74 #, python-brace-format @@ -178,18 +178,17 @@ msgid "prevents output" msgstr "brání výstupu" #: src/reuse/_lint_file.py:31 -#, fuzzy msgid "formats output as errors per line (default)" -msgstr "formátuje výstup jako chyby na řádek" +msgstr "formátuje výstup jako chyby na řádek (výchozí)" #: src/reuse/_lint_file.py:38 msgid "files to lint" -msgstr "" +msgstr "soubory do lint" #: src/reuse/_lint_file.py:48 #, python-brace-format msgid "'{file}' is not inside of '{root}'" -msgstr "" +msgstr "'{file}' není uvnitř '{root}'" #: src/reuse/_main.py:41 msgid "" @@ -325,7 +324,7 @@ msgstr "" #: src/reuse/_main.py:183 msgid "list non-compliant files from specified list of files" -msgstr "" +msgstr "seznam nevyhovujících souborů ze zadaného seznamu souborů" #: src/reuse/_main.py:191 msgid "print the project's bill of materials in SPDX format" @@ -504,9 +503,8 @@ msgid "formats output as JSON" msgstr "formátuje výstup jako JSON" #: src/reuse/lint.py:39 -#, fuzzy msgid "formats output as plain text (default)" -msgstr "formátuje výstup jako prostý text" +msgstr "formátuje výstup jako prostý text (výchozí)" #: src/reuse/lint.py:45 msgid "formats output as errors per line" @@ -673,7 +671,7 @@ msgstr "{lic_path}: nepoužitá licence\n" #: src/reuse/project.py:322 #, python-brace-format msgid "'{path}' covered by {global_path}" -msgstr "'{path}' zahrnuto v {global_path}" +msgstr "'{path}' zahrnuto v {global_path}" #: src/reuse/project.py:330 #, python-brace-format From d9a2b5120532704c5ce641129a191149cf1df17b Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 14:41:58 +0200 Subject: [PATCH 036/156] Remove bidirectional aggregation between VCSStrategy and Project Hooray! This had always been bad design. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/project.py | 12 ++++++------ src/reuse/report.py | 2 +- src/reuse/vcs.py | 46 ++++++++++++++++++++------------------------ 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/reuse/project.py b/src/reuse/project.py index 8ab6d37c4..f21b86b5f 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -80,7 +80,7 @@ class Project: def __init__( self, root: StrPath, - vcs_strategy: Optional[Type[VCSStrategy]] = None, + vcs_strategy: Optional[VCSStrategy] = None, license_map: Optional[Dict[str, Dict]] = None, licenses: Optional[Dict[str, Path]] = None, global_licensing: Optional[GlobalLicensing] = None, @@ -90,8 +90,8 @@ def __init__( self.root = Path(root) if vcs_strategy is None: - vcs_strategy = VCSStrategyNone - self.vcs_strategy = vcs_strategy(self) + vcs_strategy = VCSStrategyNone(root) + self.vcs_strategy = vcs_strategy if license_map is None: license_map = LICENSE_MAP @@ -530,13 +530,13 @@ def _find_licenses(self) -> Dict[str, Path]: return license_files @classmethod - def _detect_vcs_strategy(cls, root: StrPath) -> Type[VCSStrategy]: + def _detect_vcs_strategy(cls, root: StrPath) -> VCSStrategy: """For each supported VCS, check if the software is available and if the directory is a repository. If not, return :class:`VCSStrategyNone`. """ for strategy in all_vcs_strategies(): if strategy.EXE and strategy.in_repo(root): - return strategy + return strategy(root) _LOGGER.info( _( @@ -544,4 +544,4 @@ def _detect_vcs_strategy(cls, root: StrPath) -> Type[VCSStrategy]: " software is not installed" ).format(root) ) - return VCSStrategyNone + return VCSStrategyNone(root) diff --git a/src/reuse/report.py b/src/reuse/report.py index e9267b280..70032d0b3 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -59,7 +59,7 @@ def __init__( # pickled. new_project = Project( project.root, - vcs_strategy=project.vcs_strategy.__class__, + vcs_strategy=project.vcs_strategy, license_map=project.license_map, licenses=project.licenses.copy(), # TODO: adjust this method/class to account for REUSE.toml as diff --git a/src/reuse/vcs.py b/src/reuse/vcs.py index 924703071..daca12da8 100644 --- a/src/reuse/vcs.py +++ b/src/reuse/vcs.py @@ -24,6 +24,7 @@ PIJUL_EXE, StrPath, execute_command, + relative_from_root, ) if TYPE_CHECKING: @@ -37,9 +38,8 @@ class VCSStrategy(ABC): EXE: str | None = None - @abstractmethod - def __init__(self, project: Project): - self.project = project + def __init__(self, root: StrPath): + self.root = Path(root) @abstractmethod def is_ignored(self, path: StrPath) -> bool: @@ -72,10 +72,6 @@ def find_root(cls, cwd: Optional[StrPath] = None) -> Optional[Path]: class VCSStrategyNone(VCSStrategy): """Strategy that is used when there is no VCS.""" - def __init__(self, project: Project): - # pylint: disable=useless-super-delegation - super().__init__(project) - def is_ignored(self, path: StrPath) -> bool: return False @@ -96,8 +92,8 @@ class VCSStrategyGit(VCSStrategy): EXE = GIT_EXE - def __init__(self, project: Project): - super().__init__(project) + def __init__(self, root: StrPath): + super().__init__(root) if not self.EXE: raise FileNotFoundError("Could not find binary for Git") self._all_ignored_files = self._find_all_ignored_files() @@ -121,7 +117,7 @@ def _find_all_ignored_files(self) -> Set[Path]: # Separate output with \0 instead of \n. "-z", ] - result = execute_command(command, _LOGGER, cwd=self.project.root) + result = execute_command(command, _LOGGER, cwd=self.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} @@ -135,7 +131,7 @@ def _find_submodules(self) -> Set[Path]: "--get-regexp", r"\.path$", ] - result = execute_command(command, _LOGGER, cwd=self.project.root) + result = execute_command(command, _LOGGER, cwd=self.root) # The final element may be an empty string. Filter it. submodule_entries = [ entry @@ -146,12 +142,12 @@ def _find_submodules(self) -> Set[Path]: return {Path(entry.splitlines()[1]) for entry in submodule_entries} def is_ignored(self, path: StrPath) -> bool: - path = self.project.relative_from_root(path) + path = relative_from_root(path, self.root) return path in self._all_ignored_files def is_submodule(self, path: StrPath) -> bool: return any( - self.project.relative_from_root(path).resolve() + relative_from_root(path, self.root).resolve() == submodule_path.resolve() for submodule_path in self._submodules ) @@ -189,8 +185,8 @@ class VCSStrategyHg(VCSStrategy): EXE = HG_EXE - def __init__(self, project: Project): - super().__init__(project) + def __init__(self, root: StrPath): + super().__init__(root) if not self.EXE: raise FileNotFoundError("Could not find binary for Mercurial") self._all_ignored_files = self._find_all_ignored_files() @@ -211,12 +207,12 @@ def _find_all_ignored_files(self) -> Set[Path]: "--no-status", "--print0", ] - result = execute_command(command, _LOGGER, cwd=self.project.root) + result = execute_command(command, _LOGGER, cwd=self.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} def is_ignored(self, path: StrPath) -> bool: - path = self.project.relative_from_root(path) + path = relative_from_root(path, self.root) return path in self._all_ignored_files def is_submodule(self, path: StrPath) -> bool: @@ -256,8 +252,8 @@ class VCSStrategyJujutsu(VCSStrategy): EXE = JUJUTSU_EXE - def __init__(self, project: Project): - super().__init__(project) + def __init__(self, root: StrPath): + super().__init__(root) if not self.EXE: raise FileNotFoundError("Could not find binary for Jujutsu") self._all_tracked_files = self._find_all_tracked_files() @@ -267,12 +263,12 @@ def _find_all_tracked_files(self) -> Set[Path]: Return a set of all files tracked in the current jj revision """ command = [str(self.EXE), "files"] - result = execute_command(command, _LOGGER, cwd=self.project.root) + result = execute_command(command, _LOGGER, cwd=self.root) all_files = result.stdout.decode("utf-8").split("\n") return {Path(file_) for file_ in all_files if file_} def is_ignored(self, path: StrPath) -> bool: - path = self.project.relative_from_root(path) + path = relative_from_root(path, self.root) for tracked in self._all_tracked_files: if tracked.parts[: len(path.parts)] == path.parts: @@ -321,8 +317,8 @@ class VCSStrategyPijul(VCSStrategy): EXE = PIJUL_EXE - def __init__(self, project: Project): - super().__init__(project) + def __init__(self, root: StrPath): + super().__init__(root) if not self.EXE: raise FileNotFoundError("Could not find binary for Pijul") self._all_tracked_files = self._find_all_tracked_files() @@ -330,12 +326,12 @@ def __init__(self, project: Project): def _find_all_tracked_files(self) -> Set[Path]: """Return a set of all files tracked by pijul.""" command = [str(self.EXE), "list"] - result = execute_command(command, _LOGGER, cwd=self.project.root) + result = execute_command(command, _LOGGER, cwd=self.root) all_files = result.stdout.decode("utf-8").splitlines() return {Path(file_) for file_ in all_files} def is_ignored(self, path: StrPath) -> bool: - path = self.project.relative_from_root(path) + path = relative_from_root(path, self.root) return path not in self._all_tracked_files def is_submodule(self, path: StrPath) -> bool: From 90369041b54c9ce56b549c2b2ab762ff4ec29f10 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 15:28:49 +0200 Subject: [PATCH 037/156] Refactor iter_files out of Project This is kind of annoying, but it is necessary for some work I want to do in global_licensing. Fortunately this was surprisingly easy; iter_files is the first function ever written for REUSE, so I expected that it would be more tangled up. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/project.py | 217 +++++++++++++++++++++++++------------------ 1 file changed, 127 insertions(+), 90 deletions(-) diff --git a/src/reuse/project.py b/src/reuse/project.py index f21b86b5f..3de00d302 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -22,6 +22,7 @@ Collection, DefaultDict, Dict, + Generator, Iterator, List, NamedTuple, @@ -170,71 +171,6 @@ def from_directory( return project - def _iter_files( - self, - directory: Optional[StrPath] = None, - subset_files: Optional[Collection[StrPath]] = None, - ) -> Iterator[Path]: - # pylint: disable=too-many-branches - if directory is None: - directory = self.root - directory = Path(directory) - if subset_files is not None: - subset_files = cast( - Set[Path], {Path(file_).resolve() for file_ in subset_files} - ) - - for root_str, dirs, files in os.walk(directory): - root = Path(root_str) - _LOGGER.debug("currently walking in '%s'", root) - - # Don't walk ignored directories - for dir_ in list(dirs): - the_dir = root / dir_ - if subset_files is not None and not any( - is_relative_to(file_, the_dir.resolve()) - for file_ in subset_files - ): - continue - if self._is_path_ignored(the_dir): - _LOGGER.debug("ignoring '%s'", the_dir) - dirs.remove(dir_) - elif the_dir.is_symlink(): - _LOGGER.debug("skipping symlink '%s'", the_dir) - dirs.remove(dir_) - elif ( - not self.include_submodules - and self.vcs_strategy.is_submodule(the_dir) - ): - _LOGGER.info( - "ignoring '%s' because it is a submodule", the_dir - ) - dirs.remove(dir_) - - # Filter files. - for file_ in files: - the_file = root / file_ - if ( - subset_files is not None - and the_file.resolve() not in subset_files - ): - continue - if self._is_path_ignored(the_file): - _LOGGER.debug("ignoring '%s'", the_file) - continue - if the_file.is_symlink(): - _LOGGER.debug("skipping symlink '%s'", the_file) - continue - # Suppressing this error because I simply don't want to deal - # with that here. - with contextlib.suppress(OSError): - if the_file.stat().st_size == 0: - _LOGGER.debug("skipping 0-sized file '%s'", the_file) - continue - - _LOGGER.debug("yielding '%s'", the_file) - yield the_file - def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: """Yield all files in *directory* and its subdirectories. @@ -255,7 +191,14 @@ def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: Args: directory: The directory in which to search. """ - return self._iter_files(directory=directory) + if directory is None: + directory = self.root + return iter_files( + directory, + include_submodules=self.include_submodules, + include_meson_subprojects=self.include_meson_subprojects, + vcs_strategy=self.vcs_strategy, + ) def subset_files( self, files: Collection[StrPath], directory: Optional[StrPath] = None @@ -269,7 +212,15 @@ def subset_files( yielded. directory: The directory in which to search. """ - return self._iter_files(directory=directory, subset_files=files) + if directory is None: + directory = self.root + return iter_files( + directory=directory, + subset_files=files, + include_submodules=self.include_submodules, + include_meson_subprojects=self.include_meson_subprojects, + vcs_strategy=self.vcs_strategy, + ) def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: """Return REUSE info of *path*. @@ -413,29 +364,6 @@ def find_global_licensing( candidate = GlobalLicensingFound(root, NestedReuseTOML) return candidate - def _is_path_ignored(self, path: Path) -> bool: - """Is *path* ignored by some mechanism?""" - name = path.name - parent_parts = path.parent.parts - parent_dir = parent_parts[-1] if len(parent_parts) > 0 else "" - if path.is_file(): - for pattern in _IGNORE_FILE_PATTERNS: - if pattern.match(name): - return True - elif path.is_dir(): - for pattern in _IGNORE_DIR_PATTERNS: - if pattern.match(name): - return True - if not self.include_meson_subprojects: - for pattern in _IGNORE_MESON_PARENT_DIR_PATTERNS: - if pattern.match(parent_dir): - return True - - if self.vcs_strategy.is_ignored(path): - return True - - return False - def _identifier_of_license(self, path: Path) -> str: """Figure out the SPDX License identifier of a license given its path. The name of the path (minus its extension) should be a valid SPDX @@ -545,3 +473,112 @@ def _detect_vcs_strategy(cls, root: StrPath) -> VCSStrategy: ).format(root) ) return VCSStrategyNone(root) + + +def is_path_ignored( + path: Path, + subset_files: Optional[Collection[StrPath]] = None, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, +) -> bool: + """Is *path* ignored by some mechanism?""" + # pylint: disable=too-many-return-statements,too-many-branches + name = path.name + parent_parts = path.parent.parts + parent_dir = parent_parts[-1] if len(parent_parts) > 0 else "" + + if path.is_symlink(): + _LOGGER.debug("skipping symlink '%s'", path) + return True + + if path.is_file(): + if subset_files is not None and path.resolve() not in subset_files: + continue + for pattern in _IGNORE_FILE_PATTERNS: + if pattern.match(name): + return True + # Suppressing this error because I simply don't want to deal + # with that here. + with contextlib.suppress(OSError): + if path.stat().st_size == 0: + _LOGGER.debug("skipping 0-sized file '%s'", path) + return True + + elif path.is_dir(): + if subset_files is not None and not any( + is_relative_to(file_, path.resolve()) for file_ in subset_files + ): + return True + for pattern in _IGNORE_DIR_PATTERNS: + if pattern.match(name): + return True + if not include_meson_subprojects: + for pattern in _IGNORE_MESON_PARENT_DIR_PATTERNS: + if pattern.match(parent_dir): + _LOGGER.info( + "ignoring '%s' because it is a Meson subproject", path + ) + return True + if ( + not include_submodules + and vcs_strategy + and vcs_strategy.is_submodule(path) + ): + _LOGGER.info("ignoring '%s' because it is a submodule", path) + return True + + if vcs_strategy and vcs_strategy.is_ignored(path): + return True + + return False + + +def iter_files( + directory: StrPath, + subset_files: Optional[Collection[StrPath]] = None, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, +) -> Generator[Path, None, None]: + """Yield all Covered Files in *directory* and its subdirectories according + to the REUSE Specification. + """ + directory = Path(directory) + if subset_files is not None: + subset_files = cast( + Set[Path], {Path(file_).resolve() for file_ in subset_files} + ) + + for root_str, dirs, files in os.walk(directory): + root = Path(root_str) + _LOGGER.debug("currently walking in '%s'", root) + + # Don't walk ignored directories + for dir_ in list(dirs): + the_dir = root / dir_ + if is_path_ignored( + the_dir, + subset_files=subset_files, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ): + _LOGGER.debug("ignoring '%s'", the_dir) + dirs.remove(dir_) + + # Filter files. + for file_ in files: + the_file = root / file_ + if is_path_ignored( + the_file, + subset_files=subset_files, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ): + _LOGGER.debug("ignoring '%s'", the_file) + continue + + _LOGGER.debug("yielding '%s'", the_file) + yield the_file From 3b25418d58f0c10e0ef65256c21fe6b15c998e73 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 17:23:35 +0200 Subject: [PATCH 038/156] Factor out iter_files into its own module covered_files Signed-off-by: Carmen Bianca BAKKER --- src/reuse/covered_files.py | 135 +++++++++++++ src/reuse/project.py | 118 +---------- tests/conftest.py | 2 + tests/test_covered_files.py | 350 ++++++++++++++++++++++++++++++++ tests/test_project.py | 385 ++++++------------------------------ 5 files changed, 546 insertions(+), 444 deletions(-) create mode 100644 src/reuse/covered_files.py create mode 100644 tests/test_covered_files.py diff --git a/src/reuse/covered_files.py b/src/reuse/covered_files.py new file mode 100644 index 000000000..01db5eaa4 --- /dev/null +++ b/src/reuse/covered_files.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""The REUSE Specification has a concept called Covered Files; files which must +contain licensing information. Some files in a project are not Covered Files, +and thus needn't contain licensing information. This module contains all that +logic. +""" + +import contextlib +import logging +import os +from pathlib import Path +from typing import Collection, Generator, Optional, Set, cast + +from . import ( + _IGNORE_DIR_PATTERNS, + _IGNORE_FILE_PATTERNS, + _IGNORE_MESON_PARENT_DIR_PATTERNS, +) +from ._util import StrPath, is_relative_to +from .vcs import VCSStrategy + +_LOGGER = logging.getLogger(__name__) + + +def is_path_ignored( + path: Path, + subset_files: Optional[Collection[StrPath]] = None, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, +) -> bool: + """Is *path* ignored by some mechanism?""" + # pylint: disable=too-many-return-statements,too-many-branches + name = path.name + parent_parts = path.parent.parts + parent_dir = parent_parts[-1] if len(parent_parts) > 0 else "" + + if path.is_symlink(): + _LOGGER.debug("skipping symlink '%s'", path) + return True + + if path.is_file(): + if subset_files is not None and path.resolve() not in subset_files: + return True + for pattern in _IGNORE_FILE_PATTERNS: + if pattern.match(name): + return True + # Suppressing this error because I simply don't want to deal + # with that here. + with contextlib.suppress(OSError): + if path.stat().st_size == 0: + _LOGGER.debug("skipping 0-sized file '%s'", path) + return True + + elif path.is_dir(): + if subset_files is not None and not any( + is_relative_to(Path(file_), path.resolve()) + for file_ in subset_files + ): + return True + for pattern in _IGNORE_DIR_PATTERNS: + if pattern.match(name): + return True + if not include_meson_subprojects: + for pattern in _IGNORE_MESON_PARENT_DIR_PATTERNS: + if pattern.match(parent_dir): + _LOGGER.info( + "ignoring '%s' because it is a Meson subproject", path + ) + return True + if ( + not include_submodules + and vcs_strategy + and vcs_strategy.is_submodule(path) + ): + _LOGGER.info("ignoring '%s' because it is a submodule", path) + return True + + if vcs_strategy and vcs_strategy.is_ignored(path): + return True + + return False + + +def iter_files( + directory: StrPath, + subset_files: Optional[Collection[StrPath]] = None, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, +) -> Generator[Path, None, None]: + """Yield all Covered Files in *directory* and its subdirectories according + to the REUSE Specification. + """ + directory = Path(directory) + if subset_files is not None: + subset_files = cast( + Set[Path], {Path(file_).resolve() for file_ in subset_files} + ) + + for root_str, dirs, files in os.walk(directory): + root = Path(root_str) + _LOGGER.debug("currently walking in '%s'", root) + + # Don't walk ignored directories + for dir_ in list(dirs): + the_dir = root / dir_ + if is_path_ignored( + the_dir, + subset_files=subset_files, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ): + _LOGGER.debug("ignoring '%s'", the_dir) + dirs.remove(dir_) + + # Filter files. + for file_ in files: + the_file = root / file_ + if is_path_ignored( + the_file, + subset_files=subset_files, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ): + _LOGGER.debug("ignoring '%s'", the_file) + continue + + _LOGGER.debug("yielding '%s'", the_file) + yield the_file diff --git a/src/reuse/project.py b/src/reuse/project.py index 3de00d302..f5a92796d 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -34,13 +34,7 @@ from binaryornot.check import is_binary -from . import ( - _IGNORE_DIR_PATTERNS, - _IGNORE_FILE_PATTERNS, - _IGNORE_MESON_PARENT_DIR_PATTERNS, - IdentifierNotFound, - ReuseInfo, -) +from . import IdentifierNotFound, ReuseInfo from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( _LICENSEREF_PATTERN, @@ -50,6 +44,7 @@ relative_from_root, reuse_info_of_file, ) +from .covered_files import iter_files from .global_licensing import ( GlobalLicensing, NestedReuseTOML, @@ -473,112 +468,3 @@ def _detect_vcs_strategy(cls, root: StrPath) -> VCSStrategy: ).format(root) ) return VCSStrategyNone(root) - - -def is_path_ignored( - path: Path, - subset_files: Optional[Collection[StrPath]] = None, - include_submodules: bool = False, - include_meson_subprojects: bool = False, - vcs_strategy: Optional[VCSStrategy] = None, -) -> bool: - """Is *path* ignored by some mechanism?""" - # pylint: disable=too-many-return-statements,too-many-branches - name = path.name - parent_parts = path.parent.parts - parent_dir = parent_parts[-1] if len(parent_parts) > 0 else "" - - if path.is_symlink(): - _LOGGER.debug("skipping symlink '%s'", path) - return True - - if path.is_file(): - if subset_files is not None and path.resolve() not in subset_files: - continue - for pattern in _IGNORE_FILE_PATTERNS: - if pattern.match(name): - return True - # Suppressing this error because I simply don't want to deal - # with that here. - with contextlib.suppress(OSError): - if path.stat().st_size == 0: - _LOGGER.debug("skipping 0-sized file '%s'", path) - return True - - elif path.is_dir(): - if subset_files is not None and not any( - is_relative_to(file_, path.resolve()) for file_ in subset_files - ): - return True - for pattern in _IGNORE_DIR_PATTERNS: - if pattern.match(name): - return True - if not include_meson_subprojects: - for pattern in _IGNORE_MESON_PARENT_DIR_PATTERNS: - if pattern.match(parent_dir): - _LOGGER.info( - "ignoring '%s' because it is a Meson subproject", path - ) - return True - if ( - not include_submodules - and vcs_strategy - and vcs_strategy.is_submodule(path) - ): - _LOGGER.info("ignoring '%s' because it is a submodule", path) - return True - - if vcs_strategy and vcs_strategy.is_ignored(path): - return True - - return False - - -def iter_files( - directory: StrPath, - subset_files: Optional[Collection[StrPath]] = None, - include_submodules: bool = False, - include_meson_subprojects: bool = False, - vcs_strategy: Optional[VCSStrategy] = None, -) -> Generator[Path, None, None]: - """Yield all Covered Files in *directory* and its subdirectories according - to the REUSE Specification. - """ - directory = Path(directory) - if subset_files is not None: - subset_files = cast( - Set[Path], {Path(file_).resolve() for file_ in subset_files} - ) - - for root_str, dirs, files in os.walk(directory): - root = Path(root_str) - _LOGGER.debug("currently walking in '%s'", root) - - # Don't walk ignored directories - for dir_ in list(dirs): - the_dir = root / dir_ - if is_path_ignored( - the_dir, - subset_files=subset_files, - include_submodules=include_submodules, - include_meson_subprojects=include_meson_subprojects, - vcs_strategy=vcs_strategy, - ): - _LOGGER.debug("ignoring '%s'", the_dir) - dirs.remove(dir_) - - # Filter files. - for file_ in files: - the_file = root / file_ - if is_path_ignored( - the_file, - subset_files=subset_files, - include_submodules=include_submodules, - include_meson_subprojects=include_meson_subprojects, - vcs_strategy=vcs_strategy, - ): - _LOGGER.debug("ignoring '%s'", the_file) - continue - - _LOGGER.debug("yielding '%s'", the_file) - yield the_file diff --git a/tests/conftest.py b/tests/conftest.py index 7b95763c8..40433342e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -66,6 +66,8 @@ sys.implementation.name != "cpython", reason="only CPython supported" ) git = pytest.mark.skipif(not GIT_EXE, reason="requires git") +hg = pytest.mark.skipif(not HG_EXE, reason="requires mercurial") +pijul = pytest.mark.skipif(not PIJUL_EXE, reason="requires pijul") no_root = pytest.mark.xfail(is_root, reason="fails when user is root") posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") diff --git a/tests/test_covered_files.py b/tests/test_covered_files.py new file mode 100644 index 000000000..a60c1a2c0 --- /dev/null +++ b/tests/test_covered_files.py @@ -0,0 +1,350 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for reuse.covered_files.""" + +import os +from pathlib import Path + +from conftest import git, hg, pijul, posix + +from reuse.covered_files import iter_files +from reuse.vcs import VCSStrategyGit, VCSStrategyHg, VCSStrategyPijul + + +class TestIterFiles: + """Test the iter_files function.""" + + def test_simple(self, empty_directory): + """Given a directory with some files, yield all files.""" + (empty_directory / "foo").write_text("foo") + (empty_directory / "bar").write_text("foo") + + assert {file_.name for file_ in iter_files(empty_directory)} == { + "foo", + "bar", + } + + def test_ignore_dot_license(self, empty_directory): + """When file and file.license are present, only yield file.""" + (empty_directory / "foo").write_text("foo") + (empty_directory / "foo.license").write_text("foo") + + assert {file_.name for file_ in iter_files(empty_directory)} == {"foo"} + + def test_ignore_cal_license(self, empty_directory): + """CAL licenses contain SPDX tags referencing themselves. They should be + skipped. + """ + (empty_directory / "CAL-1.0").write_text("foo") + (empty_directory / "CAL-1.0.txt").write_text("foo") + (empty_directory / "CAL-1.0-Combined-Work-Exception").write_text("foo") + (empty_directory / "CAL-1.0-Combined-Work-Exception.txt").write_text( + "foo" + ) + + assert not list(iter_files(empty_directory)) + + def test_ignore_shl_license(self, empty_directory): + """SHL-2.1 contains an SPDX tag referencing itself. It should be + skipped. + """ + (empty_directory / "SHL-2.1").write_text("foo") + (empty_directory / "SHL-2.1.txt").write_text("foo") + + assert not list(iter_files(empty_directory)) + + def test_ignore_git(self, empty_directory): + """When the git directory is present, ignore it.""" + (empty_directory / ".git").mkdir() + (empty_directory / ".git/config").write_text("foo") + + assert not list(iter_files(empty_directory)) + + def test_ignore_hg(self, empty_directory): + """When the hg directory is present, ignore it.""" + (empty_directory / ".hg").mkdir() + (empty_directory / ".hg/config").write_text("foo") + + assert not list(iter_files(empty_directory)) + + def test_ignore_license_copying(self, empty_directory): + """When there are files names LICENSE, LICENSE.ext, COPYING, or + COPYING.ext, ignore them. + """ + (empty_directory / "LICENSE").write_text("foo") + (empty_directory / "LICENSE.txt").write_text("foo") + (empty_directory / "COPYING").write_text("foo") + (empty_directory / "COPYING.txt").write_text("foo") + + assert not list(iter_files(empty_directory)) + + def test_not_ignore_license_copying_no_ext(self, empty_directory): + """Do not ignore files that start with LICENSE or COPYING and are + followed by some non-extension text. + """ + (empty_directory / "LICENSE_README.md").write_text("foo") + (empty_directory / "COPYING2").write_text("foo") + + assert len(list(iter_files(empty_directory))) == 2 + + @posix + def test_ignore_symlinks(self, empty_directory): + """All symlinks must be ignored.""" + (empty_directory / "blob").write_text("foo") + (empty_directory / "symlink").symlink_to("blob") + + assert Path("symlink").absolute() not in iter_files(empty_directory) + + def test_ignore_zero_sized(self, empty_directory): + """Empty files should be skipped.""" + (empty_directory / "foo").touch() + + assert Path("foo").absolute() not in iter_files(empty_directory) + + def test_include_meson_subprojects(self, empty_directory): + """include_meson_subprojects is correctly interpreted.""" + (empty_directory / "foo.py").write_text("foo.py") + subprojects_dir = empty_directory / "subprojects" + subprojects_dir.mkdir() + libfoo_dir = subprojects_dir / "libfoo" + libfoo_dir.mkdir() + (libfoo_dir / "bar.py").write_text("pass") + + assert (libfoo_dir / "bar.py") not in iter_files(empty_directory) + assert (libfoo_dir / "bar.py") in iter_files( + empty_directory, include_meson_subprojects=True + ) + + +class TestIterFilesSubet: + """Tests for subset_files in iter_files.""" + + def test_single(self, fake_repository): + """Only yield the single specified file.""" + result = list( + iter_files( + fake_repository, + subset_files={fake_repository / "src/custom.py"}, + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_two(self, fake_repository): + """Yield multiple specified files.""" + result = set( + iter_files( + fake_repository, + subset_files={ + fake_repository / "src/custom.py", + fake_repository / "src/exception.py", + }, + ) + ) + assert result == { + fake_repository / "src/custom.py", + fake_repository / "src/exception.py", + } + + def test_non_existent(self, fake_repository): + """If a file does not exist, don't yield it.""" + result = list( + iter_files( + fake_repository, + subset_files={ + fake_repository / "src/custom.py", + fake_repository / "not_exist.py", + fake_repository / "also/does/not/exist.py", + }, + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_outside_cwd(self, fake_repository): + """If a file is outside of the project, don't yield it.""" + result = list( + iter_files( + fake_repository, + subset_files={ + fake_repository / "src/custom.py", + (fake_repository / "../outside.py").resolve(), + }, + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_empty(self, fake_repository): + """If no files are provided, yield nothing.""" + result = list(iter_files(fake_repository, subset_files=set())) + assert not result + + def test_list_arg(self, fake_repository): + """Also accepts a list argument.""" + result = list( + iter_files( + fake_repository, + subset_files=[fake_repository / "src/custom.py"], + ) + ) + assert result == [fake_repository / "src/custom.py"] + + def test_relative_path(self, fake_repository): + """Also handles relative paths.""" + result = list( + iter_files(fake_repository, subset_files={"src/custom.py"}) + ) + assert result == [fake_repository / "src/custom.py"] + + +@git +class TestAllFilesGit: + """Test the iter_files function with git.""" + + def test_simple(self, git_repository): + """Given a Git repository where some files are ignored, do not yield + those files. + """ + assert Path("build/hello.py").absolute() not in iter_files( + git_repository, vcs_strategy=VCSStrategyGit(git_repository) + ) + + def test_not_ignored_if_no_strategy(self, git_repository): + """If no strategy is provided, the file is not ignored.""" + assert Path("build/hello.py").absolute() in iter_files(git_repository) + + def test_different_cwd(self, git_repository): + """Given a Git repository where some files are ignored, do not yield + those files. + + Be in a different CWD during the above. + """ + os.chdir(git_repository / "LICENSES") + assert Path("build/hello.py").absolute() not in iter_files( + git_repository, vcs_strategy=VCSStrategyGit(git_repository) + ) + + def test_ignored_contains_space(self, git_repository): + """Files that contain spaces are also ignored.""" + (git_repository / "I contain spaces.pyc").write_text("foo") + assert Path("I contain spaces.pyc").absolute() not in iter_files( + git_repository, vcs_strategy=VCSStrategyGit(git_repository) + ) + + @posix + def test_ignored_contains_newline(self, git_repository): + """Files that contain newlines are also ignored.""" + (git_repository / "hello\nworld.pyc").write_text("foo") + assert Path("hello\nworld.pyc").absolute() not in iter_files( + git_repository, vcs_strategy=VCSStrategyGit(git_repository) + ) + + def test_ignore_submodules(self, submodule_repository): + """Normally ignore submodules.""" + (submodule_repository / "submodule/foo.py").write_text("foo") + assert Path("submodule/foo.py").absolute() not in iter_files( + submodule_repository, + vcs_strategy=VCSStrategyGit(submodule_repository), + ) + + def test_include_submodules(self, submodule_repository): + """If include_submodules is True, include files from the submodule.""" + (submodule_repository / "submodule/foo.py").write_text("foo") + assert Path("submodule/foo.py").absolute() in iter_files( + submodule_repository, + include_submodules=True, + vcs_strategy=VCSStrategyGit(submodule_repository), + ) + + def test_submodule_is_ignored(self, submodule_repository): + """If a submodule is ignored, iter_files should not raise an Exception""" + (submodule_repository / "submodule/foo.py").write_text("foo") + gitignore = submodule_repository / ".gitignore" + contents = gitignore.read_text() + contents += "\nsubmodule/\n" + gitignore.write_text(contents) + assert Path("submodule/foo.py").absolute() not in iter_files( + submodule_repository, + vcs_strategy=VCSStrategyGit(submodule_repository), + ) + + +@hg +class TestAllFilesHg: + """Test the iter_files function with Mercurial.""" + + def test_simple(self, hg_repository): + """Given a mercurial repository where some files are ignored, do not + yield those files. + """ + assert Path("build/hello.py").absolute() not in iter_files( + hg_repository, vcs_strategy=VCSStrategyHg(hg_repository) + ) + + def test_different_cwd(self, hg_repository): + """Given a mercurial repository where some files are ignored, do not + yield those files. + + Be in a different CWD during the above. + """ + os.chdir(hg_repository / "LICENSES") + assert Path("build/hello.py").absolute() not in iter_files( + hg_repository, vcs_strategy=VCSStrategyHg(hg_repository) + ) + + def test_ignored_contains_space(self, hg_repository): + """File names that contain spaces are also ignored.""" + (hg_repository / "I contain spaces.pyc").touch() + assert Path("I contain spaces.pyc").absolute() not in iter_files( + hg_repository, vcs_strategy=VCSStrategyHg(hg_repository) + ) + + @posix + def test_ignored_contains_newline(self, hg_repository): + """File names that contain newlines are also ignored.""" + (hg_repository / "hello\nworld.pyc").touch() + assert Path("hello\nworld.pyc").absolute() not in iter_files( + hg_repository, vcs_strategy=VCSStrategyHg(hg_repository) + ) + + +@pijul +class TestAllFilesPijul: + """Test the iter_files function with Pijul.""" + + def test_simple(self, pijul_repository): + """Given a pijul repository where some files are ignored, do not yield + those files. + """ + assert Path("build/hello.py").absolute() not in iter_files( + pijul_repository, vcs_strategy=VCSStrategyPijul(pijul_repository) + ) + + def test_iter_files_pijul_ignored_different_cwd(self, pijul_repository): + """Given a pijul repository where some files are ignored, do not yield + those files. + + Be in a different CWD during the above. + """ + os.chdir(pijul_repository / "LICENSES") + assert Path("build/hello.py").absolute() not in iter_files( + pijul_repository, vcs_strategy=VCSStrategyPijul(pijul_repository) + ) + + def test_ignored_contains_space(self, pijul_repository): + """File names that contain spaces are also ignored.""" + (pijul_repository / "I contain spaces.pyc").touch() + assert Path("I contain spaces.pyc").absolute() not in iter_files( + pijul_repository, vcs_strategy=VCSStrategyPijul(pijul_repository) + ) + + @posix + def test_ignored_contains_newline(self, pijul_repository): + """File names that contain newlines are also ignored.""" + (pijul_repository / "hello\nworld.pyc").touch() + assert Path("hello\nworld.pyc").absolute() not in iter_files( + pijul_repository, vcs_strategy=VCSStrategyPijul(pijul_repository) + ) diff --git a/tests/test_project.py b/tests/test_project.py index b590aa1bc..6d90c49a1 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -13,13 +13,15 @@ import warnings from inspect import cleandoc from pathlib import Path +from unittest import mock import pytest -from conftest import RESOURCES_DIRECTORY, posix +from conftest import RESOURCES_DIRECTORY from license_expression import LicenseSymbol from reuse import ReuseInfo, SourceType from reuse._util import _LICENSING +from reuse.covered_files import iter_files from reuse.global_licensing import ( GlobalLicensingParseError, NestedReuseTOML, @@ -54,340 +56,67 @@ def test_project_conflicting_global_licensing(empty_directory): Project.from_directory(empty_directory) -def test_all_files(empty_directory): - """Given a directory with some files, yield all files.""" - (empty_directory / "foo").write_text("foo") - (empty_directory / "bar").write_text("foo") +class TestProjectAllFiles: + """Test Project.all_files.""" - project = Project.from_directory(empty_directory) - assert {file_.name for file_ in project.all_files()} == {"foo", "bar"} - - -def test_all_files_ignore_dot_license(empty_directory): - """When file and file.license are present, only yield file.""" - (empty_directory / "foo").write_text("foo") - (empty_directory / "foo.license").write_text("foo") - - project = Project.from_directory(empty_directory) - assert {file_.name for file_ in project.all_files()} == {"foo"} - - -def test_all_files_ignore_cal_license(empty_directory): - """CAL licenses contain SPDX tags referencing themselves. They should be - skipped. - """ - (empty_directory / "CAL-1.0").write_text("foo") - (empty_directory / "CAL-1.0.txt").write_text("foo") - (empty_directory / "CAL-1.0-Combined-Work-Exception").write_text("foo") - (empty_directory / "CAL-1.0-Combined-Work-Exception.txt").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_ignore_shl_license(empty_directory): - """SHL-2.1 contains an SPDX tag referencing itself. It should be skipped.""" - (empty_directory / "SHL-2.1").write_text("foo") - (empty_directory / "SHL-2.1.txt").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_ignore_git(empty_directory): - """When the git directory is present, ignore it.""" - (empty_directory / ".git").mkdir() - (empty_directory / ".git/config").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_ignore_hg(empty_directory): - """When the hg directory is present, ignore it.""" - (empty_directory / ".hg").mkdir() - (empty_directory / ".hg/config").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_ignore_license_copying(empty_directory): - """When there are files named LICENSE, LICENSE.ext, LICENSE-MIT, COPYING, - COPYING.ext, or COPYING-MIT, ignore them. - """ - (empty_directory / "LICENSE").write_text("foo") - (empty_directory / "LICENSE.txt").write_text("foo") - (empty_directory / "LICENSE-MIT").write_text("foo") - (empty_directory / "COPYING").write_text("foo") - (empty_directory / "COPYING.txt").write_text("foo") - (empty_directory / "COPYING-MIT").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_ignore_uk_license(empty_directory): - """Ignore UK spelling of licence.""" - (empty_directory / "LICENCE").write_text("foo") - - project = Project.from_directory(empty_directory) - assert not list(project.all_files()) - - -def test_all_files_not_ignore_license_copying_no_ext(empty_directory): - """Do not ignore files that start with LICENSE or COPYING and are followed - by some non-extension text. - """ - (empty_directory / "LICENSE_README.md").write_text("foo") - (empty_directory / "COPYING2").write_text("foo") - - project = Project.from_directory(empty_directory) - assert len(list(project.all_files())) == 2 - - -@posix -def test_all_files_symlinks(empty_directory): - """All symlinks must be ignored.""" - (empty_directory / "blob").write_text("foo") - (empty_directory / "blob.license").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ + def test_with_mock(self, monkeypatch, empty_directory): + """Instead of testing the entire behaviour, just test that a mock is + called and its value is returned. + """ + mock_iter_files = mock.create_autospec(iter_files) + mock_iter_files.return_value = "foo" + monkeypatch.setattr("reuse.project.iter_files", mock_iter_files) + + project = Project.from_directory(empty_directory) + result = project.all_files(empty_directory) + assert result == "foo" + + mock_iter_files.assert_called_once_with( + empty_directory, + include_submodules=project.include_submodules, + include_meson_subprojects=project.include_meson_subprojects, + vcs_strategy=project.vcs_strategy, ) - ) - (empty_directory / "symlink").symlink_to("blob") - project = Project.from_directory(empty_directory) - assert Path("symlink").absolute() not in project.all_files() - - -def test_all_files_ignore_zero_sized(empty_directory): - """Empty files should be skipped.""" - (empty_directory / "foo").touch() - - project = Project.from_directory(empty_directory) - assert Path("foo").absolute() not in project.all_files() - - -def test_all_files_git_ignored(git_repository): - """Given a Git repository where some files are ignored, do not yield those - files. - """ - project = Project.from_directory(git_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_git_ignored_different_cwd(git_repository): - """Given a Git repository where some files are ignored, do not yield those - files. - - Be in a different CWD during the above. - """ - os.chdir(git_repository / "LICENSES") - project = Project.from_directory(git_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_git_ignored_contains_space(git_repository): - """Files that contain spaces are also ignored.""" - (git_repository / "I contain spaces.pyc").write_text("foo") - project = Project.from_directory(git_repository) - assert Path("I contain spaces.pyc").absolute() not in project.all_files() - - -@posix -def test_all_files_git_ignored_contains_newline(git_repository): - """Files that contain newlines are also ignored.""" - (git_repository / "hello\nworld.pyc").write_text("foo") - project = Project.from_directory(git_repository) - assert Path("hello\nworld.pyc").absolute() not in project.all_files() - - -def test_all_files_submodule_is_ignored(submodule_repository): - """If a submodule is ignored, all_files should not raise an Exception.""" - (submodule_repository / "submodule/foo.py").write_text("foo") - gitignore = submodule_repository / ".gitignore" - contents = gitignore.read_text() - contents += "\nsubmodule/\n" - gitignore.write_text(contents) - project = Project.from_directory(submodule_repository) - assert Path("submodule/foo.py").absolute() not in project.all_files() - - -def test_all_files_hg_ignored(hg_repository): - """Given a mercurial repository where some files are ignored, do not yield - those files. - """ - project = Project.from_directory(hg_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_hg_ignored_different_cwd(hg_repository): - """Given a mercurial repository where some files are ignored, do not yield - those files. - - Be in a different CWD during the above. - """ - os.chdir(hg_repository / "LICENSES") - project = Project.from_directory(hg_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_hg_ignored_contains_space(hg_repository): - """File names that contain spaces are also ignored.""" - (hg_repository / "I contain spaces.pyc").touch() - project = Project.from_directory(hg_repository) - assert Path("I contain spaces.pyc").absolute() not in project.all_files() - - -@posix -def test_all_files_hg_ignored_contains_newline(hg_repository): - """File names that contain newlines are also ignored.""" - (hg_repository / "hello\nworld.pyc").touch() - project = Project.from_directory(hg_repository) - assert Path("hello\nworld.pyc").absolute() not in project.all_files() - - -def test_all_files_jujutsu_ignored(jujutsu_repository): - """Given a jujutsu repository where some files are ignored, do not yield - those files. - """ - project = Project.from_directory(jujutsu_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_jujutsu_ignored_different_cwd(jujutsu_repository): - """Given a jujutsu repository where some files are ignored, do not yield - those files. - - Be in a different CWD during the above. - """ - os.chdir(jujutsu_repository / "LICENSES") - project = Project.from_directory(jujutsu_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_jujutsu_ignored_contains_space(jujutsu_repository): - """File names that contain spaces are also ignored.""" - (jujutsu_repository / "I contain spaces.pyc").touch() - project = Project.from_directory(jujutsu_repository) - assert Path("I contain spaces.pyc").absolute() not in project.all_files() - - -@posix -def test_all_files_jujutsu_ignored_contains_newline(jujutsu_repository): - """File names that contain newlines are also ignored.""" - (jujutsu_repository / "hello\nworld.pyc").touch() - project = Project.from_directory(jujutsu_repository) - assert Path("hello\nworld.pyc").absolute() not in project.all_files() - - -def test_all_files_pijul_ignored(pijul_repository): - """Given a pijul repository where some files are ignored, do not yield - those files. - """ - project = Project.from_directory(pijul_repository) - assert Path("build/hello.py").absolute() not in project.all_files() + def test_with_mock_implicit_dir(self, monkeypatch, empty_directory): + """If no argument is given to Project.iter_files, project.root is + implied. + """ + mock_iter_files = mock.create_autospec(iter_files) + mock_iter_files.return_value = "foo" + monkeypatch.setattr("reuse.project.iter_files", mock_iter_files) + + project = Project.from_directory(empty_directory) + result = project.all_files() + assert result == "foo" + + mock_iter_files.assert_called_once_with( + empty_directory, + include_submodules=project.include_submodules, + include_meson_subprojects=project.include_meson_subprojects, + vcs_strategy=project.vcs_strategy, + ) -def test_all_files_pijul_ignored_different_cwd(pijul_repository): - """Given a pijul repository where some files are ignored, do not yield - those files. + def test_with_mock_includes(self, monkeypatch, empty_directory): + """include_submodules and include_meson_subprojects are true.""" + mock_iter_files = mock.create_autospec(iter_files) + mock_iter_files.return_value = "foo" + monkeypatch.setattr("reuse.project.iter_files", mock_iter_files) - Be in a different CWD during the above. - """ - os.chdir(pijul_repository / "LICENSES") - project = Project.from_directory(pijul_repository) - assert Path("build/hello.py").absolute() not in project.all_files() - - -def test_all_files_pijul_ignored_contains_space(pijul_repository): - """File names that contain spaces are also ignored.""" - (pijul_repository / "I contain spaces.pyc").touch() - project = Project.from_directory(pijul_repository) - assert Path("I contain spaces.pyc").absolute() not in project.all_files() - - -@posix -def test_all_files_pijul_ignored_contains_newline(pijul_repository): - """File names that contain newlines are also ignored.""" - (pijul_repository / "hello\nworld.pyc").touch() - project = Project.from_directory(pijul_repository) - assert Path("hello\nworld.pyc").absolute() not in project.all_files() - - -class TestSubsetFiles: - """Tests for subset_files.""" - - def test_single(self, fake_repository): - """Only yield the single specified file.""" - project = Project.from_directory(fake_repository) - result = list(project.subset_files({fake_repository / "src/custom.py"})) - assert result == [fake_repository / "src/custom.py"] - - def test_two(self, fake_repository): - """Yield multiple specified files.""" - project = Project.from_directory(fake_repository) - result = set( - project.subset_files( - { - fake_repository / "src/custom.py", - fake_repository / "src/exception.py", - } - ) + project = Project.from_directory( + empty_directory, + include_submodules=True, + include_meson_subprojects=True, ) - assert result == { - fake_repository / "src/custom.py", - fake_repository / "src/exception.py", - } - - def test_non_existent(self, fake_repository): - """If a file does not exist, don't yield it.""" - project = Project.from_directory(fake_repository) - result = list( - project.subset_files( - { - fake_repository / "src/custom.py", - fake_repository / "not_exist.py", - fake_repository / "also/does/not/exist.py", - } - ) - ) - assert result == [fake_repository / "src/custom.py"] - - def test_outside_cwd(self, fake_repository): - """If a file is outside of the project, don't yield it.""" - project = Project.from_directory(fake_repository) - result = list( - project.subset_files( - { - fake_repository / "src/custom.py", - (fake_repository / "../outside.py").resolve(), - } - ) + result = project.all_files() + assert result == "foo" + + mock_iter_files.assert_called_once_with( + empty_directory, + include_submodules=project.include_submodules, + include_meson_subprojects=project.include_meson_subprojects, + vcs_strategy=project.vcs_strategy, ) - assert result == [fake_repository / "src/custom.py"] - - def test_empty(self, fake_repository): - """If no files are provided, yield nothing.""" - project = Project.from_directory(fake_repository) - result = list(project.subset_files(set())) - assert not result - - def test_list_arg(self, fake_repository): - """Also accepts a list argument.""" - project = Project.from_directory(fake_repository) - result = list(project.subset_files([fake_repository / "src/custom.py"])) - assert result == [fake_repository / "src/custom.py"] - - def test_relative_path(self, fake_repository): - """Also handles relative paths.""" - project = Project.from_directory(fake_repository) - result = list(project.subset_files({"src/custom.py"})) - assert result == [fake_repository / "src/custom.py"] def test_reuse_info_of_file_does_not_exist(fake_repository): From a8a1f2868c330d0e09acd0103a46066c5987362c Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 18:15:30 +0200 Subject: [PATCH 039/156] Create fixture subproject_repository Signed-off-by: Carmen Bianca BAKKER --- tests/conftest.py | 29 +++++++++++++++++++++ tests/test_main.py | 65 ++++------------------------------------------ 2 files changed, 34 insertions(+), 60 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 40433342e..abcacfe00 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -401,6 +401,35 @@ def submodule_repository( return git_repository +@pytest.fixture() +def subproject_repository(fake_repository: Path) -> Path: + """Add a Meson subproject to the fake repo.""" + (fake_repository / "meson.build").write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2022 Jane Doe + SPDX-License-Identifier: CC0-1.0 + """ + ) + ) + subprojects_dir = fake_repository / "subprojects" + subprojects_dir.mkdir() + libfoo_dir = subprojects_dir / "libfoo" + libfoo_dir.mkdir() + # ./subprojects/foo.wrap has license and linter succeeds + (subprojects_dir / "foo.wrap").write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2022 Jane Doe + SPDX-License-Identifier: CC0-1.0 + """ + ) + ) + # ./subprojects/libfoo/foo.c misses license but is ignored + (libfoo_dir / "foo.c").write_text("foo") + return fake_repository + + @pytest.fixture(scope="session") def reuse_dep5(): """Create a ReuseDep5 object.""" diff --git a/tests/test_main.py b/tests/test_main.py index 94c078f9f..86095ec67 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -150,89 +150,34 @@ def test_lint_submodule_included_fail(submodule_repository, stringio): def test_lint_meson_subprojects(fake_repository, stringio): """Verify that subprojects are ignored.""" - (fake_repository / "meson.build").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: CC0-1.0 - """ - ) - ) - subprojects_dir = fake_repository / "subprojects" - subprojects_dir.mkdir() - libfoo_dir = subprojects_dir / "libfoo" - libfoo_dir.mkdir() - # ./subprojects/foo.wrap has license and linter succeeds - (subprojects_dir / "foo.wrap").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: CC0-1.0 - """ - ) - ) - # ./subprojects/libfoo/foo.c misses license but is ignored - (libfoo_dir / "foo.c").write_text("foo") result = main(["lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() -def test_lint_meson_subprojects_fail(fake_repository, stringio): +def test_lint_meson_subprojects_fail(subproject_repository, stringio): """Verify that files in './subprojects' are not ignored.""" - (fake_repository / "meson.build").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: CC0-1.0 - """ - ) - ) - subprojects_dir = fake_repository / "subprojects" - subprojects_dir.mkdir() # ./subprojects/foo.wrap misses license and linter fails - (subprojects_dir / "foo.wrap").write_text("foo") + (subproject_repository / "subprojects/foo.wrap").write_text("foo") result = main(["lint"], out=stringio) assert result == 1 assert ":-(" in stringio.getvalue() -def test_lint_meson_subprojects_included_fail(fake_repository, stringio): +def test_lint_meson_subprojects_included_fail(subproject_repository, stringio): """When Meson subprojects are included, fail on errors.""" - (fake_repository / "meson.build").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: CC0-1.0 - """ - ) - ) - libfoo_dir = fake_repository / "subprojects/libfoo" - libfoo_dir.mkdir(parents=True) - # ./subprojects/libfoo/foo.c misses license and linter fails - (libfoo_dir / "foo.c").write_text("foo") result = main(["--include-meson-subprojects", "lint"], out=stringio) assert result == 1 assert ":-(" in stringio.getvalue() -def test_lint_meson_subprojects_included(fake_repository, stringio): +def test_lint_meson_subprojects_included(subproject_repository, stringio): """Successfully lint when Meson subprojects are included.""" - (fake_repository / "meson.build").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: CC0-1.0 - """ - ) - ) - libfoo_dir = fake_repository / "subprojects/libfoo" - libfoo_dir.mkdir(parents=True) # ./subprojects/libfoo/foo.c has license and linter succeeds - (libfoo_dir / "foo.c").write_text( + (subproject_repository / "subprojects/libfoo/foo.c").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe From f08708286157829adb926a2482590bb300df72d1 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 18:38:28 +0200 Subject: [PATCH 040/156] Fix performance regression when searching for REUSE.toml Previously, the glob **/REUSE.toml would search _all_ directories, including big directories containing build artefacts that are otherwise ignored by VCS. This commit uses the same logic to find REUSE.toml as any other file is found. It's not super rapid, but it does a heap more filtering. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/global_licensing.py | 41 ++++++++++++++++---- src/reuse/project.py | 36 ++++++++++++++++-- tests/test_global_licensing.py | 69 +++++++++++++++++++++++++++++++++- tests/test_project.py | 2 +- 4 files changed, 134 insertions(+), 14 deletions(-) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 6a659c9ff..6345e6aae 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -40,6 +40,8 @@ from . import ReuseInfo, SourceType from ._util import _LICENSING, StrPath, is_relative_to +from .covered_files import iter_files +from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) @@ -231,7 +233,7 @@ class GlobalLicensing(ABC): @classmethod @abstractmethod - def from_file(cls, path: StrPath) -> "GlobalLicensing": + def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": """Parse the file and create a :class:`GlobalLicensing` object from its contents. @@ -261,7 +263,7 @@ class ReuseDep5(GlobalLicensing): dep5_copyright: Copyright @classmethod - def from_file(cls, path: StrPath) -> "ReuseDep5": + def from_file(cls, path: StrPath, **kwargs: Any) -> "ReuseDep5": path = Path(path) try: with path.open(encoding="utf-8") as fp: @@ -437,7 +439,7 @@ def from_toml(cls, toml: str, source: str) -> "ReuseTOML": return cls.from_dict(tomldict, source) @classmethod - def from_file(cls, path: StrPath) -> "ReuseTOML": + def from_file(cls, path: StrPath, **kwargs: Any) -> "ReuseTOML": with Path(path).open(encoding="utf-8") as fp: return cls.from_toml(fp.read(), str(path)) @@ -483,11 +485,21 @@ class NestedReuseTOML(GlobalLicensing): reuse_tomls: List[ReuseTOML] = attrs.field() @classmethod - def from_file(cls, path: StrPath) -> "GlobalLicensing": + def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": """TODO: *path* is a directory instead of a file.""" + include_submodules: bool = kwargs.get("include_submodules", False) + include_meson_subprojects: bool = kwargs.get( + "include_meson_subprojects", False + ) + vcs_strategy: Optional[VCSStrategy] = kwargs.get("vcs_strategy") tomls = [ ReuseTOML.from_file(toml_path) - for toml_path in cls.find_reuse_tomls(path) + for toml_path in cls.find_reuse_tomls( + path, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ) ] return cls(reuse_tomls=tomls, source=str(path)) @@ -546,9 +558,24 @@ def reuse_info_of( return dict(result) @classmethod - def find_reuse_tomls(cls, path: StrPath) -> Generator[Path, None, None]: + def find_reuse_tomls( + cls, + path: StrPath, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, + ) -> Generator[Path, None, None]: """Find all REUSE.toml files in *path*.""" - return Path(path).rglob("**/REUSE.toml") + return ( + item + for item in iter_files( + path, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ) + if item.name == "REUSE.toml" + ) def _find_relevant_tomls(self, path: StrPath) -> List[ReuseTOML]: found = [] diff --git a/src/reuse/project.py b/src/reuse/project.py index f5a92796d..11612d6b9 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -67,6 +67,10 @@ class GlobalLicensingFound(NamedTuple): cls: Type[GlobalLicensing] +# TODO: The information (root, include_submodules, include_meson_subprojects, +# vcs_strategy) is passed to SO MANY PLACES. Maybe Project should be simplified +# to contain exclusively those values, or maybe these values should be extracted +# out of Project to simplify passing this information around. class Project: """Simple object that holds the project's root, which is necessary for many interactions. @@ -146,9 +150,19 @@ def from_directory( vcs_strategy = cls._detect_vcs_strategy(root) global_licensing: Optional[GlobalLicensing] = None - found = cls.find_global_licensing(root) + found = cls.find_global_licensing( + root, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ) if found: - global_licensing = found.cls.from_file(found.path) + global_licensing = found.cls.from_file( + found.path, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ) project = cls( root, @@ -321,7 +335,11 @@ def relative_from_root(self, path: StrPath) -> Path: @classmethod def find_global_licensing( - cls, root: Path + cls, + root: Path, + include_submodules: bool = False, + include_meson_subprojects: bool = False, + vcs_strategy: Optional[VCSStrategy] = None, ) -> Optional[GlobalLicensingFound]: """Find the path and corresponding class of a project directory's :class:`GlobalLicensing`. @@ -344,9 +362,18 @@ def find_global_licensing( PendingDeprecationWarning, ) candidate = GlobalLicensingFound(dep5_path, ReuseDep5) + + # TODO: the performance of this isn't great. toml_path = None with contextlib.suppress(StopIteration): - toml_path = next(root.rglob("**/REUSE.toml")) + toml_path = next( + NestedReuseTOML.find_reuse_tomls( + root, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, + ) + ) if toml_path is not None: if candidate is not None: raise GlobalLicensingConflict( @@ -357,6 +384,7 @@ def find_global_licensing( ).format(new_path=toml_path, old_path=dep5_path) ) candidate = GlobalLicensingFound(root, NestedReuseTOML) + return candidate def _identifier_of_license(self, path: Path) -> str: diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index bd2b289d8..26325827e 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -25,6 +25,7 @@ ReuseDep5, ReuseTOML, ) +from reuse.vcs import VCSStrategyGit # REUSE-IgnoreStart @@ -699,19 +700,83 @@ def test_one_deep(self, empty_directory): """Find a single REUSE.toml deeper in the directory tree.""" (empty_directory / "src").mkdir() path = empty_directory / "src/REUSE.toml" - path.touch() + path.write_text("version = 1") result = NestedReuseTOML.find_reuse_tomls(empty_directory) assert list(result) == [path] def test_multiple(self, fake_repository_reuse_toml): """Find multiple REUSE.tomls.""" - (fake_repository_reuse_toml / "src/REUSE.toml").touch() + (fake_repository_reuse_toml / "src/REUSE.toml").write_text( + "version = 1" + ) result = NestedReuseTOML.find_reuse_tomls(fake_repository_reuse_toml) assert set(result) == { fake_repository_reuse_toml / "REUSE.toml", fake_repository_reuse_toml / "src/REUSE.toml", } + def test_with_vcs_strategy(self, git_repository): + """Ignore the correct files ignored by the repository.""" + (git_repository / "REUSE.toml").write_text("version = 1") + (git_repository / "build/REUSE.toml").write_text("version =1") + (git_repository / "src/REUSE.toml").write_text("version = 1") + + result = NestedReuseTOML.find_reuse_tomls( + git_repository, vcs_strategy=VCSStrategyGit(git_repository) + ) + assert set(result) == { + git_repository / "REUSE.toml", + git_repository / "src/REUSE.toml", + } + + def test_includes_submodule(self, submodule_repository): + """include_submodules is correctly implemented.""" + (submodule_repository / "REUSE.toml").write_text("version = 1") + (submodule_repository / "submodule/REUSE.toml").write_text( + "version = 1" + ) + + result_without = NestedReuseTOML.find_reuse_tomls( + submodule_repository, + vcs_strategy=VCSStrategyGit(submodule_repository), + ) + assert set(result_without) == {submodule_repository / "REUSE.toml"} + + result_with = NestedReuseTOML.find_reuse_tomls( + submodule_repository, + include_submodules=True, + vcs_strategy=VCSStrategyGit(submodule_repository), + ) + assert set(result_with) == { + submodule_repository / "REUSE.toml", + submodule_repository / "submodule/REUSE.toml", + } + + def test_includes_meson_subprojects(self, subproject_repository): + """include_meson_subprojects is correctly implemented.""" + (subproject_repository / "REUSE.toml").write_text("version = 1") + (subproject_repository / "subprojects/REUSE.toml").write_text( + "version = 1" + ) + (subproject_repository / "subprojects/libfoo/REUSE.toml").write_text( + "version = 1" + ) + + result_without = NestedReuseTOML.find_reuse_tomls(subproject_repository) + assert set(result_without) == { + subproject_repository / "REUSE.toml", + subproject_repository / "subprojects/REUSE.toml", + } + + result_with = NestedReuseTOML.find_reuse_tomls( + subproject_repository, include_meson_subprojects=True + ) + assert set(result_with) == { + subproject_repository / "REUSE.toml", + subproject_repository / "subprojects/REUSE.toml", + subproject_repository / "subprojects/libfoo/REUSE.toml", + } + class TestNestedReuseTOMLReuseInfoOf: """Tests for NestedReuseTOML.reuse_info_of.""" diff --git a/tests/test_project.py b/tests/test_project.py index 6d90c49a1..24991d3bb 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -591,7 +591,7 @@ def test_find_global_licensing_none(empty_directory): def test_find_global_licensing_conflict(fake_repository_dep5): """Expect an error on a conflict""" - (fake_repository_dep5 / "REUSE.toml").touch() + (fake_repository_dep5 / "REUSE.toml").write_text("version = 1") with pytest.raises(GlobalLicensingConflict): Project.find_global_licensing(fake_repository_dep5) From 5651081165ff0530a5e1cbcb5e7175f660d1c4e1 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 19:32:41 +0200 Subject: [PATCH 041/156] Convert Project into attrs class Signed-off-by: Carmen Bianca BAKKER --- src/reuse/project.py | 56 ++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/src/reuse/project.py b/src/reuse/project.py index 11612d6b9..e0b7c9685 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -32,6 +32,7 @@ cast, ) +import attrs from binaryornot.check import is_binary from . import IdentifierNotFound, ReuseInfo @@ -71,42 +72,35 @@ class GlobalLicensingFound(NamedTuple): # vcs_strategy) is passed to SO MANY PLACES. Maybe Project should be simplified # to contain exclusively those values, or maybe these values should be extracted # out of Project to simplify passing this information around. +@attrs.define class Project: """Simple object that holds the project's root, which is necessary for many interactions. """ - # pylint: disable=too-many-arguments - def __init__( - self, - root: StrPath, - vcs_strategy: Optional[VCSStrategy] = None, - license_map: Optional[Dict[str, Dict]] = None, - licenses: Optional[Dict[str, Path]] = None, - global_licensing: Optional[GlobalLicensing] = None, - include_submodules: bool = False, - include_meson_subprojects: bool = False, - ): - self.root = Path(root) - - if vcs_strategy is None: - vcs_strategy = VCSStrategyNone(root) - self.vcs_strategy = vcs_strategy - - if license_map is None: - license_map = LICENSE_MAP - self.license_map = license_map.copy() - self.license_map.update(EXCEPTION_MAP) - self.licenses_without_extension: Dict[str, Path] = {} - - if licenses is None: - licenses = {} - self.licenses = licenses - - self.global_licensing = global_licensing - - self.include_submodules = include_submodules - self.include_meson_subprojects = include_meson_subprojects + root: Path = attrs.field(converter=Path) + include_submodules: bool = False + include_meson_subprojects: bool = False + vcs_strategy: VCSStrategy = attrs.field() + global_licensing: Optional[GlobalLicensing] = None + + # TODO: I want to get rid of these, or somehow refactor this mess. + license_map: Dict[str, Dict] = attrs.field() + licenses: Dict[str, Path] = attrs.field(factory=dict) + + licenses_without_extension: Dict[str, Path] = attrs.field( + init=False, factory=dict + ) + + @vcs_strategy.default + def _default_vcs_strategy(self) -> VCSStrategy: + return VCSStrategyNone(self.root) + + @license_map.default + def _default_license_map(self) -> Dict[str, Dict]: + license_map = LICENSE_MAP.copy() + license_map.update(EXCEPTION_MAP) + return license_map @classmethod def from_directory( From 82807989df36a7c70e409a042bebab27a64b14b1 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 9 Jul 2024 18:48:20 +0200 Subject: [PATCH 042/156] Get errant source from exception instead of find_global_licensing In _main, find_global_licensing was called to find the file that contained some parsing error. This may have contained false information in the case of multiple REUSE.tomls. Instead of needlessly calling this function, the errant file is now an attribute on the exception. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_main.py | 10 ++---- src/reuse/global_licensing.py | 65 +++++++++++++++++++++++----------- tests/test_global_licensing.py | 43 ++++++++++++++++++---- tests/test_main.py | 38 ++++++++++++++++++-- tests/test_project.py | 2 +- 5 files changed, 119 insertions(+), 39 deletions(-) diff --git a/src/reuse/_main.py b/src/reuse/_main.py index 37d133056..b5df4a7f7 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -31,7 +31,7 @@ from ._format import INDENT, fill_all, fill_paragraph from ._util import PathType, setup_logging from .global_licensing import GlobalLicensingParseError -from .project import GlobalLicensingConflict, GlobalLicensingFound, Project +from .project import GlobalLicensingConflict, Project from .vcs import find_root _LOGGER = logging.getLogger(__name__) @@ -267,18 +267,12 @@ def main(args: Optional[List[str]] = None, out: IO[str] = sys.stdout) -> int: project = Project.from_directory(root) # FileNotFoundError and NotADirectoryError don't need to be caught because # argparse already made sure of these things. - except UnicodeDecodeError: - found = cast(GlobalLicensingFound, Project.find_global_licensing(root)) - main_parser.error( - _("'{path}' could not be decoded as UTF-8.").format(path=found.path) - ) except GlobalLicensingParseError as error: - found = cast(GlobalLicensingFound, Project.find_global_licensing(root)) main_parser.error( _( "'{path}' could not be parsed. We received the following error" " message: {message}" - ).format(path=found.path, message=str(error)) + ).format(path=error.source, message=str(error)) ) except GlobalLicensingConflict as error: main_parser.error(str(error)) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 6345e6aae..724c2c7b6 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -38,9 +38,9 @@ from debian.copyright import Error as DebianError from license_expression import ExpressionError -from . import ReuseInfo, SourceType from ._util import _LICENSING, StrPath, is_relative_to from .covered_files import iter_files +from . import ReuseException, ReuseInfo, SourceType from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) @@ -67,13 +67,17 @@ class PrecedenceType(Enum): OVERRIDE = "override" -class GlobalLicensingParseError(Exception): +class GlobalLicensingParseError(ReuseException): """An exception representing any kind of error that occurs when trying to parse a :class:`GlobalLicensing` file. """ + def __init__(self, *args: Any, source: Optional[str] = None): + super().__init__(*args) + self.source = source -class GlobalLicensingParseTypeError(TypeError, GlobalLicensingParseError): + +class GlobalLicensingParseTypeError(GlobalLicensingParseError, TypeError): """An exception representing a type error while trying to parse a :class:`GlobalLicensing` file. """ @@ -103,6 +107,7 @@ def __call__( attr_name = instance.TOML_KEYS[attribute.name] else: attr_name = attribute.name + source = getattr(instance, "source", None) if not isinstance(value, self.collection_type): raise GlobalLicensingParseTypeError( @@ -114,7 +119,8 @@ def __call__( type_name=self.collection_type.__name__, value=repr(value), value_class=repr(value.__class__), - ) + ), + source=source, ) for item in value: if not isinstance(item, self.value_type): @@ -127,13 +133,15 @@ def __call__( type_name=self.value_type.__name__, item_value=repr(item), item_class=repr(item.__class__), - ) + ), + source=source, ) if not self.optional and not value: raise GlobalLicensingParseValueError( _("{attr_name} must not be empty.").format( - attr_name=repr(attr_name) - ) + attr_name=repr(attr_name), + ), + source=source, ) @@ -161,7 +169,8 @@ def __call__(self, inst: Any, attr: attrs.Attribute, value: _T) -> None: type=repr(error.args[2].__name__), value=repr(error.args[3]), value_type=repr(error.args[3].__class__), - ) + ), + source=getattr(inst, "source", None), ) from error @@ -174,7 +183,7 @@ def _instance_of( def _str_to_global_precedence(value: Any) -> PrecedenceType: try: return PrecedenceType(value) - except ValueError as err: + except ValueError as error: raise GlobalLicensingParseValueError( _( "The value of 'precedence' must be one of {precedence_vals}" @@ -185,7 +194,7 @@ def _str_to_global_precedence(value: Any) -> PrecedenceType: ), received=repr(value), ) - ) from err + ) from error @overload @@ -239,7 +248,6 @@ def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": Raises: FileNotFoundError: file doesn't exist. - UnicodeDecodeError: could not decode file as UTF-8. OSError: some other error surrounding I/O. GlobalLicensingParseError: file could not be parsed. """ @@ -268,13 +276,17 @@ def from_file(cls, path: StrPath, **kwargs: Any) -> "ReuseDep5": try: with path.open(encoding="utf-8") as fp: return cls(str(path), Copyright(fp)) - except UnicodeDecodeError: - raise + except UnicodeDecodeError as error: + raise GlobalLicensingParseError( + str(error), source=str(path) + ) from error # TODO: Remove ValueError once # # is closed except (DebianError, ValueError) as error: - raise GlobalLicensingParseError(str(error)) from error + raise GlobalLicensingParseError( + str(error), source=str(path) + ) from error def reuse_info_of( self, path: StrPath @@ -420,10 +432,14 @@ def from_dict(cls, values: Dict[str, Any], source: str) -> "ReuseTOML": new_dict["source"] = source annotation_dicts = values.get("annotations", []) - annotations = [ - AnnotationsItem.from_dict(annotation) - for annotation in annotation_dicts - ] + try: + annotations = [ + AnnotationsItem.from_dict(annotation) + for annotation in annotation_dicts + ] + except GlobalLicensingParseError as error: + error.source = source + raise error from error new_dict["annotations"] = annotations @@ -435,13 +451,20 @@ def from_toml(cls, toml: str, source: str) -> "ReuseTOML": try: tomldict = tomlkit.loads(toml) except tomlkit.exceptions.TOMLKitError as error: - raise GlobalLicensingParseError(str(error)) from error + raise GlobalLicensingParseError( + str(error), source=source + ) from error return cls.from_dict(tomldict, source) @classmethod def from_file(cls, path: StrPath, **kwargs: Any) -> "ReuseTOML": - with Path(path).open(encoding="utf-8") as fp: - return cls.from_toml(fp.read(), str(path)) + try: + with Path(path).open(encoding="utf-8") as fp: + return cls.from_toml(fp.read(), str(path)) + except UnicodeDecodeError as error: + raise GlobalLicensingParseError( + str(error), source=str(path) + ) from error def find_annotations_item(self, path: StrPath) -> Optional[AnnotationsItem]: """Find a :class:`AnnotationsItem` that matches *path*. The latest match diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index 26325827e..2a415426f 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -347,33 +347,37 @@ def test_simple(self, annotations_item): def test_version_not_int(self, annotations_item): """Version must be an int""" - with pytest.raises(GlobalLicensingParseTypeError): + with pytest.raises(GlobalLicensingParseTypeError) as exc_info: ReuseTOML( version=1.2, source="REUSE.toml", annotations=[annotations_item] ) + assert exc_info.value.source == "REUSE.toml" def test_source_not_str(self, annotations_item): """Source must be a str.""" - with pytest.raises(GlobalLicensingParseTypeError): + with pytest.raises(GlobalLicensingParseTypeError) as exc_info: ReuseTOML(version=1, source=123, annotations=[annotations_item]) + assert exc_info.value.source == 123 def test_annotations_must_be_list(self, annotations_item): """Annotations must be in a list, not any other collection.""" # TODO: Technically we could change this to 'any collection that is # ordered', but let's not split hairs. - with pytest.raises(GlobalLicensingParseTypeError): + with pytest.raises(GlobalLicensingParseTypeError) as exc_info: ReuseTOML( version=1, source="REUSE.toml", annotations=iter([annotations_item]), ) + assert exc_info.value.source == "REUSE.toml" def test_annotations_must_be_object(self): """Annotations must be AnnotationsItem objects.""" - with pytest.raises(GlobalLicensingParseTypeError): + with pytest.raises(GlobalLicensingParseTypeError) as exc_info: ReuseTOML( version=1, source="REUSE.toml", annotations=[{"foo": "bar"}] ) + assert exc_info.value.source == "REUSE.toml" class TestReuseTOMLFromDict: @@ -428,6 +432,24 @@ def test_no_version(self): "REUSE.toml", ) + def test_annotations_error(self): + """If there is an error in the annotations, the error get ReuseTOML's + source. + """ + with pytest.raises(GlobalLicensingParseTypeError) as exc_info: + ReuseTOML.from_dict( + { + "version": 1, + "annotations": [ + { + "path": {1}, + } + ], + }, + "REUSE.toml", + ) + assert exc_info.value.source == "REUSE.toml" + class TestReuseTOMLFromToml: """Test the from_toml method of ReuseTOML.""" @@ -1097,14 +1119,19 @@ def test_unicode_decode_error(self, fake_repository_dep5): shutil.copy( RESOURCES_DIRECTORY / "fsfe.png", fake_repository_dep5 / "fsfe.png" ) - with pytest.raises(UnicodeDecodeError): + with pytest.raises(GlobalLicensingParseError) as exc_info: ReuseDep5.from_file(fake_repository_dep5 / "fsfe.png") + error = exc_info.value + assert error.source == str(fake_repository_dep5 / "fsfe.png") + assert "'utf-8' codec can't decode byte" in str(error) def test_parse_error(self, empty_directory): """Raise GlobalLicensingParseError on parse error.""" (empty_directory / "foo").write_text("foo") - with pytest.raises(GlobalLicensingParseError): + with pytest.raises(GlobalLicensingParseError) as exc_info: ReuseDep5.from_file(empty_directory / "foo") + error = exc_info.value + assert error.source == str(empty_directory / "foo") def test_double_copyright_parse_error(self, empty_directory): """Raise GlobalLicensingParseError on double Copyright lines.""" @@ -1123,8 +1150,10 @@ def test_double_copyright_parse_error(self, empty_directory): """ ) ) - with pytest.raises(GlobalLicensingParseError): + with pytest.raises(GlobalLicensingParseError) as exc_info: ReuseDep5.from_file(empty_directory / "foo") + error = exc_info.value + assert error.source == str(empty_directory / "foo") def test_reuse_dep5_reuse_info_of(reuse_dep5): diff --git a/tests/test_main.py b/tests/test_main.py index 86095ec67..424ea7048 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -217,7 +217,10 @@ def test_lint_dep5_decode_error(fake_repository_dep5, capsys): ) with pytest.raises(SystemExit): main(["lint"]) - assert "could not be decoded" in capsys.readouterr().err + error = capsys.readouterr().err + assert str(fake_repository_dep5 / ".reuse/dep5") in error + assert "could not be parsed" in error + assert "'utf-8' codec can't decode byte" in error def test_lint_dep5_parse_error(fake_repository_dep5, capsys): @@ -225,7 +228,38 @@ def test_lint_dep5_parse_error(fake_repository_dep5, capsys): (fake_repository_dep5 / ".reuse/dep5").write_text("foo") with pytest.raises(SystemExit): main(["lint"]) - assert "could not be parsed" in capsys.readouterr().err + error = capsys.readouterr().err + assert str(fake_repository_dep5 / ".reuse/dep5") in error + assert "could not be parsed" in error + + +def test_lint_toml_parse_error_version(fake_repository_reuse_toml, capsys): + """If version has the wrong type, print an error.""" + (fake_repository_reuse_toml / "REUSE.toml").write_text("version = 'a'") + with pytest.raises(SystemExit): + main(["lint"]) + error = capsys.readouterr().err + assert str(fake_repository_reuse_toml / "REUSE.toml") in error + assert "could not be parsed" in error + + +def test_lint_toml_parse_error_annotation(fake_repository_reuse_toml, capsys): + """If there is an error in an annotation, print an error.""" + (fake_repository_reuse_toml / "REUSE.toml").write_text( + cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = 1 + """ + ) + ) + with pytest.raises(SystemExit): + main(["lint"]) + error = capsys.readouterr().err + assert str(fake_repository_reuse_toml / "REUSE.toml") in error + assert "could not be parsed" in error def test_lint_json(fake_repository, stringio): diff --git a/tests/test_project.py b/tests/test_project.py index 24991d3bb..0be3ed3f6 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -51,7 +51,7 @@ def test_project_conflicting_global_licensing(empty_directory): """ (empty_directory / "REUSE.toml").write_text("version = 1") (empty_directory / ".reuse").mkdir() - (empty_directory / ".reuse/dep5").touch() + shutil.copy(RESOURCES_DIRECTORY / "dep5", empty_directory / ".reuse/dep5") with pytest.raises(GlobalLicensingConflict): Project.from_directory(empty_directory) From a8be9db47281097fbaebe61bde12d3a33cc21e27 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 9 Jul 2024 19:13:23 +0200 Subject: [PATCH 043/156] Reduce calls to iter_files Previously this function would be called three times on a lint: - once by NestedReuseTOML.find_reuse_tomls in Project.find_global_licensing - once by NestedReuseTOML.find_reuse_tomls in NestedReuseTOML.from_file - once to lint all the files I now no longer use NestedReuseTOML.from_file. It's still not ideal to go over all files twice, but it's better than thrice. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/project.py | 60 +++++++++++++++++++++++++------------------ tests/test_project.py | 25 +++++++++++++----- 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/reuse/project.py b/src/reuse/project.py index e0b7c9685..9a2906290 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -9,7 +9,6 @@ """Module that contains the central Project class.""" -import contextlib import errno import glob import logging @@ -51,6 +50,7 @@ NestedReuseTOML, PrecedenceType, ReuseDep5, + ReuseTOML, ) from .vcs import VCSStrategy, VCSStrategyNone, all_vcs_strategies @@ -151,11 +151,8 @@ def from_directory( vcs_strategy=vcs_strategy, ) if found: - global_licensing = found.cls.from_file( - found.path, - include_submodules=include_submodules, - include_meson_subprojects=include_meson_subprojects, - vcs_strategy=vcs_strategy, + global_licensing = cls._global_licensing_from_found( + found, str(root) ) project = cls( @@ -334,7 +331,7 @@ def find_global_licensing( include_submodules: bool = False, include_meson_subprojects: bool = False, vcs_strategy: Optional[VCSStrategy] = None, - ) -> Optional[GlobalLicensingFound]: + ) -> List[GlobalLicensingFound]: """Find the path and corresponding class of a project directory's :class:`GlobalLicensing`. @@ -342,7 +339,7 @@ def find_global_licensing( GlobalLicensingConflict: if more than one global licensing config file is present. """ - candidate: Optional[GlobalLicensingFound] = None + candidates: List[GlobalLicensingFound] = [] dep5_path = root / ".reuse/dep5" if (dep5_path).exists(): # Sneaky workaround to not print this warning. @@ -355,31 +352,44 @@ def find_global_licensing( ), PendingDeprecationWarning, ) - candidate = GlobalLicensingFound(dep5_path, ReuseDep5) - - # TODO: the performance of this isn't great. - toml_path = None - with contextlib.suppress(StopIteration): - toml_path = next( - NestedReuseTOML.find_reuse_tomls( - root, - include_submodules=include_submodules, - include_meson_subprojects=include_meson_subprojects, - vcs_strategy=vcs_strategy, - ) + candidates = [GlobalLicensingFound(dep5_path, ReuseDep5)] + + reuse_toml_candidates = [ + GlobalLicensingFound(path, ReuseTOML) + for path in NestedReuseTOML.find_reuse_tomls( + root, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, + vcs_strategy=vcs_strategy, ) - if toml_path is not None: - if candidate is not None: + ] + if reuse_toml_candidates: + if candidates: raise GlobalLicensingConflict( _( "Found both '{new_path}' and '{old_path}'. You" " cannot keep both files simultaneously; they are" " not intercompatible." - ).format(new_path=toml_path, old_path=dep5_path) + ).format( + new_path=reuse_toml_candidates[0].path, + old_path=dep5_path, + ) ) - candidate = GlobalLicensingFound(root, NestedReuseTOML) + candidates = reuse_toml_candidates + + return candidates - return candidate + @classmethod + def _global_licensing_from_found( + cls, found: List[GlobalLicensingFound], root: StrPath + ) -> GlobalLicensing: + if len(found) == 1 and found[0].cls == ReuseDep5: + return ReuseDep5.from_file(found[0].path) + # This is an impossible scenario at time of writing. + if not all(item.cls == ReuseTOML for item in found): + raise NotImplementedError() + tomls = [ReuseTOML.from_file(item.path) for item in found] + return NestedReuseTOML(reuse_tomls=tomls, source=str(root)) def _identifier_of_license(self, path: Path) -> str: """Figure out the SPDX License identifier of a license given its path. diff --git a/tests/test_project.py b/tests/test_project.py index 0be3ed3f6..59014bf4c 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -24,8 +24,8 @@ from reuse.covered_files import iter_files from reuse.global_licensing import ( GlobalLicensingParseError, - NestedReuseTOML, ReuseDep5, + ReuseTOML, ) from reuse.project import GlobalLicensingConflict, Project @@ -567,8 +567,10 @@ def test_find_global_licensing_dep5(fake_repository_dep5): """Find the dep5 file. Also output a PendingDeprecationWarning.""" with warnings.catch_warnings(record=True) as caught_warnings: result = Project.find_global_licensing(fake_repository_dep5) - assert result.path == fake_repository_dep5 / ".reuse/dep5" - assert result.cls == ReuseDep5 + assert len(result) == 1 + dep5 = result[0] + assert dep5.path == fake_repository_dep5 / ".reuse/dep5" + assert dep5.cls == ReuseDep5 assert len(caught_warnings) == 1 assert issubclass( @@ -579,14 +581,25 @@ def test_find_global_licensing_dep5(fake_repository_dep5): def test_find_global_licensing_reuse_toml(fake_repository_reuse_toml): """Find the REUSE.toml file.""" result = Project.find_global_licensing(fake_repository_reuse_toml) - assert result.path == fake_repository_reuse_toml / "." - assert result.cls == NestedReuseTOML + assert len(result) == 1 + toml = result[0] + assert toml.path == fake_repository_reuse_toml / "REUSE.toml" + assert toml.cls == ReuseTOML + + +def test_find_global_licensing_reuse_toml_multiple(fake_repository_reuse_toml): + """Find multiple REUSE.tomls.""" + (fake_repository_reuse_toml / "src/REUSE.toml").write_text("version = 1") + result = Project.find_global_licensing(fake_repository_reuse_toml) + assert len(result) == 2 + assert result[0].path == fake_repository_reuse_toml / "REUSE.toml" + assert result[1].path == fake_repository_reuse_toml / "src/REUSE.toml" def test_find_global_licensing_none(empty_directory): """Find no file.""" result = Project.find_global_licensing(empty_directory) - assert result is None + assert not result def test_find_global_licensing_conflict(fake_repository_dep5): From 455fad9120dad920dc65255382aa5c3bf0a055af Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 9 Jul 2024 19:25:02 +0200 Subject: [PATCH 044/156] Add change log entries Signed-off-by: Carmen Bianca BAKKER --- changelog.d/changed/reuse-toml-ignored.md | 2 ++ changelog.d/fixed/performance.md | 3 +++ changelog.d/fixed/source-bug.md | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 changelog.d/changed/reuse-toml-ignored.md create mode 100644 changelog.d/fixed/performance.md create mode 100644 changelog.d/fixed/source-bug.md diff --git a/changelog.d/changed/reuse-toml-ignored.md b/changelog.d/changed/reuse-toml-ignored.md new file mode 100644 index 000000000..c99ce516b --- /dev/null +++ b/changelog.d/changed/reuse-toml-ignored.md @@ -0,0 +1,2 @@ +- If `REUSE.toml` is ignored by VCS, the linter now also ignores this files. + (#1047) diff --git a/changelog.d/fixed/performance.md b/changelog.d/fixed/performance.md new file mode 100644 index 000000000..fafae0995 --- /dev/null +++ b/changelog.d/fixed/performance.md @@ -0,0 +1,3 @@ +- Performance greatly improved for projects with large directories ignored by + VCS. (#1047) +- Performance slightly improved for large projects. (#1047) diff --git a/changelog.d/fixed/source-bug.md b/changelog.d/fixed/source-bug.md new file mode 100644 index 000000000..a4959bc75 --- /dev/null +++ b/changelog.d/fixed/source-bug.md @@ -0,0 +1,3 @@ +- In some scenarios, where a user has multiple `REUSE.toml` files and one of + those files could not be parsed, the wrong `REUSE.toml` was signalled as being + unparseable. This is now fixed. (#1047) From 9a237f406cbb0e1cec254f48e5328353ae11070e Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Wed, 18 Sep 2024 15:12:39 +0200 Subject: [PATCH 045/156] Small cleanup This cleanup is the result of a rebase. It would be more effort to incorporate these fixes into their original commits. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/global_licensing.py | 2 +- src/reuse/project.py | 4 ---- tests/test_covered_files.py | 9 +++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 724c2c7b6..1a28c50e1 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -38,9 +38,9 @@ from debian.copyright import Error as DebianError from license_expression import ExpressionError +from . import ReuseException, ReuseInfo, SourceType from ._util import _LICENSING, StrPath, is_relative_to from .covered_files import iter_files -from . import ReuseException, ReuseInfo, SourceType from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/project.py b/src/reuse/project.py index 9a2906290..3f6148931 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -21,14 +21,11 @@ Collection, DefaultDict, Dict, - Generator, Iterator, List, NamedTuple, Optional, - Set, Type, - cast, ) import attrs @@ -40,7 +37,6 @@ _LICENSEREF_PATTERN, StrPath, _determine_license_path, - is_relative_to, relative_from_root, reuse_info_of_file, ) diff --git a/tests/test_covered_files.py b/tests/test_covered_files.py index a60c1a2c0..df8f0ad7e 100644 --- a/tests/test_covered_files.py +++ b/tests/test_covered_files.py @@ -113,10 +113,11 @@ def test_include_meson_subprojects(self, empty_directory): subprojects_dir.mkdir() libfoo_dir = subprojects_dir / "libfoo" libfoo_dir.mkdir() - (libfoo_dir / "bar.py").write_text("pass") + bar_file = libfoo_dir / "bar.py" + bar_file.write_text("pass") - assert (libfoo_dir / "bar.py") not in iter_files(empty_directory) - assert (libfoo_dir / "bar.py") in iter_files( + assert bar_file not in iter_files(empty_directory) + assert bar_file in iter_files( empty_directory, include_meson_subprojects=True ) @@ -260,7 +261,7 @@ def test_include_submodules(self, submodule_repository): ) def test_submodule_is_ignored(self, submodule_repository): - """If a submodule is ignored, iter_files should not raise an Exception""" + """If a submodule is ignored, iter_files shouldn't raise an Exception""" (submodule_repository / "submodule/foo.py").write_text("foo") gitignore = submodule_repository / ".gitignore" contents = gitignore.read_text() From f5396ca92bf05c34794b5102490671221c9312dc Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Sep 2024 13:15:53 +0000 Subject: [PATCH 046/156] Translated using Weblate (Swedish) Currently translated at 19.2% (35 of 182 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/sv/ --- po/sv.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/po/sv.po b/po/sv.po index 94cc2f392..4cc74d42f 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-10 10:35+0000\n" -"PO-Revision-Date: 2024-01-08 20:06+0000\n" -"Last-Translator: Kristoffer Grundström \n" +"PO-Revision-Date: 2024-09-19 13:40+0000\n" +"Last-Translator: Simon \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,40 +17,41 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: src/reuse/_annotate.py:74 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" -msgstr "" +msgstr "'{path}' stöjder inte kommentarer på en rad, använd inte --single-line" #: src/reuse/_annotate.py:81 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" +"'{path}' stöjder inte kommentarer på flera rader, använd inte --multi-line" #: src/reuse/_annotate.py:136 #, python-brace-format msgid "Skipped unrecognised file '{path}'" -msgstr "" +msgstr "Hoppar över fil som inte känns igen '{path}'" #: src/reuse/_annotate.py:142 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "" +msgstr "'{path}' känns inte igen; skapar '{path}.license'" #: src/reuse/_annotate.py:158 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" -msgstr "" +msgstr "Hoppade över fil '{path}' innehåller redan REUSE information" #: src/reuse/_annotate.py:192 #, python-brace-format msgid "Error: Could not create comment for '{path}'" -msgstr "" +msgstr "Fel: Kunde inte skapa kommentar för '{path}'" #: src/reuse/_annotate.py:199 #, python-brace-format From 5c6b8d9df984ed0dd4b73475891f3f46865fe4fd Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 23 Sep 2024 12:43:09 +0200 Subject: [PATCH 047/156] Remove more duplicates Signed-off-by: Carmen Bianca BAKKER --- AUTHORS.rst | 9 --------- 1 file changed, 9 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index a4abbbce7..a22266ba4 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -38,7 +38,6 @@ Contributors - Luca Bonissi - José Vieira - flow -- pd - Roberto Bauglir - John Mulligan - Kevin Broch @@ -72,14 +71,12 @@ Contributors - Keith Maxwell - Kirill Elagin - Kristoffer Grundström -- Luca Bonissi - Manlio Perillo - Mauro Aranda - Maxim Cournoyer - Mikko Piuhola - Raniere Silva - Robert Cohn -- Sebastian Schuberth - Simon Schliesky - Stefan Bakker - T. E. Kalayci @@ -92,12 +89,9 @@ Contributors - mdolling - psykose - Adrián Chaves -- Alvar <8402811+oxzi@users.noreply.github.com> - Alvar Penning - Aminda Suomalainen - Andrey Bienkowski -- André Ockers -- Anthony Loiseau - Arnout Engelen - Basil Peace - Benedikt Fein @@ -118,7 +112,6 @@ Contributors - Johannes Keyser - Jon Burdo - Josef Andersson -- José Vieira - Kerry McAdams - Kevin Meagher <11620178+kjmeagher@users.noreply.github.com> - Lars Francke @@ -135,7 +128,6 @@ Contributors - Olaf Meeuwissen - Pep - Philipp Zabel -- Roberto Bauglir - Romain Tartière - Ryan Schmidt - Sebastian Crane @@ -144,7 +136,6 @@ Contributors - Vlad-Stefan Harbuz - Yaman Qalieh - criadoperez -- ethulhu - nautilusx - pukkamustard - rajivsunar07 <56905029+rajivsunar07@users.noreply.github.com> From 9b6e94e862924b88bac590ddf80621b471f8d11f Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 26 Sep 2024 09:32:10 +0000 Subject: [PATCH 048/156] Update reuse.pot --- po/cs.po | 43 +++++++++++++++++++++---------------------- po/de.po | 43 +++++++++++++++++++++---------------------- po/eo.po | 43 +++++++++++++++++++++---------------------- po/es.po | 43 +++++++++++++++++++++---------------------- po/fr.po | 43 +++++++++++++++++++++---------------------- po/gl.po | 39 +++++++++++++++++---------------------- po/it.po | 39 +++++++++++++++++---------------------- po/nl.po | 43 +++++++++++++++++++++---------------------- po/pt.po | 39 +++++++++++++++++---------------------- po/reuse.pot | 41 ++++++++++++++++++----------------------- po/ru.po | 43 +++++++++++++++++++++---------------------- po/sv.po | 43 +++++++++++++++++++++---------------------- po/tr.po | 43 +++++++++++++++++++++---------------------- po/uk.po | 47 +++++++++++++++++++++++------------------------ 14 files changed, 281 insertions(+), 311 deletions(-) diff --git a/po/cs.po b/po/cs.po index 1f74898e0..3ab217400 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-09-14 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech nebo zda začíná znakem 'LicenseRef-' a " "zda má příponu souboru." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -1030,6 +1025,10 @@ msgstr "neplatná volba: %(value)r (vyberte z %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" +#, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{path}' se nepodařilo dekódovat jako UTF-8." + #~ msgid "initialize REUSE project" #~ msgstr "inicializace projektu REUSE" diff --git a/po/de.po b/po/de.po index 089029707..eaf61daeb 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German steht oder mit 'LicenseRef-' " "beginnt und eine Dateiendung hat." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -1021,6 +1016,10 @@ msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" +#, fuzzy, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{dep5}' konnte nicht als UTF-8 decodiert werden." + #, fuzzy, python-brace-format #~ msgid "" #~ "Copyright and licensing information for '{original_path}' has been found " diff --git a/po/eo.po b/po/eo.po index 0b3c6fbcd..d8f16a736 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto aŭ " "ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -720,7 +715,7 @@ msgstr "" "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " "{other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -974,6 +969,10 @@ msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eraro: %(message)s\n" +#, fuzzy, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "ne povis malkodi '{dep5}' kiel UTF-8." + #~ msgid "initialize REUSE project" #~ msgstr "pravalorizi REUSE-projekton" diff --git a/po/es.po b/po/es.po index d6de1a0d4..b9908c04c 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-05-09 08:19+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish , o de que empieza por 'LicenseRef-', " "y de que posee una extensión de fichero." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -744,7 +739,7 @@ msgstr "" "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " "{other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -1043,6 +1038,10 @@ msgstr "opción inválida: %(value)r (opciones: %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" +#, fuzzy, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{dep5}' no pudo ser decodificado como UTF-8." + #, fuzzy, python-brace-format #~ msgid "" #~ "Copyright and licensing information for '{original_path}' has been found " diff --git a/po/fr.po b/po/fr.po index c44b0ccac..481e0a60a 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French , soit qu'elle débute par 'LicenseRef-' " "et qu'elle contient une extension de fichier." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " @@ -1072,6 +1067,10 @@ msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" +#, fuzzy, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{path}' n'a pas pu être lu en UTF-8." + #, fuzzy, python-brace-format #~ msgid "" #~ "Copyright and licensing information for '{original_path}' has been found " diff --git a/po/gl.po b/po/gl.po index 394d6d8ff..5f10df658 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician ou que comeza con 'LicenseRef-' e ten unha " "extensión de arquivo." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -725,7 +720,7 @@ msgstr "" "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " "{other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" diff --git a/po/it.po b/po/it.po index 900faf991..165113bd4 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian o che inizi con " "'LicenseRef-', e che abbia un'estensione del file." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -731,7 +726,7 @@ msgstr "" "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " "{other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" diff --git a/po/nl.po b/po/nl.po index 77d365389..03d58a769 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch of dat deze begint " "met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -729,7 +724,7 @@ msgstr "" "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " "{other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -984,6 +979,10 @@ msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" +#, fuzzy, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "%s kon niet gedecodeerd worden" + #~ msgid "initialize REUSE project" #~ msgstr "initialiseer REUSE-project" diff --git a/po/pt.po b/po/pt.po index b7fc7aac7..025afc91d 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese ou que começa por 'LicenseRef-' e " "tem uma extensão de ficheiro." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" diff --git a/po/reuse.pot b/po/reuse.pot index 554d42fa6..4e7ef2568 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -312,17 +312,12 @@ msgstr "" #: src/reuse/_main.py:273 #, python-brace-format -msgid "'{path}' could not be decoded as UTF-8." -msgstr "" - -#: src/reuse/_main.py:279 -#, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" @@ -424,30 +419,30 @@ msgstr "" msgid "cannot use --output with more than one license" msgstr "" -#: src/reuse/global_licensing.py:108 +#: src/reuse/global_licensing.py:115 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:121 +#: src/reuse/global_licensing.py:129 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:132 +#: src/reuse/global_licensing.py:141 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:155 +#: src/reuse/global_licensing.py:165 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:178 +#: src/reuse/global_licensing.py:189 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -625,48 +620,48 @@ msgstr "" msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:322 +#: src/reuse/project.py:269 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "" -#: src/reuse/project.py:330 +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:337 +#: src/reuse/project.py:284 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:394 +#: src/reuse/project.py:345 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:408 +#: src/reuse/project.py:366 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:474 +#: src/reuse/project.py:425 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:482 +#: src/reuse/project.py:433 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:492 +#: src/reuse/project.py:443 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -675,13 +670,13 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" diff --git a/po/ru.po b/po/ru.po index 2e6b47be5..9e01a65f3 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian или что она начинается с 'LicenseRef-' и имеет " "расширение файла." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -1069,6 +1064,10 @@ msgstr "Неверный выбор: %(value)r (выберите из %(choices) msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ошибка: %(message)s\n" +#, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{path}' не может быть декодирован как UTF-8." + #, python-brace-format #~ msgid "" #~ "Copyright and licensing information for '{original_path}' has been found " diff --git a/po/sv.po b/po/sv.po index 4cc74d42f..f477df804 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 10:35+0000\n" +"POT-Creation-Date: 2024-09-26 09:32+0000\n" "PO-Revision-Date: 2024-09-19 13:40+0000\n" "Last-Translator: Simon \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -343,11 +343,6 @@ msgstr "конвертувати .reuse/dep5 у REUSE.toml" #: src/reuse/_main.py:273 #, python-brace-format -msgid "'{path}' could not be decoded as UTF-8." -msgstr "'{path}' не може бути декодовано як UTF-8." - -#: src/reuse/_main.py:279 -#, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" @@ -355,7 +350,7 @@ msgstr "" "'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:217 +#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" @@ -462,14 +457,14 @@ msgstr "необхідні такі аргументи: license" msgid "cannot use --output with more than one license" msgstr "не можна використовувати --output з кількома ліцензіями" -#: src/reuse/global_licensing.py:108 +#: src/reuse/global_licensing.py:115 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/global_licensing.py:121 +#: src/reuse/global_licensing.py:129 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -478,17 +473,17 @@ msgstr "" "Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " "що є {item_class})." -#: src/reuse/global_licensing.py:132 +#: src/reuse/global_licensing.py:141 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не повинне бути порожнім." -#: src/reuse/global_licensing.py:155 +#: src/reuse/global_licensing.py:165 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." -#: src/reuse/global_licensing.py:178 +#: src/reuse/global_licensing.py:189 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -670,18 +665,18 @@ msgstr "{lic_path}: ліцензія без розширення файлу\n" msgid "{lic_path}: unused license\n" msgstr "{lic_path}: невикористана ліцензія\n" -#: src/reuse/project.py:322 +#: src/reuse/project.py:269 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' покрито за рахунок {global_path}" -#: src/reuse/project.py:330 +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." -#: src/reuse/project.py:337 +#: src/reuse/project.py:284 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -690,7 +685,7 @@ msgstr "" "'{path}' виявлено як двійковий файл або його розширення позначено таким, що " "не коментується; пошук інформації у його вмісті для REUSE не виконується." -#: src/reuse/project.py:394 +#: src/reuse/project.py:345 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -698,7 +693,7 @@ msgstr "" "'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " "REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." -#: src/reuse/project.py:408 +#: src/reuse/project.py:366 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -707,17 +702,17 @@ msgstr "" "Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати обидва " "файли одночасно, вони несумісні." -#: src/reuse/project.py:474 +#: src/reuse/project.py:425 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "визначення ідентифікатора '{path}'" -#: src/reuse/project.py:482 +#: src/reuse/project.py:433 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} не має розширення файлу" -#: src/reuse/project.py:492 +#: src/reuse/project.py:443 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -730,14 +725,14 @@ msgstr "" "spdx.org/licenses/> або що вона починається з 'LicenseRef-' і має розширення " "файлу." -#: src/reuse/project.py:504 +#: src/reuse/project.py:455 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" -#: src/reuse/project.py:543 +#: src/reuse/project.py:494 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -1033,6 +1028,10 @@ msgstr "неприпустимий вибір: %(value)r (варто обрат msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" +#, python-brace-format +#~ msgid "'{path}' could not be decoded as UTF-8." +#~ msgstr "'{path}' не може бути декодовано як UTF-8." + #, python-brace-format #~ msgid "" #~ "Copyright and licensing information for '{original_path}' has been found " From 18b175ed9194441b918767b8d52cefb2a4df21cc Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 11:55:22 +0200 Subject: [PATCH 049/156] man: Clarify where REUSE.toml may be located The usage of 'the REUSE.toml file' was incorrect. There may be multiple ones. The new language use is more correct and adds helpful context. Signed-off-by: Carmen Bianca BAKKER --- docs/man/reuse-lint.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/man/reuse-lint.rst b/docs/man/reuse-lint.rst index e00d8470b..6c0cf6d77 100644 --- a/docs/man/reuse-lint.rst +++ b/docs/man/reuse-lint.rst @@ -67,7 +67,8 @@ are the methods: - Placing tags in the header of the file. - Placing tags in a ``.license`` file adjacent to the file. -- Putting the information in the ``REUSE.toml`` file. +- Putting the information in a ``REUSE.toml`` file, which must be in an ancestor + directory relative to the file. - Putting the information in the ``.reuse/dep5`` file. (Deprecated) If a file is found that does not have copyright and/or license information From e0f020c7159bc4069b0be4f1bc39f2926475524e Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 12:26:59 +0200 Subject: [PATCH 050/156] Licensing header is not needed in REUSE.toml Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 1 + src/reuse/covered_files.py | 8 +++++++- src/reuse/global_licensing.py | 1 + tests/resources/REUSE.toml | 4 ---- tests/test_covered_files.py | 6 ++++++ 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index d73cb9a34..bc7474199 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -71,6 +71,7 @@ re.compile(r"^\.git$"), re.compile(r"^\.hgtags$"), re.compile(r".*\.license$"), + re.compile(r"^REUSE\.toml$"), # Workaround for https://github.com/fsfe/reuse-tool/issues/229 re.compile(r"^CAL-1.0(-Combined-Work-Exception)?(\..+)?$"), re.compile(r"^SHL-2.1(\..+)?$"), diff --git a/src/reuse/covered_files.py b/src/reuse/covered_files.py index 01db5eaa4..753e643b9 100644 --- a/src/reuse/covered_files.py +++ b/src/reuse/covered_files.py @@ -30,6 +30,7 @@ def is_path_ignored( subset_files: Optional[Collection[StrPath]] = None, include_submodules: bool = False, include_meson_subprojects: bool = False, + include_reuse_tomls: bool = False, vcs_strategy: Optional[VCSStrategy] = None, ) -> bool: """Is *path* ignored by some mechanism?""" @@ -46,7 +47,9 @@ def is_path_ignored( if subset_files is not None and path.resolve() not in subset_files: return True for pattern in _IGNORE_FILE_PATTERNS: - if pattern.match(name): + if pattern.match(name) and ( + name != "REUSE.toml" or not include_reuse_tomls + ): return True # Suppressing this error because I simply don't want to deal # with that here. @@ -90,6 +93,7 @@ def iter_files( subset_files: Optional[Collection[StrPath]] = None, include_submodules: bool = False, include_meson_subprojects: bool = False, + include_reuse_tomls: bool = False, vcs_strategy: Optional[VCSStrategy] = None, ) -> Generator[Path, None, None]: """Yield all Covered Files in *directory* and its subdirectories according @@ -113,6 +117,7 @@ def iter_files( subset_files=subset_files, include_submodules=include_submodules, include_meson_subprojects=include_meson_subprojects, + include_reuse_tomls=include_reuse_tomls, vcs_strategy=vcs_strategy, ): _LOGGER.debug("ignoring '%s'", the_dir) @@ -126,6 +131,7 @@ def iter_files( subset_files=subset_files, include_submodules=include_submodules, include_meson_subprojects=include_meson_subprojects, + include_reuse_tomls=include_reuse_tomls, vcs_strategy=vcs_strategy, ): _LOGGER.debug("ignoring '%s'", the_file) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 1a28c50e1..3ca566578 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -595,6 +595,7 @@ def find_reuse_tomls( path, include_submodules=include_submodules, include_meson_subprojects=include_meson_subprojects, + include_reuse_tomls=True, vcs_strategy=vcs_strategy, ) if item.name == "REUSE.toml" diff --git a/tests/resources/REUSE.toml b/tests/resources/REUSE.toml index 6c2f15e5b..8aa7ebaf9 100644 --- a/tests/resources/REUSE.toml +++ b/tests/resources/REUSE.toml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2017 Jane Doe -# -# SPDX-License-Identifier: CC0-1.0 - version = 1 [[annotations]] diff --git a/tests/test_covered_files.py b/tests/test_covered_files.py index df8f0ad7e..67ef7ce03 100644 --- a/tests/test_covered_files.py +++ b/tests/test_covered_files.py @@ -121,6 +121,12 @@ def test_include_meson_subprojects(self, empty_directory): empty_directory, include_meson_subprojects=True ) + def test_reuse_toml_ignored(self, empty_directory): + """REUSE.toml is ignored.""" + (empty_directory / "REUSE.toml").write_text("version = 1") + assert not list(iter_files(empty_directory)) + assert list(iter_files(empty_directory, include_reuse_tomls=True)) + class TestIterFilesSubet: """Tests for subset_files in iter_files.""" From d8c863d9f3fc9ebe3edc2dcd16ba717719a93220 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 8 Jul 2024 12:29:17 +0200 Subject: [PATCH 051/156] Add change log entry. Signed-off-by: Carmen Bianca BAKKER --- changelog.d/changed/no-license-reuse-toml.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/changed/no-license-reuse-toml.md diff --git a/changelog.d/changed/no-license-reuse-toml.md b/changelog.d/changed/no-license-reuse-toml.md new file mode 100644 index 000000000..e30058221 --- /dev/null +++ b/changelog.d/changed/no-license-reuse-toml.md @@ -0,0 +1 @@ +- `REUSE.toml` no longer needs a licensing header. (#1042) From c43d489679ff85644ea14c82f1b88e9068eff7ca Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 14:38:47 +0200 Subject: [PATCH 052/156] Fix a globbing cornercase 'directory-*/file' did not correctly glob previously. The glob simply did not apply. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/global_licensing.py | 3 +++ tests/test_global_licensing.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 3ca566578..2c95af813 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -352,6 +352,7 @@ class AnnotationsItem: def __attrs_post_init__(self) -> None: def translate(path: str) -> str: + # pylint: disable=too-many-branches blocks = [] escaping = False globstar = False @@ -372,6 +373,8 @@ def translate(path: str) -> str: blocks.append(r".*") elif char == "/": if not globstar: + if prev_char == "*": + blocks.append("[^/]*") blocks.append("/") escaping = False else: diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index 2a415426f..5dc73441a 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -257,6 +257,11 @@ def test_asterisk_asterisk(self): assert item.matches("src/foo.py") assert item.matches(".foo/bar") + def test_asterisk_slash(self): + """Handle asterisk slash.""" + item = AnnotationsItem(paths=[r"*/file"]) + assert item.matches("foo/file") + def test_escape_asterisk(self): """Handle escape asterisk.""" item = AnnotationsItem(paths=[r"\*.py"]) From b760c61103b6cefafeaf4a52fbc16cc091d2c343 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 14:39:57 +0200 Subject: [PATCH 053/156] Small improvements to globbing - Don't use the ambiguous r"\\". - Add a missing test. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/global_licensing.py | 2 +- tests/test_global_licensing.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 2c95af813..18fef001f 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -361,7 +361,7 @@ def translate(path: str) -> str: if char == "\\": if prev_char == "\\" and escaping: escaping = False - blocks.append(r"\\") + blocks.append("\\\\") else: escaping = True elif char == "*": diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index 5dc73441a..175623916 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -298,6 +298,7 @@ def test_escape_escape_asterisk(self): """Handle escape escape asterisk.""" item = AnnotationsItem(paths=[r"\\*.py"]) assert item.matches(r"\foo.py") + assert not item.matches(r"foo.py") def test_asterisk_asterisk_asterisk(self): """Handle asterisk asterisk asterisk.""" From 0f5a87d6fad0cc74834e65a9fe6012c9922fc1d3 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 14:42:43 +0200 Subject: [PATCH 054/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/fixed/glob.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 changelog.d/fixed/glob.md diff --git a/changelog.d/fixed/glob.md b/changelog.d/fixed/glob.md new file mode 100644 index 000000000..dac4d9525 --- /dev/null +++ b/changelog.d/fixed/glob.md @@ -0,0 +1,2 @@ +- Fixed the globbing of a single asterisk succeeded by a slash (e.g. + `directory-*/foo.py`). The glob previously did nothing. (#1078) From 936c85b59f08a5fd05dea9f27b94637146cff63f Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 16:44:40 +0200 Subject: [PATCH 055/156] Remove Python 3.8 support Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/test.yaml | 16 +++--- .github/workflows/third_party_lint.yaml | 4 +- .readthedocs.yaml | 2 +- README.md | 2 +- poetry.lock | 20 ++----- pyproject.toml | 2 +- src/reuse/__init__.py | 12 ++--- src/reuse/_annotate.py | 8 +-- src/reuse/_licenses.py | 5 +- src/reuse/_lint_file.py | 4 +- src/reuse/_main.py | 8 +-- src/reuse/_util.py | 47 +++++----------- src/reuse/comment.py | 11 ++-- src/reuse/convert_dep5.py | 18 +++---- src/reuse/covered_files.py | 9 ++-- src/reuse/global_licensing.py | 51 ++++++++---------- src/reuse/header.py | 4 +- src/reuse/project.py | 35 +++++------- src/reuse/report.py | 71 ++++++++++++------------- src/reuse/vcs.py | 12 ++--- 20 files changed, 141 insertions(+), 200 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7a056a1a5..d278c2598 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -20,12 +20,12 @@ jobs: # do not abort the whole test job if one combination in the matrix fails fail-fast: false matrix: - python-version: ["3.8", "3.12"] + python-version: ["3.9", "3.12"] os: [ubuntu-22.04] include: - - python-version: "3.8" + - python-version: "3.9" os: macos-latest - - python-version: "3.8" + - python-version: "3.9" os: windows-latest steps: @@ -49,7 +49,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 @@ -65,7 +65,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 @@ -82,7 +82,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 @@ -108,7 +108,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 @@ -123,7 +123,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 diff --git a/.github/workflows/third_party_lint.yaml b/.github/workflows/third_party_lint.yaml index 98abad12b..ed2a7c33c 100644 --- a/.github/workflows/third_party_lint.yaml +++ b/.github/workflows/third_party_lint.yaml @@ -33,7 +33,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 @@ -56,7 +56,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | pip install poetry~=1.3.0 diff --git a/.readthedocs.yaml b/.readthedocs.yaml index d43bc7d3d..d9a1eb19d 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,7 +8,7 @@ build: # This should mirror the configuration in ./.github/workflows/test.yaml os: ubuntu-22.04 tools: - python: "3.8" + python: "3.9" jobs: post_create_environment: - python -m pip install poetry diff --git a/README.md b/README.md index 66107ce92..151675b81 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ recommendations. - Source code: - PyPI: - REUSE: 3.3 -- Python: 3.8+ +- Python: 3.9+ ## Table of contents diff --git a/poetry.lock b/poetry.lock index 728d880a5..f111b82d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -59,9 +59,6 @@ files = [ {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] @@ -1312,18 +1309,6 @@ test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=3.1,<4) websockets = ["websockets (>=10.3)"] yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] -[[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - [[package]] name = "pyyaml" version = "6.0.1" @@ -1350,6 +1335,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -1812,5 +1798,5 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "3f000ef7f191dd1e5648641ddfef4e469429e33e583299bbcac630bfd59ac10b" +python-versions = "^3.9" +content-hash = "be47ee3f7fe85c83152cadb5b1755beb125dc2766f19a10615c4eeae02d2349b" diff --git a/pyproject.toml b/pyproject.toml index 1f8e51d87..d31ae9cdb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,7 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.8" +python = "^3.9" Jinja2 = ">=3.0.0" binaryornot = ">=0.4.4" "boolean.py" = ">=3.8" diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index bc7474199..6ad6c3bcd 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -23,7 +23,7 @@ from dataclasses import dataclass, field from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Any, Dict, NamedTuple, Optional, Set, Type +from typing import Any, Optional from boolean.boolean import Expression @@ -108,9 +108,9 @@ class SourceType(Enum): class ReuseInfo: """Simple dataclass holding licensing and copyright information""" - spdx_expressions: Set[Expression] = field(default_factory=set) - copyright_lines: Set[str] = field(default_factory=set) - contributor_lines: Set[str] = field(default_factory=set) + spdx_expressions: set[Expression] = field(default_factory=set) + copyright_lines: set[str] = field(default_factory=set) + contributor_lines: set[str] = field(default_factory=set) path: Optional[str] = None source_path: Optional[str] = None source_type: Optional[SourceType] = None @@ -134,10 +134,10 @@ def copy(self, **kwargs: Any) -> "ReuseInfo": return self.__class__(**new_kwargs) # type: ignore def union(self, value: "ReuseInfo") -> "ReuseInfo": - """Return a new instance of ReuseInfo where all Set attributes are equal + """Return a new instance of ReuseInfo where all set attributes are equal to the union of the set in *self* and the set in *value*. - All non-Set attributes are set to their values in *self*. + All non-set attributes are set to their values in *self*. >>> one = ReuseInfo(copyright_lines={"Jane Doe"}, source_path="foo.py") >>> two = ReuseInfo(copyright_lines={"John Doe"}, source_path="bar.py") diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index c45918554..40daec635 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -22,7 +22,7 @@ from argparse import SUPPRESS, ArgumentParser, Namespace from gettext import gettext as _ from pathlib import Path -from typing import IO, Iterable, Optional, Set, Tuple, Type, cast +from typing import IO, Iterable, Optional, Type, cast from binaryornot.check import is_binary from jinja2 import Environment, FileSystemLoader, Template @@ -232,13 +232,13 @@ def test_mandatory_option_required(args: Namespace) -> None: ) -def all_paths(args: Namespace, project: Project) -> Set[Path]: +def all_paths(args: Namespace, project: Project) -> set[Path]: """Return a set of all provided paths, converted into .license paths if they exist. If recursive is enabled, all files belonging to *project* are also added. """ if args.recursive: - paths: Set[Path] = set() + paths: set[Path] = set() all_files = [path.resolve() for path in project.all_files()] for path in args.path: if path.is_file(): @@ -256,7 +256,7 @@ def all_paths(args: Namespace, project: Project) -> Set[Path]: def get_template( args: Namespace, project: Project -) -> Tuple[Optional[Template], bool]: +) -> tuple[Optional[Template], bool]: """If a template is specified on the CLI, find and return it, including whether it is a 'commented' template. diff --git a/src/reuse/_licenses.py b/src/reuse/_licenses.py index 76ffc3827..e3c947b0f 100644 --- a/src/reuse/_licenses.py +++ b/src/reuse/_licenses.py @@ -11,7 +11,6 @@ import json import os -from typing import Dict, List, Tuple _BASE_DIR = os.path.dirname(__file__) _RESOURCES_DIR = os.path.join(_BASE_DIR, "resources") @@ -19,7 +18,7 @@ _EXCEPTIONS = os.path.join(_RESOURCES_DIR, "exceptions.json") -def _load_license_list(file_name: str) -> Tuple[List[int], Dict[str, Dict]]: +def _load_license_list(file_name: str) -> tuple[list[int], dict[str, dict]]: """Return the licenses list version tuple and a mapping of licenses id->name loaded from a JSON file from https://github.com/spdx/license-list-data @@ -34,7 +33,7 @@ def _load_license_list(file_name: str) -> Tuple[List[int], Dict[str, Dict]]: return version, licenses_map -def _load_exception_list(file_name: str) -> Tuple[List[int], Dict[str, Dict]]: +def _load_exception_list(file_name: str) -> tuple[list[int], dict[str, dict]]: """Return the exceptions list version tuple and a mapping of exceptions id->name loaded from a JSON file from https://github.com/spdx/license-list-data diff --git a/src/reuse/_lint_file.py b/src/reuse/_lint_file.py index 39e5cd469..2c8d53eb3 100644 --- a/src/reuse/_lint_file.py +++ b/src/reuse/_lint_file.py @@ -12,7 +12,7 @@ from pathlib import Path from typing import IO -from ._util import PathType, is_relative_to +from ._util import PathType from .lint import format_lines_subset from .project import Project from .report import ProjectSubsetReport @@ -43,7 +43,7 @@ def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """List all non-compliant files from specified file list.""" subset_files = {Path(file_) for file_ in args.files} for file_ in subset_files: - if not is_relative_to(file_.resolve(), project.root.resolve()): + if not file_.resolve().is_relative_to(project.root.resolve()): args.parser.error( _("'{file}' is not inside of '{root}'").format( file=file_, root=project.root diff --git a/src/reuse/_main.py b/src/reuse/_main.py index b5df4a7f7..d395f302d 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -15,7 +15,7 @@ import warnings from gettext import gettext as _ from pathlib import Path -from typing import IO, Callable, List, Optional, Type, cast +from typing import IO, Callable, Optional, Type, cast from . import ( __REUSE_version__, @@ -219,7 +219,7 @@ def add_command( # pylint: disable=too-many-arguments,redefined-builtin formatter_class: Optional[Type[argparse.HelpFormatter]] = None, description: Optional[str] = None, help: Optional[str] = None, - aliases: Optional[List[str]] = None, + aliases: Optional[list[str]] = None, ) -> None: """Add a subparser for a command.""" if formatter_class is None: @@ -236,10 +236,10 @@ def add_command( # pylint: disable=too-many-arguments,redefined-builtin subparser.set_defaults(parser=subparser) -def main(args: Optional[List[str]] = None, out: IO[str] = sys.stdout) -> int: +def main(args: Optional[list[str]] = None, out: IO[str] = sys.stdout) -> int: """Main entry function.""" if args is None: - args = cast(List[str], sys.argv[1:]) + args = cast(list[str], sys.argv[1:]) main_parser = parser() parsed_args = main_parser.parse_args(args) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 58de0d1f3..c906dd64e 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -14,7 +14,6 @@ """Misc. utilities for reuse.""" -import contextlib import logging import os import re @@ -29,20 +28,8 @@ from inspect import cleandoc from itertools import chain from os import PathLike -from pathlib import Path, PurePath -from typing import ( - IO, - Any, - BinaryIO, - Dict, - Iterator, - List, - Optional, - Set, - Type, - Union, - cast, -) +from pathlib import Path +from typing import IO, Any, BinaryIO, Iterator, Optional, Type, Union, cast from boolean.boolean import Expression, ParseError from license_expression import ExpressionError, Licensing @@ -57,8 +44,7 @@ _all_style_classes, ) -# TODO: When removing Python 3.8 support, use PathLike[str] -StrPath = Union[str, PathLike] +StrPath = Union[str, PathLike[str]] GIT_EXE = shutil.which("git") HG_EXE = shutil.which("hg") @@ -109,7 +95,7 @@ r"^(.*?)SPDX-FileContributor:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE ) # The keys match the relevant attributes of ReuseInfo. -_SPDX_TAGS: Dict[str, re.Pattern] = { +_SPDX_TAGS: dict[str, re.Pattern] = { "spdx_expressions": _LICENSE_IDENTIFIER_PATTERN, "contributor_lines": _CONTRIBUTOR_PATTERN, } @@ -171,7 +157,7 @@ def setup_logging(level: int = logging.WARNING) -> None: def execute_command( - command: List[str], + command: list[str], logger: logging.Logger, cwd: Optional[StrPath] = None, **kwargs: Any, @@ -251,9 +237,9 @@ def _determine_license_suffix_path(path: StrPath) -> Path: return Path(f"{path}.license") -def _parse_copyright_year(year: Optional[str]) -> List[str]: +def _parse_copyright_year(year: Optional[str]) -> list[str]: """Parse copyright years and return list.""" - ret: List[str] = [] + ret: list[str] = [] if not year: return ret if re.match(r"\d{4}$", year): @@ -295,7 +281,7 @@ def _has_style(path: Path) -> bool: return _get_comment_style(path) is not None -def merge_copyright_lines(copyright_lines: Set[str]) -> Set[str]: +def merge_copyright_lines(copyright_lines: set[str]) -> set[str]: """Parse all copyright lines and merge identical statements making years into a range. @@ -339,7 +325,7 @@ def merge_copyright_lines(copyright_lines: Set[str]) -> Set[str]: break # get year range if any - years: List[str] = [] + years: list[str] = [] for copy in copyright_list: years += copy["year"] @@ -362,7 +348,7 @@ def extract_reuse_info(text: str) -> ReuseInfo: ParseError: if an SPDX expression could not be parsed. """ text = filter_ignore_block(text) - spdx_tags: Dict[str, Set[str]] = {} + spdx_tags: dict[str, set[str]] = {} for tag, pattern in _SPDX_TAGS.items(): spdx_tags[tag] = set(find_spdx_tag(text, pattern)) # License expressions and copyright matches are special cases. @@ -605,9 +591,9 @@ def spdx_identifier(text: str) -> Expression: ) from error -def similar_spdx_identifiers(identifier: str) -> List[str]: +def similar_spdx_identifiers(identifier: str) -> list[str]: """Given an incorrect SPDX identifier, return a list of similar ones.""" - suggestions: List[str] = [] + suggestions: list[str] = [] if identifier in ALL_NON_DEPRECATED_MAP: return suggestions @@ -665,13 +651,4 @@ def cleandoc_nl(text: str) -> str: return cleandoc(text) + "\n" -def is_relative_to(path: PurePath, target: PurePath) -> bool: - """Like Path.is_relative_to, but working for Python <3.9.""" - # TODO: When Python 3.8 is dropped, remove this function. - with contextlib.suppress(ValueError): - path.relative_to(target) - return True - return False - - # REUSE-IgnoreEnd diff --git a/src/reuse/comment.py b/src/reuse/comment.py index ad7b4f2db..ac1253ab5 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -29,7 +29,7 @@ import operator import re from textwrap import dedent -from typing import List, NamedTuple, Optional, Type +from typing import NamedTuple, Optional, Type _LOGGER = logging.getLogger(__name__) @@ -65,7 +65,7 @@ class CommentStyle: INDENT_BEFORE_MIDDLE = "" INDENT_AFTER_MIDDLE = "" INDENT_BEFORE_END = "" - SHEBANGS: List[str] = [] + SHEBANGS: list[str] = [] @classmethod def can_handle_single(cls) -> bool: @@ -162,10 +162,9 @@ def _parse_comment_single(cls, text: str) -> str: result_lines = [] for line in text.splitlines(): - # TODO: When Python 3.8 is dropped, consider using str.removeprefix if cls.SINGLE_LINE_REGEXP: if match := cls.SINGLE_LINE_REGEXP.match(line): - line = line.lstrip(match.group(0)) + line = line.removeprefix(match.group(0)) result_lines.append(line) continue @@ -173,7 +172,7 @@ def _parse_comment_single(cls, text: str) -> str: raise CommentParseError( f"'{line}' does not start with a comment marker" ) - line = line.lstrip(cls.SINGLE_LINE) + line = line.removeprefix(cls.SINGLE_LINE) result_lines.append(line) result = "\n".join(result_lines) @@ -909,7 +908,7 @@ class XQueryCommentStyle(CommentStyle): } -def _all_style_classes() -> List[Type[CommentStyle]]: +def _all_style_classes() -> list[Type[CommentStyle]]: """Return a list of all defined style classes, excluding the base class.""" result = [] for key, value in globals().items(): diff --git a/src/reuse/convert_dep5.py b/src/reuse/convert_dep5.py index da6dca79f..b33a8b219 100644 --- a/src/reuse/convert_dep5.py +++ b/src/reuse/convert_dep5.py @@ -8,7 +8,7 @@ import sys from argparse import ArgumentParser, Namespace from gettext import gettext as _ -from typing import IO, Any, Dict, Iterable, List, Optional, TypeVar, Union, cast +from typing import IO, Any, Iterable, Optional, TypeVar, Union, cast import tomlkit from debian.copyright import Copyright, FilesParagraph, Header @@ -23,8 +23,8 @@ def _collapse_list_if_one_item( # Technically this should be Sequence[_T], but I can't get that to work. - sequence: List[_T], -) -> Union[List[_T], _T]: + sequence: list[_T], +) -> Union[list[_T], _T]: """Return the only item of the list if the length of the list is one, else return the list. """ @@ -35,8 +35,8 @@ def _collapse_list_if_one_item( def _header_from_dep5_header( header: Header, -) -> Dict[str, Union[str, List[str]]]: - result: Dict[str, Union[str, List[str]]] = {} +) -> dict[str, Union[str, list[str]]]: + result: dict[str, Union[str, list[str]]] = {} if header.upstream_name: result["SPDX-PackageName"] = str(header.upstream_name) if header.upstream_contact: @@ -52,7 +52,7 @@ def _header_from_dep5_header( def _copyrights_from_paragraph( paragraph: FilesParagraph, -) -> Union[str, List[str]]: +) -> Union[str, list[str]]: return _collapse_list_if_one_item( [line.strip() for line in cast(str, paragraph.copyright).splitlines()] ) @@ -65,7 +65,7 @@ def _convert_asterisk(path: str) -> str: return _SINGLE_ASTERISK_PATTERN.sub("**", path) -def _paths_from_paragraph(paragraph: FilesParagraph) -> Union[str, List[str]]: +def _paths_from_paragraph(paragraph: FilesParagraph) -> Union[str, list[str]]: return _collapse_list_if_one_item( [_convert_asterisk(path) for path in list(paragraph.files)] ) @@ -77,7 +77,7 @@ def _comment_from_paragraph(paragraph: FilesParagraph) -> Optional[str]: def _annotations_from_paragraphs( paragraphs: Iterable[FilesParagraph], -) -> List[Dict[str, Union[str, List[str]]]]: +) -> list[dict[str, Union[str, list[str]]]]: annotations = [] for paragraph in paragraphs: copyrights = _copyrights_from_paragraph(paragraph) @@ -99,7 +99,7 @@ def toml_from_dep5(dep5: Copyright) -> str: """Given a Copyright object, return an equivalent REUSE.toml string.""" header = _header_from_dep5_header(dep5.header) annotations = _annotations_from_paragraphs(dep5.all_files_paragraphs()) - result: Dict[str, Any] = {"version": REUSE_TOML_VERSION} + result: dict[str, Any] = {"version": REUSE_TOML_VERSION} result.update(header) result["annotations"] = annotations return tomlkit.dumps(result) diff --git a/src/reuse/covered_files.py b/src/reuse/covered_files.py index 753e643b9..549b331f7 100644 --- a/src/reuse/covered_files.py +++ b/src/reuse/covered_files.py @@ -12,14 +12,14 @@ import logging import os from pathlib import Path -from typing import Collection, Generator, Optional, Set, cast +from typing import Collection, Generator, Optional, cast from . import ( _IGNORE_DIR_PATTERNS, _IGNORE_FILE_PATTERNS, _IGNORE_MESON_PARENT_DIR_PATTERNS, ) -from ._util import StrPath, is_relative_to +from ._util import StrPath from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) @@ -60,8 +60,7 @@ def is_path_ignored( elif path.is_dir(): if subset_files is not None and not any( - is_relative_to(Path(file_), path.resolve()) - for file_ in subset_files + Path(file_).is_relative_to(path.resolve()) for file_ in subset_files ): return True for pattern in _IGNORE_DIR_PATTERNS: @@ -102,7 +101,7 @@ def iter_files( directory = Path(directory) if subset_files is not None: subset_files = cast( - Set[Path], {Path(file_).resolve() for file_ in subset_files} + set[Path], {Path(file_).resolve() for file_ in subset_files} ) for root_str, dirs, files in os.walk(directory): diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 18fef001f..f0b1b9b77 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -17,12 +17,8 @@ Any, Callable, Collection, - Dict, Generator, - List, Optional, - Set, - Tuple, Type, TypeVar, Union, @@ -39,7 +35,7 @@ from license_expression import ExpressionError from . import ReuseException, ReuseInfo, SourceType -from ._util import _LICENSING, StrPath, is_relative_to +from ._util import _LICENSING, StrPath from .covered_files import iter_files from .vcs import VCSStrategy @@ -198,18 +194,18 @@ def _str_to_global_precedence(value: Any) -> PrecedenceType: @overload -def _str_to_set(value: str) -> Set[str]: ... +def _str_to_set(value: str) -> set[str]: ... @overload -def _str_to_set(value: Union[None, _T, Collection[_T]]) -> Set[_T]: ... +def _str_to_set(value: Union[None, _T, Collection[_T]]) -> set[_T]: ... def _str_to_set( value: Union[str, None, _T, Collection[_T]] -) -> Union[Set[str], Set[_T]]: +) -> Union[set[str], set[_T]]: if value is None: - return cast(Set[str], set()) + return cast(set[str], set()) if isinstance(value, str): return {value} if hasattr(value, "__iter__"): @@ -217,7 +213,7 @@ def _str_to_set( return {value} -def _str_to_set_of_expr(value: Any) -> Set[Expression]: +def _str_to_set_of_expr(value: Any) -> set[Expression]: value = _str_to_set(value) result = set() for expression in value: @@ -255,7 +251,7 @@ def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": @abstractmethod def reuse_info_of( self, path: StrPath - ) -> Dict[PrecedenceType, List[ReuseInfo]]: + ) -> dict[PrecedenceType, list[ReuseInfo]]: """Find the REUSE information of *path* defined in the configuration. The path must be relative to the root of a :class:`reuse.project.Project`. @@ -290,7 +286,7 @@ def from_file(cls, path: StrPath, **kwargs: Any) -> "ReuseDep5": def reuse_info_of( self, path: StrPath - ) -> Dict[PrecedenceType, List[ReuseInfo]]: + ) -> dict[PrecedenceType, list[ReuseInfo]]: path = PurePath(path).as_posix() result = self.dep5_copyright.find_files_paragraph(path) @@ -330,19 +326,19 @@ class AnnotationsItem: "spdx_expressions": "SPDX-License-Identifier", } - paths: Set[str] = attrs.field( + paths: set[str] = attrs.field( converter=_str_to_set, validator=_validate_collection_of(set, str, optional=False), ) precedence: PrecedenceType = attrs.field( converter=_str_to_global_precedence, default=PrecedenceType.CLOSEST ) - copyright_lines: Set[str] = attrs.field( + copyright_lines: set[str] = attrs.field( converter=_str_to_set, validator=_validate_collection_of(set, str, optional=True), default=None, ) - spdx_expressions: Set[Expression] = attrs.field( + spdx_expressions: set[Expression] = attrs.field( converter=_str_to_set_of_expr, validator=_validate_collection_of(set, Expression, optional=True), default=None, @@ -394,7 +390,7 @@ def translate(path: str) -> str: ) @classmethod - def from_dict(cls, values: Dict[str, Any]) -> "AnnotationsItem": + def from_dict(cls, values: dict[str, Any]) -> "AnnotationsItem": """Create an :class:`AnnotationsItem` from a dictionary that uses the key-value pairs for an [[annotations]] table in REUSE.toml. """ @@ -423,12 +419,12 @@ class ReuseTOML(GlobalLicensing): """A class that contains the data parsed from a REUSE.toml file.""" version: int = attrs.field(validator=_instance_of(int)) - annotations: List[AnnotationsItem] = attrs.field( + annotations: list[AnnotationsItem] = attrs.field( validator=_validate_collection_of(list, AnnotationsItem, optional=True) ) @classmethod - def from_dict(cls, values: Dict[str, Any], source: str) -> "ReuseTOML": + def from_dict(cls, values: dict[str, Any], source: str) -> "ReuseTOML": """Create a :class:`ReuseTOML` from the dict version of REUSE.toml.""" new_dict = {} new_dict["version"] = values.get("version") @@ -481,7 +477,7 @@ def find_annotations_item(self, path: StrPath) -> Optional[AnnotationsItem]: def reuse_info_of( self, path: StrPath - ) -> Dict[PrecedenceType, List[ReuseInfo]]: + ) -> dict[PrecedenceType, list[ReuseInfo]]: path = PurePath(path).as_posix() item = self.find_annotations_item(path) if item: @@ -508,7 +504,7 @@ def directory(self) -> PurePath: class NestedReuseTOML(GlobalLicensing): """A class that represents a hierarchy of :class:`ReuseTOML` objects.""" - reuse_tomls: List[ReuseTOML] = attrs.field() + reuse_tomls: list[ReuseTOML] = attrs.field() @classmethod def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": @@ -531,10 +527,10 @@ def from_file(cls, path: StrPath, **kwargs: Any) -> "GlobalLicensing": def reuse_info_of( self, path: StrPath - ) -> Dict[PrecedenceType, List[ReuseInfo]]: + ) -> dict[PrecedenceType, list[ReuseInfo]]: path = PurePath(path) - toml_items: List[Tuple[ReuseTOML, AnnotationsItem]] = ( + toml_items: list[tuple[ReuseTOML, AnnotationsItem]] = ( self._find_relevant_tomls_and_items(path) ) @@ -564,7 +560,7 @@ def reuse_info_of( # Consider copyright and licensing separately. copyright_found = False licence_found = False - to_keep: List[ReuseInfo] = [] + to_keep: list[ReuseInfo] = [] for info in reversed(result[PrecedenceType.CLOSEST]): new_info = info.copy(copyright_lines=set(), spdx_expressions=set()) if not copyright_found and info.copyright_lines: @@ -604,11 +600,10 @@ def find_reuse_tomls( if item.name == "REUSE.toml" ) - def _find_relevant_tomls(self, path: StrPath) -> List[ReuseTOML]: + def _find_relevant_tomls(self, path: StrPath) -> list[ReuseTOML]: found = [] for toml in self.reuse_tomls: - # TODO: When Python 3.8 is dropped, use is_relative_to instead. - if is_relative_to(PurePath(path), toml.directory): + if PurePath(path).is_relative_to(toml.directory): found.append(toml) # Sort from topmost to deepest directory. found.sort(key=lambda toml: toml.directory.parts) @@ -616,7 +611,7 @@ def _find_relevant_tomls(self, path: StrPath) -> List[ReuseTOML]: def _find_relevant_tomls_and_items( self, path: StrPath - ) -> List[Tuple[ReuseTOML, AnnotationsItem]]: + ) -> list[tuple[ReuseTOML, AnnotationsItem]]: # *path* is relative to the Project root, which is the *source* of # NestedReuseTOML, which itself is a relative (to CWD) or absolute # path. @@ -624,7 +619,7 @@ def _find_relevant_tomls_and_items( adjusted_path = PurePath(self.source) / path tomls = self._find_relevant_tomls(adjusted_path) - toml_items: List[Tuple[ReuseTOML, AnnotationsItem]] = [] + toml_items: list[tuple[ReuseTOML, AnnotationsItem]] = [] for toml in tomls: relpath = adjusted_path.relative_to(toml.directory) item = toml.find_annotations_item(relpath) diff --git a/src/reuse/header.py b/src/reuse/header.py index b125e9464..bf7b9abb7 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -17,7 +17,7 @@ import logging import re from gettext import gettext as _ -from typing import NamedTuple, Optional, Sequence, Tuple, Type, cast +from typing import NamedTuple, Optional, Sequence, Type, cast from boolean.boolean import ParseError from jinja2 import Environment, PackageLoader, Template @@ -206,7 +206,7 @@ def _find_first_spdx_comment( raise MissingReuseInfo() -def _extract_shebang(prefix: str, text: str) -> Tuple[str, str]: +def _extract_shebang(prefix: str, text: str) -> tuple[str, str]: """Remove all lines that start with the shebang prefix from *text*. Return a tuple of (shebang, reduced_text). """ diff --git a/src/reuse/project.py b/src/reuse/project.py index 3f6148931..c4f12038c 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -17,16 +17,7 @@ from collections import defaultdict from gettext import gettext as _ from pathlib import Path -from typing import ( - Collection, - DefaultDict, - Dict, - Iterator, - List, - NamedTuple, - Optional, - Type, -) +from typing import Collection, Iterator, NamedTuple, Optional, Type import attrs from binaryornot.check import is_binary @@ -81,10 +72,10 @@ class Project: global_licensing: Optional[GlobalLicensing] = None # TODO: I want to get rid of these, or somehow refactor this mess. - license_map: Dict[str, Dict] = attrs.field() - licenses: Dict[str, Path] = attrs.field(factory=dict) + license_map: dict[str, dict] = attrs.field() + licenses: dict[str, Path] = attrs.field(factory=dict) - licenses_without_extension: Dict[str, Path] = attrs.field( + licenses_without_extension: dict[str, Path] = attrs.field( init=False, factory=dict ) @@ -93,7 +84,7 @@ def _default_vcs_strategy(self) -> VCSStrategy: return VCSStrategyNone(self.root) @license_map.default - def _default_license_map(self) -> Dict[str, Dict]: + def _default_license_map(self) -> dict[str, dict]: license_map = LICENSE_MAP.copy() license_map.update(EXCEPTION_MAP) return license_map @@ -218,7 +209,7 @@ def subset_files( vcs_strategy=self.vcs_strategy, ) - def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: + def reuse_info_of(self, path: StrPath) -> list[ReuseInfo]: """Return REUSE info of *path*. This function will return any REUSE information that it can find: from @@ -250,11 +241,11 @@ def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: # This means that only one 'source' of licensing/copyright information # is captured in ReuseInfo - global_results: "DefaultDict[PrecedenceType, List[ReuseInfo]]" = ( + global_results: defaultdict[PrecedenceType, list[ReuseInfo]] = ( defaultdict(list) ) file_result = ReuseInfo() - result: List[ReuseInfo] = [] + result: list[ReuseInfo] = [] # Search the global licensing file for REUSE information. if self.global_licensing: @@ -327,7 +318,7 @@ def find_global_licensing( include_submodules: bool = False, include_meson_subprojects: bool = False, vcs_strategy: Optional[VCSStrategy] = None, - ) -> List[GlobalLicensingFound]: + ) -> list[GlobalLicensingFound]: """Find the path and corresponding class of a project directory's :class:`GlobalLicensing`. @@ -335,7 +326,7 @@ def find_global_licensing( GlobalLicensingConflict: if more than one global licensing config file is present. """ - candidates: List[GlobalLicensingFound] = [] + candidates: list[GlobalLicensingFound] = [] dep5_path = root / ".reuse/dep5" if (dep5_path).exists(): # Sneaky workaround to not print this warning. @@ -377,7 +368,7 @@ def find_global_licensing( @classmethod def _global_licensing_from_found( - cls, found: List[GlobalLicensingFound], root: StrPath + cls, found: list[GlobalLicensingFound], root: StrPath ) -> GlobalLicensing: if len(found) == 1 and found[0].cls == ReuseDep5: return ReuseDep5.from_file(found[0].path) @@ -403,12 +394,12 @@ def _identifier_of_license(self, path: Path) -> str: f"Could not find SPDX License Identifier for {path}" ) - def _find_licenses(self) -> Dict[str, Path]: + def _find_licenses(self) -> dict[str, Path]: """Return a dictionary of all licenses in the project, with their SPDX identifiers as names and paths as values. """ # TODO: This method does more than one thing. We ought to simplify it. - license_files: Dict[str, Path] = {} + license_files: dict[str, Path] = {} directory = str(self.root / "LICENSES/**") for path_str in glob.iglob(directory, recursive=True): diff --git a/src/reuse/report.py b/src/reuse/report.py index 70032d0b3..fff28242b 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -24,13 +24,10 @@ from typing import ( Any, Collection, - Dict, Iterable, - List, NamedTuple, Optional, Protocol, - Set, cast, ) from uuid import uuid4 @@ -167,16 +164,16 @@ class ProjectReportSubsetProtocol(Protocol): """ path: StrPath - missing_licenses: Dict[str, Set[Path]] - read_errors: Set[Path] - file_reports: Set["FileReport"] + missing_licenses: dict[str, set[Path]] + read_errors: set[Path] + file_reports: set["FileReport"] @property - def files_without_licenses(self) -> Set[Path]: + def files_without_licenses(self) -> set[Path]: """Set of paths that have no licensing information.""" @property - def files_without_copyright(self) -> Set[Path]: + def files_without_copyright(self) -> set[Path]: """Set of paths that have no copyright information.""" @property @@ -189,23 +186,23 @@ class ProjectReport: # pylint: disable=too-many-instance-attributes def __init__(self, do_checksum: bool = True): self.path: StrPath = "" - self.licenses: Dict[str, Path] = {} - self.missing_licenses: Dict[str, Set[Path]] = {} - self.bad_licenses: Dict[str, Set[Path]] = {} - self.deprecated_licenses: Set[str] = set() - self.read_errors: Set[Path] = set() - self.file_reports: Set[FileReport] = set() - self.licenses_without_extension: Dict[str, Path] = {} + self.licenses: dict[str, Path] = {} + self.missing_licenses: dict[str, set[Path]] = {} + self.bad_licenses: dict[str, set[Path]] = {} + self.deprecated_licenses: set[str] = set() + self.read_errors: set[Path] = set() + self.file_reports: set[FileReport] = set() + self.licenses_without_extension: dict[str, Path] = {} self.do_checksum = do_checksum - self._unused_licenses: Optional[Set[str]] = None - self._used_licenses: Optional[Set[str]] = None - self._files_without_licenses: Optional[Set[Path]] = None - self._files_without_copyright: Optional[Set[Path]] = None + self._unused_licenses: Optional[set[str]] = None + self._used_licenses: Optional[set[str]] = None + self._files_without_licenses: Optional[set[Path]] = None + self._files_without_copyright: Optional[set[Path]] = None self._is_compliant: Optional[bool] = None - def to_dict_lint(self) -> Dict[str, Any]: + def to_dict_lint(self) -> dict[str, Any]: """Collects and formats data relevant to linting from report and returns it as a dictionary. @@ -213,7 +210,7 @@ def to_dict_lint(self) -> Dict[str, Any]: Dictionary containing data from the ProjectReport object. """ # Setup report data container - data: Dict[str, Any] = { + data: dict[str, Any] = { "non_compliant": { "missing_licenses": self.missing_licenses, "unused_licenses": [str(file) for file in self.unused_licenses], @@ -419,7 +416,7 @@ def generate( return project_report @property - def used_licenses(self) -> Set[str]: + def used_licenses(self) -> set[str]: """Set of license identifiers that are found in file reports.""" if self._used_licenses is not None: return self._used_licenses @@ -432,7 +429,7 @@ def used_licenses(self) -> Set[str]: return self._used_licenses @property - def unused_licenses(self) -> Set[str]: + def unused_licenses(self) -> set[str]: """Set of license identifiers that are not found in any file report.""" if self._unused_licenses is not None: return self._unused_licenses @@ -450,7 +447,7 @@ def unused_licenses(self) -> Set[str]: return self._unused_licenses @property - def files_without_licenses(self) -> Set[Path]: + def files_without_licenses(self) -> set[Path]: """Set of paths that have no licensing information.""" if self._files_without_licenses is not None: return self._files_without_licenses @@ -464,7 +461,7 @@ def files_without_licenses(self) -> Set[Path]: return self._files_without_licenses @property - def files_without_copyright(self) -> Set[Path]: + def files_without_copyright(self) -> set[Path]: """Set of paths that have no copyright information.""" if self._files_without_copyright is not None: return self._files_without_copyright @@ -499,7 +496,7 @@ def is_compliant(self) -> bool: return self._is_compliant @property - def recommendations(self) -> List[str]: + def recommendations(self) -> list[str]: """Generate help for next steps based on found REUSE issues""" recommendations = [] @@ -589,9 +586,9 @@ class ProjectSubsetReport: def __init__(self) -> None: self.path: StrPath = "" - self.missing_licenses: Dict[str, Set[Path]] = {} - self.read_errors: Set[Path] = set() - self.file_reports: Set[FileReport] = set() + self.missing_licenses: dict[str, set[Path]] = {} + self.read_errors: set[Path] = set() + self.file_reports: set[FileReport] = set() @classmethod def generate( @@ -632,7 +629,7 @@ def generate( return subset_report @property - def files_without_licenses(self) -> Set[Path]: + def files_without_licenses(self) -> set[Path]: """Set of paths that have no licensing information.""" return { file_report.path @@ -641,7 +638,7 @@ def files_without_licenses(self) -> Set[Path]: } @property - def files_without_copyright(self) -> Set[Path]: + def files_without_copyright(self) -> set[Path]: """Set of paths that have no copyright information.""" return { file_report.path @@ -670,24 +667,22 @@ def __init__(self, name: str, path: StrPath, do_checksum: bool = True): self.path = Path(path) self.do_checksum = do_checksum - self.reuse_infos: List[ReuseInfo] = [] + self.reuse_infos: list[ReuseInfo] = [] self.spdx_id: Optional[str] = None self.chk_sum: Optional[str] = None - self.licenses_in_file: List[str] = [] + self.licenses_in_file: list[str] = [] self.license_concluded: str = "" self.copyright: str = "" - self.bad_licenses: Set[str] = set() - self.missing_licenses: Set[str] = set() + self.bad_licenses: set[str] = set() + self.missing_licenses: set[str] = set() - def to_dict_lint(self) -> Dict[str, Any]: + def to_dict_lint(self) -> dict[str, Any]: """Turn the report into a json-like dictionary with exclusively information relevant for linting. """ return { - # This gets rid of the './' prefix. In Python 3.9, use - # str.removeprefix. "path": PurePath(self.name).as_posix(), "copyrights": [ { diff --git a/src/reuse/vcs.py b/src/reuse/vcs.py index daca12da8..eaec9f7ac 100644 --- a/src/reuse/vcs.py +++ b/src/reuse/vcs.py @@ -15,7 +15,7 @@ from abc import ABC, abstractmethod from inspect import isclass from pathlib import Path -from typing import TYPE_CHECKING, Generator, Optional, Set, Type +from typing import TYPE_CHECKING, Generator, Optional, Type from ._util import ( GIT_EXE, @@ -99,7 +99,7 @@ def __init__(self, root: StrPath): self._all_ignored_files = self._find_all_ignored_files() self._submodules = self._find_submodules() - def _find_all_ignored_files(self) -> Set[Path]: + def _find_all_ignored_files(self) -> set[Path]: """Return a set of all files ignored by git. If a whole directory is ignored, don't return all files inside of it. """ @@ -121,7 +121,7 @@ def _find_all_ignored_files(self) -> Set[Path]: all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} - def _find_submodules(self) -> Set[Path]: + def _find_submodules(self) -> set[Path]: command = [ str(self.EXE), "config", @@ -191,7 +191,7 @@ def __init__(self, root: StrPath): raise FileNotFoundError("Could not find binary for Mercurial") self._all_ignored_files = self._find_all_ignored_files() - def _find_all_ignored_files(self) -> Set[Path]: + def _find_all_ignored_files(self) -> set[Path]: """Return a set of all files ignored by mercurial. If a whole directory is ignored, don't return all files inside of it. """ @@ -258,7 +258,7 @@ def __init__(self, root: StrPath): raise FileNotFoundError("Could not find binary for Jujutsu") self._all_tracked_files = self._find_all_tracked_files() - def _find_all_tracked_files(self) -> Set[Path]: + def _find_all_tracked_files(self) -> set[Path]: """ Return a set of all files tracked in the current jj revision """ @@ -323,7 +323,7 @@ def __init__(self, root: StrPath): raise FileNotFoundError("Could not find binary for Pijul") self._all_tracked_files = self._find_all_tracked_files() - def _find_all_tracked_files(self) -> Set[Path]: + def _find_all_tracked_files(self) -> set[Path]: """Return a set of all files tracked by pijul.""" command = [str(self.EXE), "list"] result = execute_command(command, _LOGGER, cwd=self.root) From d02f02d0f654e3e00089905ef0517d022e1020ea Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 16:47:36 +0200 Subject: [PATCH 056/156] Add a note on Python 3.9 deprecation Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 6ad6c3bcd..495f35ed6 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -16,6 +16,9 @@ change the public API. """ +# TODO: When Python 3.9 is dropped, consider using `type | None` instead of +# `Optional[type]`. + import gettext import logging import os From 909e6e80809ea3618522bcb56c3230a52aa5ee45 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 16:48:37 +0200 Subject: [PATCH 057/156] Add a note on Python 3.10 deprecation Signed-off-by: Carmen Bianca BAKKER --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index d31ae9cdb..7c99550e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,8 @@ binaryornot = ">=0.4.4" "boolean.py" = ">=3.8" license-expression = ">=1.0" python-debian = ">=0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" +# TODO: Consider removing this dependency in favour of tomllib when dropping +# Python 3.10. tomlkit = ">=0.8" attrs = ">=21.3" From f162262c3903af4cc074995475577e0dd09afb9f Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 26 Sep 2024 17:05:25 +0200 Subject: [PATCH 058/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/removed/python-3.8.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/removed/python-3.8.md diff --git a/changelog.d/removed/python-3.8.md b/changelog.d/removed/python-3.8.md new file mode 100644 index 000000000..46bc7c986 --- /dev/null +++ b/changelog.d/removed/python-3.8.md @@ -0,0 +1 @@ +- Python 3.8 support removed. (#1080) From 7b8514a0be384e7d9dc58cc3417c67ff3948602a Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Sun, 22 Sep 2024 11:57:57 +0100 Subject: [PATCH 059/156] Add shell completion via shtab Having a shell completion improves developers' workflow and makes it easier for everyone to notice as the program gains new options. This commit adds support for generatic static completion files via shtab. Unlike other solutions which repeatedly invoke the underlying program, to retrieve the next suggestion, shtab parses argparse options and produces a complete static file. It currently supports bash, tcsh and bash with PR opened for fish support. For example, to generate zsh completion use: - reuse --print-completion zsh > /usr/share/zsh/site-functions/_reuse This can be done by the reuse project itself, the package maintainer or end-user. For more details, see https://github.com/iterative/shtab Closes: https://github.com/fsfe/reuse-tool/issues/629 Co-authored-by: Carmen Bianca BAKKER Reviewed-by: Emil Velikov Signed-off-by: Carmen Bianca BAKKER Signed-off-by: Emil Velikov - Mersho - Skyler Grey +- Emil Velikov diff --git a/README.md b/README.md index 151675b81..7ff8336db 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,16 @@ repos: - id: reuse-lint-file ``` +### Shell completion + +You can generate a shell completion script with `reuse --print-completion bash`. +Replace 'bash' as needed. You must place the printed text in a file dictated by +your shell to benefit from completions. + +This functionality depends on `shtab`, which is an optional dependency. To +benefit from this feature, install reuse with the `completion` extra, like +`pipx install reuse[completion]`. + ## Maintainers - Carmen Bianca Bakker diff --git a/changelog.d/added/shtab.md b/changelog.d/added/shtab.md new file mode 100644 index 000000000..b3543469a --- /dev/null +++ b/changelog.d/added/shtab.md @@ -0,0 +1 @@ +- Added `--print-completion` using a new `shtab` optional dependency. (#1076) diff --git a/docs/man/reuse.rst b/docs/man/reuse.rst index 9ffbd6597..121b66144 100644 --- a/docs/man/reuse.rst +++ b/docs/man/reuse.rst @@ -1,6 +1,7 @@ .. SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. SPDX-FileCopyrightText: © 2020 Liferay, Inc. + SPDX-FileCopyrightText: 2024 Emil Velikov SPDX-License-Identifier: CC-BY-SA-4.0 @@ -77,6 +78,17 @@ Options current working directory's VCS repository, or to the current working directory. +.. option:: -s, --print-completion SHELL + + Print a static shell completion script for the given shell and exit. You must + place the printed text in a file dictated by your shell before the completions + will function. For Bash, this file is + ``${XDG_DATA_HOME}/bash-completion/reuse``. + + This option depends on ``shtab``, which is an optional dependency of + :program:`reuse`. The supported shells depend on your installed version of + ``shtab``. + .. option:: -h, --help Display help and exit. If no command is provided, this option is implied. diff --git a/poetry.lock b/poetry.lock index f111b82d3..40ba1aa46 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1392,6 +1392,21 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "shtab" +version = "1.7.1" +description = "Automagic shell tab completion for Python CLI applications" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "shtab-1.7.1-py3-none-any.whl", hash = "sha256:32d3d2ff9022d4c77a62492b6ec875527883891e33c6b479ba4d41a51e259983"}, + {file = "shtab-1.7.1.tar.gz", hash = "sha256:4e4bcb02eeb82ec45920a5d0add92eac9c9b63b2804c9196c1f1fdc2d039243c"}, +] + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + [[package]] name = "six" version = "1.16.0" @@ -1796,7 +1811,10 @@ files = [ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[extras] +completion = ["shtab"] + [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "be47ee3f7fe85c83152cadb5b1755beb125dc2766f19a10615c4eeae02d2349b" +content-hash = "de64d8500ffb6b578394daaa489960517c59cdb9836c53102ac6510fd279280c" diff --git a/pyproject.toml b/pyproject.toml index 7c99550e1..420c0a0ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,10 @@ python-debian = ">=0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" # Python 3.10. tomlkit = ">=0.8" attrs = ">=21.3" +shtab = { version = ">=1.4.0", optional = true } + +[tool.poetry.extras] +completion = ["shtab"] [tool.poetry.group.test.dependencies] pytest = ">=6.0.0" diff --git a/src/reuse/_main.py b/src/reuse/_main.py index d395f302d..2fb50c971 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -3,18 +3,21 @@ # SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Emil Velikov # # SPDX-License-Identifier: GPL-3.0-or-later """Entry functions for reuse.""" import argparse +import contextlib import logging import os import sys import warnings from gettext import gettext as _ from pathlib import Path +from types import ModuleType from typing import IO, Callable, Optional, Type, cast from . import ( @@ -34,6 +37,10 @@ from .project import GlobalLicensingConflict, Project from .vcs import find_root +shtab: Optional[ModuleType] = None +with contextlib.suppress(ImportError): + import shtab # type: ignore[no-redef,import-not-found] + _LOGGER = logging.getLogger(__name__) _DESCRIPTION_LINES = [ @@ -103,6 +110,9 @@ def parser() -> argparse.ArgumentParser: type=PathType("r", force_directory=True), help=_("define root of project"), ) + if shtab: + # This is magic. Running `reuse -s bash` now prints bash completions. + shtab.add_argument_to(parser, ["-s", "--print-completion"]) parser.add_argument( "--version", action="store_true", diff --git a/tests/test_main.py b/tests/test_main.py index 424ea7048..d3443d3ae 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -29,7 +29,7 @@ from freezegun import freeze_time from reuse import download -from reuse._main import main +from reuse._main import main, shtab from reuse._util import GIT_EXE, HG_EXE, JUJUTSU_EXE, PIJUL_EXE, cleandoc_nl from reuse.report import LINT_VERSION @@ -88,6 +88,16 @@ def mock_put_license_in_file(monkeypatch): return result +@pytest.mark.skipif(not shtab, reason="shtab required") +def test_print_completion(capsys): + """shtab completions are printed.""" + with pytest.raises(SystemExit) as error: + main(["--print-completion", "bash"]) + + assert error.value.code == 0 + assert "AUTOMATICALLY GENERATED by `shtab`" in capsys.readouterr().out + + def test_lint(fake_repository, stringio, optional_git_exe, optional_hg_exe): """Run a successful lint. The optional VCSs are there to make sure that the test also works if these programs are not installed. From 61b34d8dddc47a7925a7a9b33fbbf911b4d5e6e3 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 27 Sep 2024 19:57:14 +0200 Subject: [PATCH 060/156] Update poetry.lock --- poetry.lock | 669 +++++++++++++++++++++++++++------------------------- 1 file changed, 354 insertions(+), 315 deletions(-) diff --git a/poetry.lock b/poetry.lock index 40ba1aa46..baa868b63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,26 +2,26 @@ [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "astroid" -version = "3.2.2" +version = "3.3.4" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "astroid-3.2.2-py3-none-any.whl", hash = "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0"}, - {file = "astroid-3.2.2.tar.gz", hash = "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94"}, + {file = "astroid-3.3.4-py3-none-any.whl", hash = "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd"}, + {file = "astroid-3.3.4.tar.gz", hash = "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162"}, ] [package.dependencies] @@ -29,34 +29,34 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -101,34 +101,34 @@ chardet = ">=3.0.2" [[package]] name = "black" -version = "24.4.2" +version = "24.8.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -179,14 +179,14 @@ toml = "*" [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -342,64 +342,84 @@ files = [ [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.1" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -450,26 +470,26 @@ files = [ [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -477,20 +497,20 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "freezegun" @@ -509,20 +529,20 @@ python-dateutil = ">=2.7" [[package]] name = "furo" -version = "2024.5.6" +version = "2024.8.6" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"}, - {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"}, + {file = "furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c"}, + {file = "furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=6.0,<8.0" +sphinx = ">=6.0,<9.0" sphinx-basic-ng = ">=1.0.0.beta2" [[package]] @@ -561,14 +581,14 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "identify" -version = "2.5.36" +version = "2.6.1" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -576,16 +596,19 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -600,23 +623,27 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.5.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -697,14 +724,14 @@ files = [ [[package]] name = "license-expression" -version = "30.3.0" +version = "30.3.1" description = "license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic." category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "license-expression-30.3.0.tar.gz", hash = "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5"}, - {file = "license_expression-30.3.0-py3-none-any.whl", hash = "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41"}, + {file = "license_expression-30.3.1-py3-none-any.whl", hash = "sha256:97904b9185c7bbb1e98799606fa7424191c375e70ba63a524b6f7100e42ddc46"}, + {file = "license_expression-30.3.1.tar.gz", hash = "sha256:60d5bec1f3364c256a92b9a08583d7ea933c7aa272c8d36d04144a89a3858c01"}, ] [package.dependencies] @@ -835,14 +862,14 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -867,45 +894,45 @@ files = [ [[package]] name = "mypy" -version = "1.10.1" +version = "1.11.2" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, - {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, - {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, - {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, - {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, - {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, - {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, - {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, - {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, - {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, - {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, - {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, - {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, - {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, - {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, - {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, - {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, - {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, - {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, + {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, + {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, + {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, + {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, + {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, + {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, + {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, + {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, + {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, + {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, + {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, + {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, + {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, + {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, + {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, + {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, + {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -1006,32 +1033,32 @@ files = [ [[package]] name = "pbr" -version = "6.0.0" +version = "6.1.0" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, - {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, + {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, + {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, ] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1051,14 +1078,14 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.5.0" +version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [package.dependencies] @@ -1070,14 +1097,14 @@ virtualenv = ">=20.10.0" [[package]] name = "protokolo" -version = "2.1.4" +version = "3.0.0" description = "Protokolo is a change log generator." category = "dev" optional = false python-versions = "<4.0,>=3.11" files = [ - {file = "protokolo-2.1.4-cp311-cp311-manylinux_2_36_x86_64.whl", hash = "sha256:b10ff72199e5ced3fd662a5b870b673bf37a5c990dd4eacf054bdf3ea5f2e359"}, - {file = "protokolo-2.1.4.tar.gz", hash = "sha256:451addc697e43a2aac4db612acf747ffe839686e5ea71018a5bc1ea5adeddc08"}, + {file = "protokolo-3.0.0-cp311-cp311-manylinux_2_36_x86_64.whl", hash = "sha256:289b4ebfbcb8794ab71becef676e5211f3ac9f9035e79d281284411bd64bc165"}, + {file = "protokolo-3.0.0.tar.gz", hash = "sha256:c92efdd402151f2d478d8bd60d1031744fdd7b2c31d0277bb5246fb6ffb85ed0"}, ] [package.dependencies] @@ -1101,18 +1128,18 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "3.2.5" +version = "3.3.1" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "pylint-3.2.5-py3-none-any.whl", hash = "sha256:32cd6c042b5004b8e857d727708720c54a676d1e22917cf1a2df9b4d4868abd6"}, - {file = "pylint-3.2.5.tar.gz", hash = "sha256:e9b7171e242dcc6ebd0aaa7540481d1a72860748a0a7816b8fe6cf6c80a6fe7e"}, + {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, + {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, ] [package.dependencies] -astroid = ">=3.2.2,<=3.3.0-dev0" +astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -1147,34 +1174,34 @@ python-lsp-server = "*" [[package]] name = "pylsp-mypy" -version = "0.6.8" +version = "0.6.9" description = "Mypy linter for the Python LSP Server" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pylsp-mypy-0.6.8.tar.gz", hash = "sha256:3f8307ca07d7e253e50e38c5fe31c371ceace0bc33d31c3429fa035d6d41bd5f"}, - {file = "pylsp_mypy-0.6.8-py3-none-any.whl", hash = "sha256:3ea7c406d0f100317a212d8cd39075a2c139f1a4a2866d4412fe531b3f23b381"}, + {file = "pylsp_mypy-0.6.9-py3-none-any.whl", hash = "sha256:9b73ece2977b22b5fc75dfec1cc491bf2031955e3da4062d924a5cc22a278151"}, + {file = "pylsp_mypy-0.6.9.tar.gz", hash = "sha256:d28994a6ba123c3918ce3274a5cad768418650e575001002101c425ad6c7bbaa"}, ] [package.dependencies] mypy = ">=0.981" python-lsp-server = ">=1.7.0" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] test = ["coverage", "pytest", "pytest-cov", "tox"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -1182,7 +1209,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -1277,14 +1304,14 @@ test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] [[package]] name = "python-lsp-server" -version = "1.11.0" +version = "1.12.0" description = "Python Language Server for the Language Server Protocol" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "python-lsp-server-1.11.0.tar.gz", hash = "sha256:89edd6fb3f7852e4bf5a3d1d95ea41484d1a28fa94b6e3cbff12b9db123b8e86"}, - {file = "python_lsp_server-1.11.0-py3-none-any.whl", hash = "sha256:278cb41ea69ca9f84ec99d4edc96ff5f2f9e795d240771dc46dc1653f56ddfe3"}, + {file = "python_lsp_server-1.12.0-py3-none-any.whl", hash = "sha256:2e912c661881d85f67f2076e4e66268b695b62bf127e07e81f58b187d4bb6eda"}, + {file = "python_lsp_server-1.12.0.tar.gz", hash = "sha256:b6a336f128da03bd9bac1e61c3acca6e84242b8b31055a1ccf49d83df9dc053b"}, ] [package.dependencies] @@ -1296,11 +1323,11 @@ python-lsp-jsonrpc = ">=1.1.0,<2.0.0" ujson = ">=3.0.0" [package.extras] -all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=7,<8)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.11.0,<2.12.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.2.0,<3.3.0)", "pylint (>=3.1,<4)", "rope (>=1.11.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] +all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=7.1,<8)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.12.0,<2.13.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.2.0,<3.3.0)", "pylint (>=3.1,<4)", "rope (>=1.11.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] autopep8 = ["autopep8 (>=2.0.4,<2.1.0)"] -flake8 = ["flake8 (>=7,<8)"] +flake8 = ["flake8 (>=7.1,<8)"] mccabe = ["mccabe (>=0.7.0,<0.8.0)"] -pycodestyle = ["pycodestyle (>=2.11.0,<2.12.0)"] +pycodestyle = ["pycodestyle (>=2.12.0,<2.13.0)"] pydocstyle = ["pydocstyle (>=6.3.0,<6.4.0)"] pyflakes = ["pyflakes (>=3.2.0,<3.3.0)"] pylint = ["pylint (>=3.1,<4)"] @@ -1311,63 +1338,65 @@ yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1445,51 +1474,52 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sphinx" -version = "7.1.2" +version = "7.4.7" description = "Python documentation generator" category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, - {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.13" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinx-basic-ng" @@ -1527,50 +1557,53 @@ Sphinx = ">=5.0.0" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -1590,34 +1623,36 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -1646,14 +1681,14 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.2" description = "Style preserving TOML library" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] @@ -1758,14 +1793,14 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1776,14 +1811,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.26.6" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, - {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, + {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, + {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, ] [package.dependencies] @@ -1797,19 +1832,23 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [extras] completion = ["shtab"] From 0aebc6e4f595954cab6c791fac4e768c94fedf15 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 27 Sep 2024 20:12:51 +0200 Subject: [PATCH 061/156] Satisfy pylint --- .pylintrc | 3 ++- src/reuse/global_licensing.py | 29 ++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.pylintrc b/.pylintrc index 5d5ace11e..06b0d40d8 100644 --- a/.pylintrc +++ b/.pylintrc @@ -12,7 +12,8 @@ jobs=0 disable=duplicate-code, logging-fstring-interpolation, implicit-str-concat, - inconsistent-quotes + inconsistent-quotes, + too-many-positional-arguments enable=useless-suppression [REPORTS] diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index f0b1b9b77..1d9d4aec4 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -46,6 +46,14 @@ #: Current version of REUSE.toml. REUSE_TOML_VERSION = 1 +#: Relation between Python attribute names and TOML keys. +_TOML_KEYS = { + "paths": "path", + "precedence": "precedence", + "copyright_lines": "SPDX-FileCopyrightText", + "spdx_expressions": "SPDX-License-Identifier", +} + class PrecedenceType(Enum): """An enum of behaviours surrounding order of precedence for entries in a @@ -99,8 +107,8 @@ def __call__( ) -> None: # This is a hack to display the TOML's key names instead of the Python # attributes. - if hasattr(instance, "TOML_KEYS"): - attr_name = instance.TOML_KEYS[attribute.name] + if isinstance(instance, AnnotationsItem): + attr_name = _TOML_KEYS[attribute.name] else: attr_name = attribute.name source = getattr(instance, "source", None) @@ -319,13 +327,6 @@ class AnnotationsItem: REUSE.toml. """ - TOML_KEYS = { - "paths": "path", - "precedence": "precedence", - "copyright_lines": "SPDX-FileCopyrightText", - "spdx_expressions": "SPDX-License-Identifier", - } - paths: set[str] = attrs.field( converter=_str_to_set, validator=_validate_collection_of(set, str, optional=False), @@ -395,15 +396,13 @@ def from_dict(cls, values: dict[str, Any]) -> "AnnotationsItem": key-value pairs for an [[annotations]] table in REUSE.toml. """ new_dict = {} - new_dict["paths"] = values.get(cls.TOML_KEYS["paths"]) - precedence = values.get(cls.TOML_KEYS["precedence"]) + new_dict["paths"] = values.get(_TOML_KEYS["paths"]) + precedence = values.get(_TOML_KEYS["precedence"]) if precedence is not None: new_dict["precedence"] = precedence - new_dict["copyright_lines"] = values.get( - cls.TOML_KEYS["copyright_lines"] - ) + new_dict["copyright_lines"] = values.get(_TOML_KEYS["copyright_lines"]) new_dict["spdx_expressions"] = values.get( - cls.TOML_KEYS["spdx_expressions"] + _TOML_KEYS["spdx_expressions"] ) return cls(**new_dict) # type: ignore From df6d2915794d2f5f8136ad025b8860d45f0bc170 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 30 Sep 2024 15:45:42 +0200 Subject: [PATCH 062/156] Fix listed commands in README Signed-off-by: Carmen Bianca BAKKER --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 66107ce92..0d5029d26 100644 --- a/README.md +++ b/README.md @@ -188,10 +188,11 @@ short summary: - `annotate` --- Add copyright and/or licensing information to the header of a file. - `download` --- Download the specified license into the `LICENSES/` directory. -- `init` --- Set up the project for REUSE compliance. - `lint` --- Verify the project for REUSE compliance. +- `lint-file` --- Verify REUSE compliance of individual files. - `spdx` --- Generate an SPDX Document of all files in the project. - `supported-licenses` --- Prints all licenses supported by REUSE. +- `convert-dep5` --- Convert .reuse/dep5 to REUSE.toml. ### Example demo From d9f18b394bf24e17d6c48d8d702d687db45b2085 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 30 Sep 2024 15:46:01 +0200 Subject: [PATCH 063/156] Fix and add argparse descriptions for subcommands Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_main.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/reuse/_main.py b/src/reuse/_main.py index b5df4a7f7..eefe60f86 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -163,12 +163,19 @@ def parser() -> argparse.ArgumentParser: "- Are there any bad (unrecognised, not compliant with SPDX)" " licenses in the project?\n" "\n" + "- Are there any deprecated licenses in the project?\n" + "\n" + "- Are there any license files in the LICENSES/ directory" + " without file extension?\n" + "\n" "- Are any licenses referred to inside of the project, but" " not included in the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that" " are not used inside of the project?\n" "\n" + "- Are there any read errors?\n" + "\n" "- Do all files have valid copyright and licensing" " information?" ).format(reuse_version=__REUSE_version__) @@ -180,6 +187,14 @@ def parser() -> argparse.ArgumentParser: "lint-file", _lint_file.add_arguments, _lint_file.run, + description=fill_all( + _( + "Lint individual files. The specified files are checked for" + " the presence of copyright and licensing information, and" + " whether the found licenses are included in the LICENSES/" + " directory." + ) + ), help=_("list non-compliant files from specified list of files"), ) @@ -188,6 +203,9 @@ def parser() -> argparse.ArgumentParser: "spdx", spdx.add_arguments, spdx.run, + description=fill_all( + _("Generate an SPDX bill of materials in RDF format.") + ), help=_("print the project's bill of materials in SPDX format"), ) @@ -196,6 +214,9 @@ def parser() -> argparse.ArgumentParser: "supported-licenses", supported_licenses.add_arguments, supported_licenses.run, + description=fill_all( + _("List all non-deprecated SPDX licenses from the official list.") + ), help=_("list all supported SPDX licenses"), aliases=["supported-licences"], ) @@ -205,6 +226,13 @@ def parser() -> argparse.ArgumentParser: "convert-dep5", convert_dep5.add_arguments, convert_dep5.run, + description=fill_all( + _( + "Convert .reuse/dep5 into a REUSE.toml file in your project" + " root. The generated file is semantically identical. The" + " .reuse/dep5 file is subsequently deleted." + ) + ), help=_("convert .reuse/dep5 to REUSE.toml"), ) From 63a93e062d5da6db25d85c5c697cc86dae4ea372 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Mon, 30 Sep 2024 13:59:12 +0000 Subject: [PATCH 064/156] Update reuse.pot --- po/cs.po | 152 ++++++++++++++++++++++++++++++--------------------- po/de.po | 152 ++++++++++++++++++++++++++++++--------------------- po/eo.po | 152 ++++++++++++++++++++++++++++++--------------------- po/es.po | 152 ++++++++++++++++++++++++++++++--------------------- po/fr.po | 152 ++++++++++++++++++++++++++++++--------------------- po/gl.po | 152 ++++++++++++++++++++++++++++++--------------------- po/it.po | 152 ++++++++++++++++++++++++++++++--------------------- po/nl.po | 152 ++++++++++++++++++++++++++++++--------------------- po/pt.po | 152 ++++++++++++++++++++++++++++++--------------------- po/reuse.pot | 151 +++++++++++++++++++++++++++++--------------------- po/ru.po | 152 ++++++++++++++++++++++++++++++--------------------- po/sv.po | 149 ++++++++++++++++++++++++++++++-------------------- po/tr.po | 152 ++++++++++++++++++++++++++++++--------------------- po/uk.po | 152 ++++++++++++++++++++++++++++++--------------------- 14 files changed, 1271 insertions(+), 853 deletions(-) diff --git a/po/cs.po b/po/cs.po index 3ab217400..aaf87e0ff 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-09-14 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech for more information, and " @@ -200,17 +200,17 @@ msgstr "" "naleznete na adrese a online dokumentaci na adrese " "." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Podpořte činnost FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -220,43 +220,43 @@ msgstr "" "práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " "možnost přispět na ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "povolit příkazy pro ladění" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "skrýt varování o zastarání" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "nepřeskakovat submoduly systému Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "nepřeskakovat podprojekty Meson" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "nepoužívat multiprocessing" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "definovat kořen projektu" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit jej" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "dílčí příkazy" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "přidání autorských práv a licencí do záhlaví souborů" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -274,20 +274,20 @@ msgstr "" "Pomocí parametru --contributor můžete určit osoby nebo subjekty, které " "přispěly, ale nejsou držiteli autorských práv daných souborů." -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "seznam všech nevyhovujících souborů" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -298,12 +298,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Zkontrolujte soulad adresáře projektu s verzí {reuse_version} specifikace " @@ -322,23 +329,46 @@ msgstr "" "\n" "- Mají všechny soubory platné informace o autorských právech a licencích?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "seznam nevyhovujících souborů ze zadaného seznamu souborů" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "seznam všech podporovaných licencí SPDX" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "Převeďte .reuse/dep5 do REUSE.toml" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -347,51 +377,51 @@ msgstr "" "'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové hlášení: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Nepodařilo se analyzovat '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' není soubor" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' není adresář" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "nelze otevřít '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "nelze zapisovat do adresáře '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "nelze číst ani zapisovat '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' není platný výraz SPDX, přeruší se" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' není platný identifikátor licence SPDX." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Měl jste na mysli:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -454,14 +484,14 @@ msgstr "jsou vyžadovány tyto argumenty: licence" msgid "cannot use --output with more than one license" msgstr "nelze použít --output s více než jednou licencí" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -470,17 +500,17 @@ msgstr "" "Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, která " "je {item_class})." -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} nesmí být prázdný." -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} musí být {type} (má {value}, která je {value_type})." -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -663,18 +693,18 @@ msgstr "{lic_path}: licence bez přípony souboru\n" msgid "{lic_path}: unused license\n" msgstr "{lic_path}: nepoužitá licence\n" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' zahrnuto v {global_path}" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "'{path}' je zahrnuta výhradně v REUSE.toml. Nečte obsah souboru." -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -683,7 +713,7 @@ msgstr "" "'{path}' byl rozpoznán jako binární soubor; v jeho obsahu nebyly hledány " "informace o REUSE." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -691,7 +721,7 @@ msgstr "" "'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor REUSE." "toml. Pro konverzi použijte `reuse convert-dep5`." -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -700,17 +730,17 @@ msgstr "" "Nalezeno '{new_path}' i '{old_path}'. Oba soubory nelze uchovávat současně, " "nejsou vzájemně kompatibilní." -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "určující identifikátor '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} nemá příponu souboru" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -723,14 +753,14 @@ msgstr "" "adrese nebo zda začíná znakem 'LicenseRef-' a " "zda má příponu souboru." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -738,17 +768,17 @@ msgstr "" "projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný software " "VCS" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Nepodařilo se načíst '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -761,7 +791,7 @@ msgstr "" "Často kladené otázky o vlastních licencích: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -774,7 +804,7 @@ msgstr "" "reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " "nové identifikátory naleznete zde: " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -784,7 +814,7 @@ msgstr "" "adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím způsobem " "přejmenujte." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -799,7 +829,7 @@ msgstr "" "--all' a získat všechny chybějící. Pro vlastní licence (začínající na " "'LicenseRef-') musíte tyto soubory přidat sami." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -813,7 +843,7 @@ msgstr "" "buď správně označili, nebo nepoužitý licenční text odstranili, pokud jste si " "jisti, že žádný soubor nebo kousek kódu není takto licencován." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -823,7 +853,7 @@ msgstr "" "adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v horní " "části výstupu jako součást zaznamenaných chybových hlášení." -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/de.po b/po/de.po index eaf61daeb..5726f530d 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German for more information, and " @@ -202,7 +202,7 @@ msgstr "" "überprüfen. Mehr Informationen finden Sie auf oder " "in der Online-Dokumentation auf ." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -210,11 +210,11 @@ msgstr "" "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" "Spezifikation." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Die Arbeit der FSFE unterstützen:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -224,44 +224,44 @@ msgstr "" "ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo immer es " "nötig ist. Bitte erwägen Sie eine Spende unter ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "Debug-Statements aktivieren" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "„Veraltet“-Warnung verbergen" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "Git-Submodules nicht überspringen" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "Meson-Teilprojekte nicht überspringen" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "kein Multiprocessing verwenden" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "Stammverzeichnis des Projekts bestimmen" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "zeige die Versionsnummer des Programms und beende" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "Unterkommandos" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -272,21 +272,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "alle nicht-konformen Dateien zeigen" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -297,12 +297,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Überprüfen Sie das Projektverzeichnis auf die Einhaltung der Version " @@ -323,23 +330,46 @@ msgstr "" "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " "versehen?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "Komponentenliste im SPDX-Format ausgeben" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "Komponentenliste im SPDX-Format ausgeben" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "Listet alle unterstützten SPDX-Lizenzen auf" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -348,12 +378,12 @@ msgstr "" "'{dep5}' konnte nicht geparst werden. Wir erhielten folgende Fehlermeldung: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -361,39 +391,39 @@ msgstr "" "'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " "Überspringe Datei" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' ist keine Datei" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' ist kein Verzeichnis" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "kann '{}' nicht öffnen" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "kann nicht in Verzeichnis '{}' schreiben" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "kann '{}' nicht lesen oder schreiben" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Meinten Sie:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -455,30 +485,30 @@ msgstr "Die folgenden Argumente sind erforderlich: license" msgid "cannot use --output with more than one license" msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -666,18 +696,18 @@ msgstr "Lizenzen ohne Dateiendung:" msgid "{lic_path}: unused license\n" msgstr "Unbenutzte Lizenzen:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' abgedeckt durch .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, fuzzy, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -687,30 +717,30 @@ msgstr "" "unkommentierbar gekennzeichnet; suche ihre Inhalte nicht nach REUSE-" "Informationen." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "erkenne Identifikator von '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} hat keine Dateiendung" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -723,14 +753,14 @@ msgstr "" "Lizenzliste unter steht oder mit 'LicenseRef-' " "beginnt und eine Dateiendung hat." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -738,17 +768,17 @@ msgstr "" "Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " "nicht installiert" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -761,7 +791,7 @@ msgstr "" "beginnen nicht mit 'LicenseRef-'. FAQ zu benutzerdefinierten Lizenzen: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -775,7 +805,7 @@ msgstr "" "aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " "hier: " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -785,7 +815,7 @@ msgstr "" "Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-Dateierweiterung. " "Bitte benennen Sie die Datei(en) entsprechend um." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -800,7 +830,7 @@ msgstr "" "fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " "'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -815,14 +845,14 @@ msgstr "" "Lizenztext löschen, wenn Sie sicher sind, dass keine Datei oder Code-" "Schnipsel darunter lizenziert ist." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/eo.po b/po/eo.po index d8f16a736..3ada3bcda 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for more information, and " @@ -203,17 +203,17 @@ msgstr "" "reuse.software/> por pli da informo, kaj por " "la reta dokumentado." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Subtenu la laboradon de FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -223,44 +223,44 @@ msgstr "" "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " "pripensi fari donacon ĉe ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "ŝalti sencimigajn ordonojn" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "kaŝi avertojn de evitindaĵoj" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "ne preterpasi Git-submodulojn" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "ne preterpasi Meson-subprojektojn" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "ne uzi plurprocesoradon" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "difini radikon de la projekto" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "montri versionumeron de programo kaj eliri" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "subkomandoj" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -271,21 +271,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "listigi ĉiujn nekonformajn dosierojn" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -296,12 +296,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Kontroli la projektdosierujon por konformiĝo je versio {reuse_version} de la " @@ -319,35 +326,58 @@ msgstr "" "\n" "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "presi la pecoliston de la projekto en SPDX-formo" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "presi la pecoliston de la projekto en SPDX-formo" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -355,39 +385,39 @@ msgstr "" "'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante la " "dosieron" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' ne estas dosiero" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' ne estas dosierujo" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "ne povas malfermi '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "ne povas skribi al dosierujo '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "ne povas legi aŭ skribi '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ne estas valida SPDX Permesila Identigilo." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Ĉu vi intencis:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -449,30 +479,30 @@ msgstr "la sekvaj argumentoj nepras: license" msgid "cannot use --output with more than one license" msgstr "ne povas uzi --output kun pli ol unu permesilo" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -654,48 +684,48 @@ msgstr "Permesiloj sen dosiersufikso:" msgid "{lic_path}: unused license\n" msgstr "Neuzataj permesiloj:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' sub .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "precizigante identigilon de '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} ne havas dosiersufikson" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -707,7 +737,7 @@ msgstr "" "Certigu ke la permesilo estas en la listo ĉe aŭ " "ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -715,23 +745,23 @@ msgstr "" "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " "{other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -739,7 +769,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -748,14 +778,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -764,7 +794,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -773,14 +803,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/es.po b/po/es.po index b9908c04c..b0127e175 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-05-09 08:19+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish for more information, and " @@ -209,7 +209,7 @@ msgstr "" "información, y para acceder a la " "documentación en línea." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -217,11 +217,11 @@ msgstr "" "Esta versión de reuse es compatible con la versión {} de la Especificación " "REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Apoya el trabajo de la FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -232,43 +232,43 @@ msgstr "" "necesario. Por favor, considera el hacer una donación en ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "habilita instrucciones de depuración" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "ocultar las advertencias de que está obsoleto" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "no omitas los submódulos de Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "no te saltes los subproyectos de Meson" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "no utilices multiproceso" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "define el origen del proyecto" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "muestra la versión del programa y sale" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -279,21 +279,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -304,12 +304,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Examina el directorio del proyecto para comprobar su conformidad con la " @@ -329,23 +336,46 @@ msgstr "" "\n" "- ¿Tienen todos los ficheros información válida sobre copyright y licencia?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "imprime la lista de materiales del proyecto en formato SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la lista de materiales del proyecto en formato SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "Lista de todas las licencias SPDX compatibles" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -354,12 +384,12 @@ msgstr "" "{dep5}' no pudo ser analizado. Recibimos el siguiente mensaje de error: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -367,39 +397,39 @@ msgstr "" "'{path}' posee una expresión SPDX que no puede ser procesada; omitiendo el " "archivo" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' no es un fichero" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' no es un directorio" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "no se puede abrir '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "no se pude escribir en el directorio '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "no se puede leer o escribir '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' no es una expresión SPDX válida; abortando" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' no es un Identificador SPDX de Licencia válido." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Querías decir:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -463,30 +493,30 @@ msgstr "se requieren los siguientes parámetros: license" msgid "cannot use --output with more than one license" msgstr "no se puede utilizar --output con más de una licencia" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -675,18 +705,18 @@ msgstr "Licencias sin extensión de fichero:" msgid "{lic_path}: unused license\n" msgstr "Licencias no utilizadas:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' cubierto por .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -695,30 +725,30 @@ msgstr "" "Se ha detectado que '{path}' es un archivo binario; no se ha buscado " "información REUTILIZABLE en su contenido." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinando el identificador de '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} no tiene extensión de fichero" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -731,7 +761,7 @@ msgstr "" "alojada en , o de que empieza por 'LicenseRef-', " "y de que posee una extensión de fichero." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -739,7 +769,7 @@ msgstr "" "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " "{other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -747,17 +777,17 @@ msgstr "" "el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " "está instalado" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -770,7 +800,7 @@ msgstr "" "'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -784,7 +814,7 @@ msgstr "" "los nuevos identificadores recomendados se encuentran aquí: " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -794,7 +824,7 @@ msgstr "" "con la licencia en el directorio 'LICENCIAS' no tiene una extensión '.txt'. " "Cambie el nombre de los archivos en consecuencia." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -810,7 +840,7 @@ msgstr "" "En el caso de las licencias personalizadas (que empiezan por 'LicenseRef-'), " "deberá añadir estos archivos usted mismo." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -825,7 +855,7 @@ msgstr "" "elimine el texto de la licencia no utilizado si está seguro de que ningún " "archivo o fragmento de código tiene una licencia como tal." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -836,7 +866,7 @@ msgstr "" "archivos. Encontrará los archivos afectados en la parte superior como parte " "de los mensajes de los errores registrados." -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/fr.po b/po/fr.po index 481e0a60a..c182875c0 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French for more information, and " @@ -212,7 +212,7 @@ msgstr "" "REUSE. Voir pour plus d'informations, et pour la documentation en ligne." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -220,11 +220,11 @@ msgstr "" "Cette version de reuse est compatible avec la version {} de la spécification " "REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Soutenir le travail de la FSFE :" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -234,45 +234,45 @@ msgstr "" "permettent de continuer à travailler pour le Logiciel Libre partout où c'est " "nécessaire. Merci d'envisager de faire un don ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "activer les instructions de débogage" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "masquer les avertissements d'obsolescence" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "ne pas omettre les sous-modules Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "ne pas omettre les sous-projets Meson" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "ne pas utiliser le multiprocessing" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "définition de la racine (root) du projet" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "voir la version du programme et quitter" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "sous-commandes" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" "ajoute les informations de droits d'auteur et de licence dans les en-têtes " "des fichiers" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -292,20 +292,20 @@ msgstr "" "En utilisant --contributor, vous pouvez spécifier les personnes ou entités " "ayant contribué aux fichiers spécifiés sans être détenteurs de copyright." -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "télécharge une licence et la placer dans le répertoire LICENSES" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Télécharge une licence dans le répertoire LICENSES." -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "liste tous les fichiers non-conformes" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -316,12 +316,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Vérifie le répertoire projet pour assurer la conformité à la version " @@ -342,23 +349,46 @@ msgstr "" "- Tous les fichiers disposent-ils de données de droits d'auteur et de " "licence valides ?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "imprime la nomenclature du projet au format SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la nomenclature du projet au format SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "liste toutes les licences SPDX acceptées" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "convertit .reuse/dep5 en REUSE.toml" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -367,12 +397,12 @@ msgstr "" "'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " "suivant : {message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -380,39 +410,39 @@ msgstr "" "'{path}' contient une expression SPDX qui ne peut pas être analysée : le " "fichier est ignoré" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' n'est pas un fichier" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' n'est pas un répertoire" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "'{}' ne peut être ouvert" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "écriture impossible dans le répertoire '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "lecture ou écriture impossible pour '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' n'est pas une expression SPDX valide, abandon" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' n'est pas un identifiant de licence SPDX valide." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Vouliez-vous dire :" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -476,7 +506,7 @@ msgstr "les arguments suivants sont nécessaires : licence" msgid "cannot use --output with more than one license" msgstr "--output ne peut pas être utilisé avec plus d'une licence" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, fuzzy, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -484,7 +514,7 @@ msgstr "" "{attr_name} doit être un(e) {type_name} (obtenu {value} qui est un(e) " "{value_class})." -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, fuzzy, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -493,18 +523,18 @@ msgstr "" "Les éléments de la collection {attr_name} doivent être des {type_name} " "(obtenu {item_value} qui et un(e) {item_class})." -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} ne doit pas être vide." -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, fuzzy, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} doit être un(e) {type} (obtenu {value} qui est un {value_type})." -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, fuzzy, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -697,12 +727,12 @@ msgstr "{lic_path} : licence sans extension de fichier\n" msgid "{lic_path}: unused license\n" msgstr "{lic_path} : licence inutilisée\n" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' est couvert par {global_path}" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, fuzzy, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." @@ -710,7 +740,7 @@ msgstr "" "'{path}' est couvert en exclusivité par REUSE.toml. Contenu du fichier non " "lu." -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, fuzzy, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -719,7 +749,7 @@ msgstr "" "'{path}' a été détecté comme étant un fichier binaire, les informations " "REUSE n'y sont pas recherchées." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 #, fuzzy msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " @@ -728,7 +758,7 @@ msgstr "" "'.reuse/dep5' est déprécié. L'utilisation de REUSE.toml est recommandée. " "Utilisez `reuse convert-dep5` pour convertir." -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, fuzzy, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -738,17 +768,17 @@ msgstr "" "pas guarder les deux fichiers en même temps, ils ne sont pas inter-" "compatibles." -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "résolution de l'identifiant de '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} n'a pas d'extension de fichier" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -761,13 +791,13 @@ msgstr "" "fournie à, soit qu'elle débute par 'LicenseRef-' " "et qu'elle contient une extension de fichier." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " @@ -776,17 +806,17 @@ msgstr "" "le projet '{}' n'est pas un dépôt VCS ou le logiciel VCS requis n'est pas " "installé" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -799,7 +829,7 @@ msgstr "" "identifiants personnalisés ne commencent pas par 'LicenseRef-'. FAQ à propos " "des licences personnalisées : https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -813,7 +843,7 @@ msgstr "" "leur nouvel identifiant recommandé peut être trouvé ici : " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 #, fuzzy msgid "" "Fix licenses without file extension: At least one license text file in the " @@ -824,7 +854,7 @@ msgstr "" "licence dans le dossier 'LICENSES' n'a pas l'extension de fichier '.txt'. " "Veuillez renommes ce(s) fichier(s)." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -839,7 +869,7 @@ msgstr "" "fichiers licence manquants. Pour les licences personnalisées (commençant par " "'LicenseRef-'), vous devez ajouter ces fichiers vous-même." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 #, fuzzy msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " @@ -855,7 +885,7 @@ msgstr "" "de licence inutiles si vous êtes sûr qu'aucun document n'est concerné par " "ces licences." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 #, fuzzy msgid "" "Fix read errors: At least one of the files in your directory cannot be read " @@ -866,7 +896,7 @@ msgstr "" "peut pas être lu par l'outil. Vérifiez ces permissions. Vous trouverez les " "fichiers concernés en tête de la sortie, avec les messages d'erreur." -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/gl.po b/po/gl.po index 5f10df658..562994171 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for more information, and " @@ -200,18 +200,18 @@ msgstr "" " para máis información e para a documentación en liña." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versión de reuse é compatible coa versión {} da especificación REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Apoie o traballo da FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -221,44 +221,44 @@ msgstr "" "traballando polo software libre onde sexa necesario. Considere facer unha " "doazón a ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "habilitar sentencias de depuración" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "non empregue multiprocesamento" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "definir a raíz do proxecto" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "mostrar o número de versión do programa e saír" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "engadir copyright e licenza na cabeceira dos arquivos" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -269,21 +269,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "listar todos os arquivos que non cumplen os criterios" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -294,12 +294,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Verificar que a carpeta do proxecto cumple coa versión {reuse_version} da " @@ -318,35 +325,58 @@ msgstr "" "\n" "- Todos os arquivos teñen información correcta de copyright e licenza?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "imprimir a lista de materiales do proxecto en formato SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiales do proxecto en formato SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -354,39 +384,39 @@ msgstr "" "'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " "arquivo" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' non é un arquivo" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' non é un directorio" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "non se pode abrir '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "non se pode escribir no directorio '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "non se pode ler ou escribir en '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non é unha expresión SPDX válida, cancelando" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non é un Identificador de Licenza SPDX válido." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -448,30 +478,30 @@ msgstr "requirense os seguintes argumentos: licenza" msgid "cannot use --output with more than one license" msgstr "non se pode usar --output con máis dunha licenza" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -658,48 +688,48 @@ msgstr "Licenzas sen extensión de arquivo:" msgid "{lic_path}: unused license\n" msgstr "Licenzas non usadas:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' cuberto por .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "resolvendo o identificador de '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ten extensión de arquivo" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -712,7 +742,7 @@ msgstr "" " ou que comeza con 'LicenseRef-' e ten unha " "extensión de arquivo." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -720,23 +750,23 @@ msgstr "" "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " "{other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -744,7 +774,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -753,14 +783,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -769,7 +799,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -778,14 +808,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/it.po b/po/it.po index 165113bd4..470e513e4 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for more information, and " @@ -201,7 +201,7 @@ msgstr "" " per maggiori informazioni, e per accedere alla documentazione in linea." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -209,11 +209,11 @@ msgstr "" "Questa versione di reuse è compatibile con la versione {} della Specifica " "REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Sostieni il lavoro della FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -224,46 +224,46 @@ msgstr "" "necessario. Prendi in considerazione di fare una donazione su ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "abilita le istruzioni di debug" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "non utilizzare il multiprocessing" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "impostare la directory principale del progetto" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "mostra la versione del programma ed esce" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "sottocomandi" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" "aggiunge le informazioni sul copyright e sulla licenza nell'intestazione dei " "file" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -274,21 +274,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "lista dei file non conformi" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -299,12 +299,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Controlla che la directory del progetto sia conforme con la versione " @@ -324,35 +331,58 @@ msgstr "" "\n" "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -360,39 +390,39 @@ msgstr "" "'{path}' contiene un'espressione SPDX che non può essere parsificata, il " "file viene saltato" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' non è un file" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' non è una directory" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "non è possibile aprire '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "non è possibile scrivere nella directory '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "non è possibile leggere o scrivere '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non è una espressione valida SPDX, interruzione" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non è un valido Identificativo di Licenza SPDX." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -454,30 +484,30 @@ msgstr "sono richiesti i seguenti parametri: license" msgid "cannot use --output with more than one license" msgstr "non puoi usare --output con più di una licenza" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -664,48 +694,48 @@ msgstr "Licenze senza estensione del file:" msgid "{lic_path}: unused license\n" msgstr "Licenze non utilizzate:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' verificato da .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinazione dell'identificativo di '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ha l'estensione del file" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -718,7 +748,7 @@ msgstr "" "licenze elencate su o che inizi con " "'LicenseRef-', e che abbia un'estensione del file." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -726,23 +756,23 @@ msgstr "" "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " "{other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -750,7 +780,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -759,14 +789,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -775,7 +805,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -784,14 +814,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/nl.po b/po/nl.po index 03d58a769..baf064f71 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for more information, and " @@ -202,18 +202,18 @@ msgstr "" " voor meer informatie en voor de online documentatie." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Deze versie van reuse is compatibel met versie {} van de REUSE Specificatie." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Ondersteun het werk van de FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -223,45 +223,45 @@ msgstr "" "verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " "donatie te maken bij ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "zet debug statements aan" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "gebruik geen multiprocessing" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "bepaal de root van het project" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "versienummer van het programma laten zien en verlaten" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "subcommando's" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" "voeg auteursrechts- en licentie-informatie toe aan de headers van bestanden" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -272,21 +272,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "lijst maken van alle bestanden die tekortschieten" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -297,12 +297,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Voer een statische controle op de naleving van versie {reuse_version} van de " @@ -322,35 +329,58 @@ msgstr "" "\n" "- Bevatten alle bestanden geldige informatie over auteursricht en licenties?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "print de materiaallijst van het project in SPDX-formaat" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "print de materiaallijst van het project in SPDX-formaat" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -358,39 +388,39 @@ msgstr "" "'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " "bestand over" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' is geen bestand" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' is geen map" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "kan '{}' niet openen" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "kan niet schrijven naar map '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "kan '{}' niet lezen of schrijven" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' is geen geldige SPDX Licentie Identificatie." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -453,30 +483,30 @@ msgstr "de volgende argumenten zijn verplicht: licentie" msgid "cannot use --output with more than one license" msgstr "kan --output niet met meer dan een licentie gebruiken" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -661,49 +691,49 @@ msgstr "Licenties zonder bestandsextensie:" msgid "{lic_path}: unused license\n" msgstr "Ongebruikte licenties:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' valt onder .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "identificatie van '{path}' bepalen" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} heeft geen bestandsextensie" # Niet helemaal duidelijk hoe resolving hier wordt bedoeld. -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -716,7 +746,7 @@ msgstr "" "die gevonden kan worden op of dat deze begint " "met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -724,23 +754,23 @@ msgstr "" "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " "{other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -748,7 +778,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -757,14 +787,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -773,7 +803,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -782,14 +812,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/pt.po b/po/pt.po index 025afc91d..bf8fb7c70 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese for more information, and " @@ -200,18 +200,18 @@ msgstr "" " para mais informação e para documentação em linha." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versão do reuse é compatível com a versão {} da especificação REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Apoiar o trabalho da FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -221,44 +221,44 @@ msgstr "" "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " "Considere fazer um donativo em ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "activar expressões de depuração" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "não usar multi-processamento" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "definir a raíz do projecto" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "mostrar o número de versão do programa e sair" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "sub-comandos" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -269,21 +269,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "listar todos os ficheiros não conformes" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -294,12 +294,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Analisar (lint) a pasta do projecto para verificar a conformidade com a " @@ -320,35 +327,58 @@ msgstr "" "- Todos os ficheiros têm informação válida de direitos de autor e de " "licenciamento?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "imprimir a lista de materiais do projecto em formato SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiais do projecto em formato SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -356,39 +386,39 @@ msgstr "" "'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " "ficheiro ignorado" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' não é um ficheiro" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' não é uma pasta" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "não é possível abrir '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "não é possível escrever no directório '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "não é possível ler ou escrever em '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' não é uma expressão SPDX válida; a abortar" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' não é um Identificador de Licença SPDX válido." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -450,30 +480,30 @@ msgstr "são requeridos os seguintes argumentos: licença" msgid "cannot use --output with more than one license" msgstr "não se pode usar --output com mais do que uma licença" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -661,48 +691,48 @@ msgstr "Licenças sem extensão de ficheiro:" msgid "{lic_path}: unused license\n" msgstr "Licenças não usadas:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' abrangido por .reuse/dep5" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "a determinar o identificador de '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} não tem extensão de ficheiro" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -715,30 +745,30 @@ msgstr "" "publicada em ou que começa por 'LicenseRef-' e " "tem uma extensão de ficheiro." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -746,7 +776,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -755,14 +785,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -771,7 +801,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -780,14 +810,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/reuse.pot b/po/reuse.pot index 4e7ef2568..6a9be1c81 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -90,7 +90,7 @@ msgstr "" msgid "template {template} could not be found" msgstr "" -#: src/reuse/_annotate.py:341 src/reuse/_util.py:581 +#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 msgid "can't write to '{}'" msgstr "" @@ -190,67 +190,67 @@ msgstr "" msgid "'{file}' is not inside of '{root}'" msgstr "" -#: src/reuse/_main.py:41 +#: src/reuse/_main.py:48 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " "making a donation at ." msgstr "" -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -261,19 +261,19 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 msgid "Download a license and place it in the LICENSES/ directory." msgstr "" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "" -#: src/reuse/_main.py:156 +#: src/reuse/_main.py:166 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -285,82 +285,111 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -419,30 +448,30 @@ msgstr "" msgid "cannot use --output with more than one license" msgstr "" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -620,48 +649,48 @@ msgstr "" msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -670,29 +699,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -700,7 +729,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -709,14 +738,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -725,7 +754,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -734,14 +763,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/ru.po b/po/ru.po index 9e01a65f3..a3aee112b 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian for more information, and " @@ -205,7 +205,7 @@ msgstr "" "информацию см. на сайте , а онлайн-документацию - " "на сайте ." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -213,11 +213,11 @@ msgstr "" "Эта версия повторного использования совместима с версией {} спецификации " "REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Поддержите работу ФСПО:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -228,44 +228,44 @@ msgstr "" "обеспечения везде, где это необходимо. Пожалуйста, рассмотрите возможность " "сделать пожертвование по адресу ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "включить отладочные операторы" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "скрыть предупреждения об устаревании" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "не пропускайте подмодули Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "не пропускайте мезонные подпроекты" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "не используйте многопроцессорную обработку" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "определить корень проекта" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "показать номер версии программы и выйти" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "подкоманды" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" "добавьте в заголовок файлов информацию об авторских правах и лицензировании" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -285,20 +285,20 @@ msgstr "" "которые внесли свой вклад, но не являются владельцами авторских прав на " "данные файлы." -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "список всех файлов, не соответствующих требованиям" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -309,12 +309,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Проверьте каталог проекта на соответствие версии {reuse_version} " @@ -335,23 +342,46 @@ msgstr "" "- Все ли файлы содержат достоверную информацию об авторских правах и " "лицензировании?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "распечатать ведомость материалов проекта в формате SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "распечатать ведомость материалов проекта в формате SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "список всех поддерживаемых лицензий SPDX" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "Преобразование .reuse/dep5 в REUSE.toml" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -360,12 +390,12 @@ msgstr "" "'{path}' не может быть разобран. Мы получили следующее сообщение об ошибке: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не удалось разобрать '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -373,39 +403,39 @@ msgstr "" "'{path}' содержит выражение SPDX, которое не может быть разобрано, что " "приводит к пропуску файла" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' не является файлом" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' не является каталогом" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "Невозможно открыть '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "Невозможно записать в каталог '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "Невозможно прочитать или записать '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' не является правильным выражением SPDX, прерывается" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не является действительным идентификатором лицензии SPDX." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Вы имели в виду:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -468,7 +498,7 @@ msgstr "необходимы следующие аргументы: лиценз msgid "cannot use --output with more than one license" msgstr "Невозможно использовать --output с более чем одной лицензией" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -476,7 +506,7 @@ msgstr "" "{attr_name} должно быть {type_name} (получено {value}, которое является " "{value_class})." -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -485,18 +515,18 @@ msgstr "" "Элемент в коллекции {attr_name} должен быть {type_name} (получил " "{item_value}, который является {item_class})." -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не должно быть пустым." -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} должно быть {type} (получено {value}, которое является {value_type})." -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -681,19 +711,19 @@ msgstr "{lic_path}: лицензия без расширения файла\n" msgid "{lic_path}: unused license\n" msgstr "{lic_path}: неиспользуемая лицензия\n" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' покрыт {global_path}" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" "'{path}' покрывается исключительно REUSE.toml. Не читать содержимое файла." -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -702,7 +732,7 @@ msgstr "" "'{path}' был обнаружен как двоичный файл; поиск информации о REUSE в его " "содержимом не производится." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -710,7 +740,7 @@ msgstr "" "'.reuse/dep5' является устаревшим. Вместо него рекомендуется использовать " "REUSE.toml. Для преобразования используйте `reuse convert-dep5`." -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -719,17 +749,17 @@ msgstr "" "Найдены оба файла '{new_path}' и '{old_path}'. Вы не можете хранить оба " "файла одновременно; они несовместимы." -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "определяющий идентификатор '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "У {path} нет расширения файла" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -742,14 +772,14 @@ msgstr "" " или что она начинается с 'LicenseRef-' и имеет " "расширение файла." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -757,17 +787,17 @@ msgstr "" "Проект '{}' не является репозиторием VCS или в нем не установлено " "необходимое программное обеспечение VCS" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не удалось прочитать '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "При разборе '{path}' произошла непредвиденная ошибка" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -781,7 +811,7 @@ msgstr "" "задаваемые вопросы о пользовательских лицензиях: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -794,7 +824,7 @@ msgstr "" "reuse/dep5', была устаревшей в SPDX. Текущий список и рекомендуемые новые " "идентификаторы можно найти здесь: " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -804,7 +834,7 @@ msgstr "" "лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. Пожалуйста, " "переименуйте файл(ы) соответствующим образом." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -820,7 +850,7 @@ msgstr "" "лицензий (начинающихся с 'LicenseRef-') вам нужно добавить эти файлы " "самостоятельно." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -835,7 +865,7 @@ msgstr "" "неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " "фрагмент кода не лицензируется как таковой." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -846,7 +876,7 @@ msgstr "" "Затронутые файлы вы найдете в верхней части вывода в виде сообщений об " "ошибках." -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/sv.po b/po/sv.po index f477df804..0d7cd8cdc 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-09-19 13:40+0000\n" "Last-Translator: Simon \n" "Language-Team: Swedish for more information, and " @@ -190,7 +190,7 @@ msgstr "" "reuse.software/> för mer information och för " "den web-baserade dokumentationen." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -198,11 +198,11 @@ msgstr "" "Den här versionen av reuse är kompatibel med version {} av REUSE-" "specifikationen." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Stötta FSFE's arbete:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -212,43 +212,43 @@ msgstr "" "möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. Vänligen " "överväg att göra en donation till ." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "hoppa inte över undermoduler för Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "hoppa inte över underprojekt för Meson" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "definiera roten av projektet" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "visa programmets versionsnummer och avsluta" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -259,20 +259,20 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "lista alla filer som inte uppfyller kraven" -#: src/reuse/_main.py:156 +#: src/reuse/_main.py:166 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -284,32 +284,61 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "lista alla SPDX-licenser som stöds" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, fuzzy, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -317,50 +346,50 @@ msgid "" msgstr "" "'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kunde inte tolka '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' är inte en fil" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' är inte en katalog" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "kan inte öppna '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "kan inte skriva till katalogen '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "kan inte läsa eller skriva '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' är inte ett giltigt SPDX-uttryck, avbryter" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Menade du:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -421,30 +450,30 @@ msgstr "följande argument behövs: licens" msgid "cannot use --output with more than one license" msgstr "kan inte använda --output med mer än en licens" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -622,48 +651,48 @@ msgstr "" msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -672,29 +701,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -702,7 +731,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -711,14 +740,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -727,7 +756,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -736,14 +765,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/tr.po b/po/tr.po index f55b5e5b1..6e951d365 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for more information, and " @@ -202,17 +202,17 @@ msgstr "" " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "FSFE'nin çalışmalarını destekleyin:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -222,43 +222,43 @@ msgstr "" "Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "hata ayıklama cümlelerini etkinleştirir" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "kullanımdan kaldırma uyarılarını gizle" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "Git alt modüllerini atlamaz" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "Meson alt projelerini atlamaz" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "çoklu işlem kullanmaz" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "projenin kökünü tanımlar" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "programın sürüm numarasını gösterip çıkar" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "alt komutlar" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -269,21 +269,21 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 #, fuzzy msgid "Download a license and place it in the LICENSES/ directory." msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "bütün uyumsuz dosyaları listeler" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -294,12 +294,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Proje dizinini REUSE Belirtimi {reuse_version} sürümüyle uyumu için inceler. " @@ -317,73 +324,96 @@ msgstr "" "\n" "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "tüm desteklenen SPDK lisanslarını listeler" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "'{path}' çözümlenemeyen bir SPDX ifadesine sahip, dosya atlanıyor" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' bir dosya değil" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' bir dizin değil" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "'{}' açılamıyor" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "'{}' dizinine yazılamıyor" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "'{}' okunamıyor veya yazılamıyor" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Şunu mu kastettiniz:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -445,30 +475,30 @@ msgstr "şu değişkenler gerekiyor: license" msgid "cannot use --output with more than one license" msgstr "--output birden fazla lisansla birlikte kullanılamıyor" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -650,48 +680,48 @@ msgstr "Dosya uzantısı olmayan lisanslar:" msgid "{lic_path}: unused license\n" msgstr "Kullanılmayan lisanslar:" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, fuzzy, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' .reuse/dep5 ile kapsanıyor" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "" -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " "simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "'{path}' kimliği belirleniyor" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} dosya uzantısına sahip değil" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -704,31 +734,31 @@ msgstr "" "veya 'LicenseRef-' ile başladığından ve bir dosya uzantısına sahip " "olduğundan emin olun." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} hem {path} hem de {other_path} için SPDX Lisans Kimliğidir" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -736,7 +766,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -745,14 +775,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -761,7 +791,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -770,14 +800,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " diff --git a/po/uk.po b/po/uk.po index 101cd5716..ae0340865 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-26 09:32+0000\n" +"POT-Creation-Date: 2024-09-30 13:59+0000\n" "PO-Revision-Date: 2024-09-11 19:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian for more information, and " @@ -201,17 +201,17 @@ msgstr "" "software/> для отримання додаткових відомостей і перегляду онлайн-документації." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:54 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." -#: src/reuse/_main.py:50 +#: src/reuse/_main.py:57 msgid "Support the FSFE's work:" msgstr "Підтримати роботу FSFE:" -#: src/reuse/_main.py:54 +#: src/reuse/_main.py:61 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -222,43 +222,43 @@ msgstr "" "де це необхідно. Будь ласка, розгляньте можливість підтримати нас на " "." -#: src/reuse/_main.py:77 +#: src/reuse/_main.py:84 msgid "enable debug statements" msgstr "увімкнути інструкції налагодження" -#: src/reuse/_main.py:82 +#: src/reuse/_main.py:89 msgid "hide deprecation warnings" msgstr "сховати попередження про застарілість" -#: src/reuse/_main.py:87 +#: src/reuse/_main.py:94 msgid "do not skip over Git submodules" msgstr "не пропускати підмодулі Git" -#: src/reuse/_main.py:92 +#: src/reuse/_main.py:99 msgid "do not skip over Meson subprojects" msgstr "не пропускати підпроєкти Meson" -#: src/reuse/_main.py:97 +#: src/reuse/_main.py:104 msgid "do not use multiprocessing" msgstr "не використовувати багатопроцесорність" -#: src/reuse/_main.py:104 +#: src/reuse/_main.py:111 msgid "define root of project" msgstr "визначити кореневий каталог проєкту" -#: src/reuse/_main.py:109 +#: src/reuse/_main.py:119 msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" -#: src/reuse/_main.py:113 +#: src/reuse/_main.py:123 msgid "subcommands" msgstr "підкоманди" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:130 msgid "add copyright and licensing into the header of files" msgstr "додати авторські права та ліцензії в заголовок файлів" -#: src/reuse/_main.py:123 +#: src/reuse/_main.py:133 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -277,20 +277,20 @@ msgstr "" " За допомогою --contributor ви можете вказати особу або організацію, яка " "зробила внесок, але не є власником авторських прав на дані файли." -#: src/reuse/_main.py:142 +#: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" -#: src/reuse/_main.py:144 +#: src/reuse/_main.py:154 msgid "Download a license and place it in the LICENSES/ directory." msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." -#: src/reuse/_main.py:153 +#: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "список усіх несумісних файлів" -#: src/reuse/_main.py:156 -#, python-brace-format +#: src/reuse/_main.py:166 +#, fuzzy, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -301,12 +301,19 @@ msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?\n" "\n" +"- Are there any deprecated licenses in the project?\n" +"\n" +"- Are there any license files in the LICENSES/ directory without file " +"extension?\n" +"\n" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?\n" "\n" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?\n" "\n" +"- Are there any read errors?\n" +"\n" "- Do all files have valid copyright and licensing information?" msgstr "" "Перевірте каталог проєкту на відповідність версії {reuse_version} " @@ -325,23 +332,46 @@ msgstr "" "\n" "- Чи всі файли мають дійсні відомості про авторські права та ліцензії?" -#: src/reuse/_main.py:183 +#: src/reuse/_main.py:202 +msgid "" +"Lint individual files. The specified files are checked for the presence of " +"copyright and licensing information, and whether the found licenses are " +"included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "список невідповідних файлів із вказаного списку файлів" -#: src/reuse/_main.py:191 +#: src/reuse/_main.py:217 +#, fuzzy +msgid "Generate an SPDX bill of materials in RDF format." +msgstr "друкувати опис матеріалів проєкту у форматі SPDX" + +#: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" msgstr "друкувати опис матеріалів проєкту у форматі SPDX" -#: src/reuse/_main.py:199 +#: src/reuse/_main.py:228 +msgid "List all non-deprecated SPDX licenses from the official list." +msgstr "" + +#: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" msgstr "список всіх підтримуваних ліцензій SPDX" -#: src/reuse/_main.py:208 +#: src/reuse/_main.py:241 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +"generated file is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" + +#: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" msgstr "конвертувати .reuse/dep5 у REUSE.toml" -#: src/reuse/_main.py:273 +#: src/reuse/_main.py:311 #, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " @@ -350,51 +380,51 @@ msgstr "" "'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " "{message}" -#: src/reuse/_util.py:376 src/reuse/global_licensing.py:228 +#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" -#: src/reuse/_util.py:432 +#: src/reuse/_util.py:418 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" -#: src/reuse/_util.py:564 +#: src/reuse/_util.py:550 msgid "'{}' is not a file" msgstr "'{}' не є файлом" -#: src/reuse/_util.py:567 +#: src/reuse/_util.py:553 msgid "'{}' is not a directory" msgstr "'{}' не є каталогом" -#: src/reuse/_util.py:570 +#: src/reuse/_util.py:556 msgid "can't open '{}'" msgstr "не вдалося відкрити '{}'" -#: src/reuse/_util.py:575 +#: src/reuse/_util.py:561 msgid "can't write to directory '{}'" msgstr "неможливо записати в каталог '{}'" -#: src/reuse/_util.py:594 +#: src/reuse/_util.py:580 msgid "can't read or write '{}'" msgstr "неможливо прочитати чи записати '{}'" -#: src/reuse/_util.py:604 +#: src/reuse/_util.py:590 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' не є дійсним виразом SPDX, переривання" -#: src/reuse/_util.py:632 +#: src/reuse/_util.py:618 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." -#: src/reuse/_util.py:639 +#: src/reuse/_util.py:625 msgid "Did you mean:" msgstr "Ви мали на увазі:" -#: src/reuse/_util.py:646 +#: src/reuse/_util.py:632 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -457,14 +487,14 @@ msgstr "необхідні такі аргументи: license" msgid "cannot use --output with more than one license" msgstr "не можна використовувати --output з кількома ліцензіями" -#: src/reuse/global_licensing.py:115 +#: src/reuse/global_licensing.py:119 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/global_licensing.py:129 +#: src/reuse/global_licensing.py:133 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -473,17 +503,17 @@ msgstr "" "Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " "що є {item_class})." -#: src/reuse/global_licensing.py:141 +#: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не повинне бути порожнім." -#: src/reuse/global_licensing.py:165 +#: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." -#: src/reuse/global_licensing.py:189 +#: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -665,18 +695,18 @@ msgstr "{lic_path}: ліцензія без розширення файлу\n" msgid "{lic_path}: unused license\n" msgstr "{lic_path}: невикористана ліцензія\n" -#: src/reuse/project.py:269 +#: src/reuse/project.py:260 #, python-brace-format msgid "'{path}' covered by {global_path}" msgstr "'{path}' покрито за рахунок {global_path}" -#: src/reuse/project.py:277 +#: src/reuse/project.py:268 #, python-brace-format msgid "" "'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." msgstr "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." -#: src/reuse/project.py:284 +#: src/reuse/project.py:275 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -685,7 +715,7 @@ msgstr "" "'{path}' виявлено як двійковий файл або його розширення позначено таким, що " "не коментується; пошук інформації у його вмісті для REUSE не виконується." -#: src/reuse/project.py:345 +#: src/reuse/project.py:336 msgid "" "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " "Use `reuse convert-dep5` to convert." @@ -693,7 +723,7 @@ msgstr "" "'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " "REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." -#: src/reuse/project.py:366 +#: src/reuse/project.py:357 #, python-brace-format msgid "" "Found both '{new_path}' and '{old_path}'. You cannot keep both files " @@ -702,17 +732,17 @@ msgstr "" "Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати обидва " "файли одночасно, вони несумісні." -#: src/reuse/project.py:425 +#: src/reuse/project.py:416 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "визначення ідентифікатора '{path}'" -#: src/reuse/project.py:433 +#: src/reuse/project.py:424 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} не має розширення файлу" -#: src/reuse/project.py:443 +#: src/reuse/project.py:434 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -725,14 +755,14 @@ msgstr "" "spdx.org/licenses/> або що вона починається з 'LicenseRef-' і має розширення " "файлу." -#: src/reuse/project.py:455 +#: src/reuse/project.py:446 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" -#: src/reuse/project.py:494 +#: src/reuse/project.py:485 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -740,17 +770,17 @@ msgstr "" "проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS не " "встановлено" -#: src/reuse/report.py:152 +#: src/reuse/report.py:149 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не вдалося прочитати '{path}'" -#: src/reuse/report.py:157 +#: src/reuse/report.py:154 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Під час аналізу '{path}' сталася неочікувана помилка" -#: src/reuse/report.py:510 +#: src/reuse/report.py:507 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -763,7 +793,7 @@ msgstr "" "Часті запитання про користувацькі ліцензії: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:521 +#: src/reuse/report.py:518 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -776,7 +806,7 @@ msgstr "" "застаріла для SPDX. Поточний список і відповідні рекомендовані нові " "ідентифікатори можна знайти тут: " -#: src/reuse/report.py:532 +#: src/reuse/report.py:529 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -786,7 +816,7 @@ msgstr "" "ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " "файл(и) відповідно." -#: src/reuse/report.py:541 +#: src/reuse/report.py:538 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -801,7 +831,7 @@ msgstr "" "будь-які відсутні ідентифікатори. Для користувацьких ліцензій (починаючи з " "'LicenseRef-') вам потрібно додати ці файли самостійно." -#: src/reuse/report.py:553 +#: src/reuse/report.py:550 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -815,7 +845,7 @@ msgstr "" "відповідні ліцензовані файли, або видаліть невикористаний текст ліцензії, " "якщо ви впевнені, що жоден файл або фрагмент коду не ліцензований як такий." -#: src/reuse/report.py:564 +#: src/reuse/report.py:561 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -826,7 +856,7 @@ msgstr "" "відповідні файли у верхній частині виводу як частину зареєстрованих " "повідомлень про помилки." -#: src/reuse/report.py:573 +#: src/reuse/report.py:570 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " From e453cd01034be7b8e3fef6025c0e253eb2ade790 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 30 Sep 2024 16:00:50 +0200 Subject: [PATCH 065/156] Add click dependency Signed-off-by: Carmen Bianca BAKKER --- poetry.lock | 6 +++--- pyproject.toml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index baa868b63..426361d3f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -317,7 +317,7 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -332,7 +332,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -1856,4 +1856,4 @@ completion = ["shtab"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "de64d8500ffb6b578394daaa489960517c59cdb9836c53102ac6510fd279280c" +content-hash = "a677761c8f89befc5942129ceb8ed4a1b3352834858fd88ee96bfb08e1da074c" diff --git a/pyproject.toml b/pyproject.toml index 420c0a0ab..70a329d7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,7 @@ python-debian = ">=0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" # Python 3.10. tomlkit = ">=0.8" attrs = ">=21.3" +click = ">=8.0" shtab = { version = ">=1.4.0", optional = true } [tool.poetry.extras] From e57bc3e1573235a2993490cd706420fc9e664295 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 8 Oct 2024 16:40:42 +0000 Subject: [PATCH 066/156] Translated using Weblate (Spanish) Currently translated at 82.7% (153 of 185 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/po/es.po b/po/es.po index b0127e175..b6a49e8c6 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-30 13:59+0000\n" -"PO-Revision-Date: 2024-05-09 08:19+0000\n" +"PO-Revision-Date: 2024-10-09 17:15+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.4-rc\n" +"X-Generator: Weblate 5.8-dev\n" #: src/reuse/_annotate.py:74 #, python-brace-format @@ -89,13 +89,13 @@ msgid "can't write to '{}'" msgstr "no se puede escribir en '{}'" #: src/reuse/_annotate.py:366 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" msgstr "" -"Los siguientes archivos no tienen una extensión reconocida. Utiliza --style, " -"--force-dot-license o --skip-unrecognised:" +"Los siguientes archivos no tienen una extensión de archivo reconocida. Por " +"favor use --style, -force-dot-license, -fallback-dot-license o -skip-" +"unrecognized:" #: src/reuse/_annotate.py:382 msgid "copyright statement, repeatable" @@ -118,9 +118,8 @@ msgid "comment style to use, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/_annotate.py:417 -#, fuzzy msgid "copyright prefix to use, optional" -msgstr "estilo del copyright a utilizar, opcional" +msgstr "prefijo de copyright para usar, opcional" #: src/reuse/_annotate.py:430 msgid "name of template to use, optional" @@ -155,15 +154,16 @@ msgid "do not replace the first header in the file; just add a new one" msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" #: src/reuse/_annotate.py:473 -#, fuzzy msgid "always write a .license file instead of a header inside the file" msgstr "" -"escribir un archivo .license en lugar de una cabecera dentro del archivo" +"escribir siempre un archivo .license en lugar de una cabecera dentro del " +"archivo" #: src/reuse/_annotate.py:480 -#, fuzzy msgid "write a .license file to files with unrecognised comment styles" -msgstr "omitir los archivos con estilos de comentario no reconocidos" +msgstr "" +"escribir un archivo .license en archivos con estilos de comentario no " +"reconocidos" #: src/reuse/_annotate.py:486 msgid "skip files with unrecognised comment styles" @@ -185,18 +185,17 @@ msgid "prevents output" msgstr "impide la producción" #: src/reuse/_lint_file.py:31 -#, fuzzy msgid "formats output as errors per line (default)" -msgstr "formatea la salida como un texto plano" +msgstr "Formatea la salida como errores por línea (por defecto)" #: src/reuse/_lint_file.py:38 msgid "files to lint" -msgstr "" +msgstr "archivos para limpiar" #: src/reuse/_lint_file.py:48 #, python-brace-format msgid "'{file}' is not inside of '{root}'" -msgstr "" +msgstr "'{file}' no está dentro de '{root}'" #: src/reuse/_main.py:48 msgid "" From 7e81abbb8de1d031258d4e945d4cc28c070714f7 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 30 Sep 2024 17:24:10 +0200 Subject: [PATCH 067/156] Create scaffolding for using click CLI Signed-off-by: Carmen Bianca BAKKER --- docs/conf.py | 2 +- pyproject.toml | 1 + src/reuse/cli/__init__.py | 5 ++ src/reuse/cli/common.py | 59 +++++++++++++ src/reuse/cli/main.py | 173 ++++++++++++++++++++++++++++++++++++++ src/reuse/i18n.py | 28 ++++++ tests/test_cli_main.py | 30 +++++++ 7 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/__init__.py create mode 100644 src/reuse/cli/common.py create mode 100644 src/reuse/cli/main.py create mode 100644 src/reuse/i18n.py create mode 100644 tests/test_cli_main.py diff --git a/docs/conf.py b/docs/conf.py index 18bcd02cf..d7c79c716 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -62,7 +62,7 @@ apidoc_module_dir = str(ROOT_DIR / "src/reuse") # apidoc_output_dir = "api" -# apidoc_excluded_paths = [] +apidoc_excluded_paths = ["cli"] apidoc_separate_modules = True apidoc_toc_file = False apidoc_extra_args = ["--maxdepth", "2"] diff --git a/pyproject.toml b/pyproject.toml index 70a329d7b..bd9292f50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,6 +100,7 @@ python-lsp-black = "*" [tool.poetry.scripts] reuse = 'reuse._main:main' +reuse2 = "reuse.cli.main:main" [tool.poetry.build] generate-setup-file = false diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py new file mode 100644 index 000000000..7b749098e --- /dev/null +++ b/src/reuse/cli/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from . import main diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py new file mode 100644 index 000000000..dd0a776ed --- /dev/null +++ b/src/reuse/cli/common.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Utilities that are common to multiple CLI commands.""" + +from dataclasses import dataclass +from typing import Any, Mapping, Optional + +import click + +from ..i18n import _ +from ..project import Project + + +@dataclass(frozen=True) +class ClickObj: + """A dataclass holding necessary context and options.""" + + no_multiprocessing: bool + project: Optional[Project] + + +class MutexOption(click.Option): + """Enable declaring mutually exclusive options.""" + + def __init__(self, *args: Any, **kwargs: Any): + self.mutually_exclusive: set[str] = set( + kwargs.pop("mutually_exclusive", []) + ) + super().__init__(*args, **kwargs) + # If self is in mutex, remove it. + self.mutually_exclusive -= {self.name} + + @staticmethod + def _get_long_name(ctx: click.Context, name: str) -> str: + """Given the option name, get the long name of the option. + + For example, 'output' return '--output'. + """ + param = next( + (param for param in ctx.command.params if param.name == name) + ) + return param.opts[0] + + def handle_parse_result( + self, ctx: click.Context, opts: Mapping[str, Any], args: list[str] + ) -> tuple[Any, list[str]]: + if self.mutually_exclusive.intersection(opts) and self.name in opts: + raise click.UsageError( + _("'{name}' is mutually exclusive with: {opts}").format( + name=self._get_long_name(ctx, str(self.name)), + opts=", ".join( + f"'{self._get_long_name(ctx, opt)}'" + for opt in self.mutually_exclusive + ), + ) + ) + return super().handle_parse_result(ctx, opts, args) diff --git a/src/reuse/cli/main.py b/src/reuse/cli/main.py new file mode 100644 index 000000000..aebe161bc --- /dev/null +++ b/src/reuse/cli/main.py @@ -0,0 +1,173 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Emil Velikov +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Entry function for reuse.""" + +import gettext +import logging +import os +import warnings +from pathlib import Path +from typing import Optional + +import click +from click.formatting import wrap_text + +from .. import __REUSE_version__ +from .._util import setup_logging +from ..global_licensing import GlobalLicensingParseError +from ..i18n import _ +from ..project import GlobalLicensingConflict, Project +from ..vcs import find_root +from .common import ClickObj + +_PACKAGE_PATH = os.path.dirname(__file__) +_LOCALE_DIR = os.path.join(_PACKAGE_PATH, "locale") +if gettext.find("reuse", localedir=_LOCALE_DIR): + gettext.bindtextdomain("reuse", _LOCALE_DIR) + # This is needed to make Click recognise our translations. Our own + # translations use the class-based API. + gettext.textdomain("reuse") + + +_VERSION_TEXT = ( + _("%(prog)s, version %(version)s") + + "\n\n" + + _( + "This program is free software: you can redistribute it and/or modify" + " it under the terms of the GNU General Public License as published by" + " the Free Software Foundation, either version 3 of the License, or" + " (at your option) any later version." + ) + + _( + "This program is distributed in the hope that it will be useful," + " but WITHOUT ANY WARRANTY; without even the implied warranty of" + " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" + " GNU General Public License for more details." + ) + + "\n\n" + + _( + "You should have received a copy of the GNU General Public License" + " along with this program. If not, see" + " ." + ) +) + +_HELP = ( + _( + "reuse is a tool for compliance with the REUSE" + " recommendations. See for more" + " information, and for the online" + " documentation." + ) + + "\n\n" + + _( + "This version of reuse is compatible with version {} of the REUSE" + " Specification." + ).format(__REUSE_version__) + + "\n\n" + + _("Support the FSFE's work:") + + "\n\n" + # FIXME: Indent this. + + _( + "Donations are critical to our strength and autonomy. They enable us" + " to continue working for Free Software wherever necessary. Please" + " consider making a donation at ." + ) +) + + +@click.group(name="reuse", help=_HELP) +@click.option( + "--debug", + is_flag=True, + help=_("Enable debug statements."), +) +@click.option( + "--suppress-deprecation", + is_flag=True, + help=_("Hide deprecation warnings."), +) +@click.option( + "--include-submodules", + is_flag=True, + help=_("Do not skip over Git submodules."), +) +@click.option( + "--include-meson-subprojects", + is_flag=True, + help=_("Do not skip over Meson subprojects."), +) +@click.option( + "--no-multiprocessing", + is_flag=True, + help=_("Do not use multiprocessing."), +) +@click.option( + "--root", + type=click.Path( + exists=True, + file_okay=False, + path_type=Path, + ), + default=None, + help=_("Define root of project."), +) +@click.version_option( + package_name="reuse", + message=wrap_text(_VERSION_TEXT, preserve_paragraphs=True), +) +@click.pass_context +def main( + ctx: click.Context, + debug: bool, + suppress_deprecation: bool, + include_submodules: bool, + include_meson_subprojects: bool, + no_multiprocessing: bool, + root: Optional[Path], +) -> None: + setup_logging(level=logging.DEBUG if debug else logging.WARNING) + + # Very stupid workaround to not print a DEP5 deprecation warning in the + # middle of ccompileonversion to REUSE.toml. + if ctx.invoked_subcommand == "convert-dep5": + os.environ["_SUPPRESS_DEP5_WARNING"] = "1" + + if not suppress_deprecation: + warnings.filterwarnings("default", module="reuse") + + # FIXME: Not needed for all subcommands. + if root is None: + root = find_root() + if root is None: + root = Path.cwd() + + # FIXME: Not needed for all subcommands. + try: + project = Project.from_directory(root) + # FileNotFoundError and NotADirectoryError don't need to be caught because + # argparse already made sure of these things. + except GlobalLicensingParseError as error: + raise click.UsageError( + _( + "'{path}' could not be parsed. We received the following error" + " message: {message}" + ).format(path=error.source, message=str(error)) + ) from error + + except (GlobalLicensingConflict, OSError) as error: + raise click.UsageError(str(error)) from error + project.include_submodules = include_submodules + project.include_meson_subprojects = include_meson_subprojects + + ctx.obj = ClickObj( + no_multiprocessing=no_multiprocessing, + project=project, + ) diff --git a/src/reuse/i18n.py b/src/reuse/i18n.py new file mode 100644 index 000000000..35ed3978f --- /dev/null +++ b/src/reuse/i18n.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""":mod:`gettext` plumbing of :mod:`reuse`.""" + +import gettext as _gettext_module +import os + +_PACKAGE_PATH = os.path.dirname(__file__) +_LOCALE_DIR = os.path.join(_PACKAGE_PATH, "locale") + +#: Translations object used throughout :mod:`reuse`. The translations +#: are sourced from ``reuse/locale//LC_MESSAGES/reuse.mo``. +TRANSLATIONS: _gettext_module.NullTranslations = _gettext_module.translation( + "reuse", localedir=_LOCALE_DIR, fallback=True +) +#: :meth:`gettext.NullTranslations.gettext` of :data:`TRANSLATIONS` +_ = TRANSLATIONS.gettext +#: :meth:`gettext.NullTranslations.gettext` of :data:`TRANSLATIONS` +gettext = TRANSLATIONS.gettext +#: :meth:`gettext.NullTranslations.ngettext` of :data:`TRANSLATIONS` +ngettext = TRANSLATIONS.ngettext +#: :meth:`gettext.NullTranslations.pgettext` of :data:`TRANSLATIONS` +pgettext = TRANSLATIONS.pgettext +#: :meth:`gettext.NullTranslations.npgettext` of :data:`TRANSLATIONS` +npgettext = TRANSLATIONS.npgettext diff --git a/tests/test_cli_main.py b/tests/test_cli_main.py new file mode 100644 index 000000000..641dd5e65 --- /dev/null +++ b/tests/test_cli_main.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for reuse.cli.main.""" + +from click.testing import CliRunner + +from reuse import __version__ +from reuse.cli.main import main + + +class TestMain: + """Collect all tests for main.""" + + def test_help_is_default(self): + """--help is optional.""" + without_help = CliRunner().invoke(main, []) + with_help = CliRunner().invoke(main, ["--help"]) + assert without_help.output == with_help.output + assert without_help.exit_code == with_help.exit_code == 0 + assert with_help.output.startswith("Usage: reuse") + + def test_version(self): + """--version returns the correct version.""" + result = CliRunner().invoke(main, ["--version"]) + assert result.output.startswith(f"reuse, version {__version__}\n") + assert "This program is free software:" in result.output + assert "GNU General Public License" in result.output From fefd2d40228ae0e3196a6223268daae7e243a483 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Mon, 30 Sep 2024 21:33:31 +0200 Subject: [PATCH 068/156] click: convert-dep5 Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/__init__.py | 2 +- src/reuse/cli/convert_dep5.py | 37 +++++++++++++++++++++++++++ tests/test_cli_convert_dep5.py | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/convert_dep5.py create mode 100644 tests/test_cli_convert_dep5.py diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index 7b749098e..e22d5525f 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import main +from . import convert_dep5, main diff --git a/src/reuse/cli/convert_dep5.py b/src/reuse/cli/convert_dep5.py new file mode 100644 index 000000000..99d4911a4 --- /dev/null +++ b/src/reuse/cli/convert_dep5.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for convert-dep5 subcommand.""" + +from typing import cast + +import click + +from ..convert_dep5 import toml_from_dep5 +from ..global_licensing import ReuseDep5 +from ..i18n import _ +from ..project import Project +from .common import ClickObj +from .main import main + +_HELP = _( + "Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed" + " in the project root and is semantically identical. The .reuse/dep5 file" + " is subsequently deleted." +) + + +@main.command(name="convert-dep5", help=_HELP) +@click.pass_obj +def convert_dep5(obj: ClickObj) -> None: + project = cast(Project, obj.project) + if not (project.root / ".reuse/dep5").exists(): + raise click.UsageError(_("no '.reuse/dep5' file")) + + text = toml_from_dep5( + cast(ReuseDep5, project.global_licensing).dep5_copyright + ) + (project.root / "REUSE.toml").write_text(text) + (project.root / ".reuse/dep5").unlink() diff --git a/tests/test_cli_convert_dep5.py b/tests/test_cli_convert_dep5.py new file mode 100644 index 000000000..5b8c32ba4 --- /dev/null +++ b/tests/test_cli_convert_dep5.py @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for convert-dep5.""" + +import warnings + +from click.testing import CliRunner + +from reuse._util import cleandoc_nl +from reuse.cli.main import main + + +class TestConvertDep5: + """Tests for convert-dep5.""" + + def test_simple(self, fake_repository_dep5): + """Convert a DEP5 repository to a REUSE.toml repository.""" + result = CliRunner().invoke(main, ["convert-dep5"]) + assert result.exit_code == 0 + assert not (fake_repository_dep5 / ".reuse/dep5").exists() + assert (fake_repository_dep5 / "REUSE.toml").exists() + assert (fake_repository_dep5 / "REUSE.toml").read_text() == cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "doc/**" + precedence = "aggregate" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + + def test_no_dep5_file(self, fake_repository): + """Cannot convert when there is no .reuse/dep5 file.""" + result = CliRunner().invoke(main, ["convert-dep5"]) + assert result.exit_code != 0 + + def test_no_warning(self, fake_repository_dep5): + """No PendingDeprecationWarning when running convert-dep5.""" + with warnings.catch_warnings(record=True) as caught_warnings: + result = CliRunner().invoke(main, ["convert-dep5"]) + assert result.exit_code == 0 + assert not caught_warnings From 35caac7b02e505a97bcad436579547f07b74fcd6 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 1 Oct 2024 08:44:45 +0200 Subject: [PATCH 069/156] click: spdx Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/__init__.py | 2 +- src/reuse/cli/spdx.py | 119 ++++++++++++++++++++++++++++++++++++++ tests/test_cli_spdx.py | 86 +++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/spdx.py create mode 100644 tests/test_cli_spdx.py diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index e22d5525f..d9ef0abd8 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import convert_dep5, main +from . import convert_dep5, main, spdx diff --git a/src/reuse/cli/spdx.py b/src/reuse/cli/spdx.py new file mode 100644 index 000000000..25a9a8e0f --- /dev/null +++ b/src/reuse/cli/spdx.py @@ -0,0 +1,119 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2022 Pietro Albini +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for spdx subcommand.""" + +import contextlib +import logging +from typing import Optional, cast +import sys + +import click + +from ..project import Project +from .. import _IGNORE_SPDX_PATTERNS +from ..report import ProjectReport +from ..i18n import _ +from .common import ClickObj +from .main import main + +_LOGGER = logging.getLogger(__name__) + +_HELP = _("Generate an SPDX bill of materials.") + + +@main.command(name="spdx", help=_HELP) +@click.option( + "--output", + "-o", + type=click.File("w", encoding="utf-8", lazy=True), + # Default is stdout. + default=None, + help=_("File to write to."), +) +@click.option( + "--add-license-concluded", + is_flag=True, + help=_( + "Populate the LicenseConcluded field; note that reuse cannot guarantee" + " that the field is accurate." + ), +) +@click.option( + "--add-licence-concluded", + "add_license_concluded", + hidden=True, +) +@click.option( + "--creator-person", + type=str, + help=_("Name of the person signing off on the SPDX report."), +) +@click.option( + "--creator-organization", + help=_("Name of the organization signing off on the SPDX report."), +) +@click.option( + "--creator-organisation", + "creator_organization", + hidden=True, +) +@click.pass_obj +def spdx( + obj: ClickObj, + output: Optional[click.File], + add_license_concluded: bool, + creator_person: Optional[str], + creator_organization: Optional[str], +) -> None: + # The SPDX spec mandates that a creator must be specified when a license + # conclusion is made, so here we enforce that. More context: + # https://github.com/fsfe/reuse-tool/issues/586#issuecomment-1310425706 + if ( + add_license_concluded + and creator_person is None + and creator_organization is None + ): + raise click.UsageError( + _( + "--creator-person=NAME or --creator-organization=NAME" + " required when --add-license-concluded is provided" + ) + ) + + if ( + output is not None + and output.name != "-" + and not any( + pattern.match(output.name) for pattern in _IGNORE_SPDX_PATTERNS + ) + ): + # pylint: disable=line-too-long + _LOGGER.warning( + _( + "'{path}' does not match a common SPDX file pattern. Find" + " the suggested naming conventions here:" + " https://spdx.github.io/spdx-spec/conformance/#44-standard-data-format-requirements" + ).format(path=output.name) + ) + + report = ProjectReport.generate( + cast(Project, obj.project), + multiprocessing=not obj.no_multiprocessing, + add_license_concluded=add_license_concluded, + ) + + with contextlib.ExitStack() as stack: + if output is not None: + out = stack.enter_context(output.open()) # type: ignore + else: + out = sys.stdout + click.echo( + report.bill_of_materials( + creator_person=creator_person, + creator_organization=creator_organization, + ), + file=out, + ) diff --git a/tests/test_cli_spdx.py b/tests/test_cli_spdx.py new file mode 100644 index 000000000..613a548a5 --- /dev/null +++ b/tests/test_cli_spdx.py @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2019 Stefan Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Skyler Grey +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for spdx.""" + +from click.testing import CliRunner +from freezegun import freeze_time + +from reuse.cli.main import main + + +class TestSpdx: + """Tests for spdx.""" + + @freeze_time("2024-04-08T17:34:00Z") + def test_simple(self, fake_repository): + """Compile to an SPDX document.""" + result = CliRunner().invoke(main, ["spdx"]) + output = result.output + + # Ensure no LicenseConcluded is included without the flag + assert "\nLicenseConcluded: NOASSERTION\n" in output + assert "\nLicenseConcluded: GPL-3.0-or-later\n" not in output + assert "\nCreator: Person: Anonymous ()\n" in output + assert "\nCreator: Organization: Anonymous ()\n" in output + assert "\nCreated: 2024-04-08T17:34:00Z\n" in output + + # TODO: This test is rubbish. + assert result.exit_code == 0 + + def test_creator_info(self, fake_repository): + """Ensure the --creator-* flags are properly formatted""" + result = CliRunner().invoke( + main, + [ + "spdx", + "--creator-person=Jane Doe (jane.doe@example.org)", + "--creator-organization=FSFE", + ], + ) + output = result.output + + assert result.exit_code == 0 + assert "\nCreator: Person: Jane Doe (jane.doe@example.org)\n" in output + assert "\nCreator: Organization: FSFE ()\n" in output + + def test_add_license_concluded(self, fake_repository): + """Compile to an SPDX document with the LicenseConcluded field.""" + result = CliRunner().invoke( + main, + [ + "spdx", + "--add-license-concluded", + "--creator-person=Jane Doe", + "--creator-organization=FSFE", + ], + ) + output = result.output + + # Ensure no LicenseConcluded is included without the flag + assert result.exit_code == 0 + assert "\nLicenseConcluded: NOASSERTION\n" not in output + assert "\nLicenseConcluded: GPL-3.0-or-later\n" in output + assert "\nCreator: Person: Jane Doe ()\n" in output + assert "\nCreator: Organization: FSFE ()\n" in output + + def test_add_license_concluded_without_creator_info(self, fake_repository): + """Adding LicenseConcluded should require creator information""" + result = CliRunner().invoke(main, ["spdx", "--add-license-concluded"]) + assert result.exit_code != 0 + assert "--add-license-concluded" in result.output + + def test_spdx_no_multiprocessing(self, fake_repository, multiprocessing): + """--no-multiprocessing works.""" + result = CliRunner().invoke(main, ["--no-multiprocessing", "spdx"]) + + # TODO: This test is rubbish. + assert result.exit_code == 0 + assert result.output From c654aa021932db8919b97ce4003dba7fcf8f75cc Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 1 Oct 2024 09:55:01 +0200 Subject: [PATCH 070/156] click: supported-licenses Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/__init__.py | 2 +- src/reuse/cli/supported_licenses.py | 28 ++++++++++++++++++++++++++ tests/test_cli_supported_licenses.py | 30 ++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/supported_licenses.py create mode 100644 tests/test_cli_supported_licenses.py diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index d9ef0abd8..fc88b10a5 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import convert_dep5, main, spdx +from . import convert_dep5, main, spdx, supported_licenses diff --git a/src/reuse/cli/supported_licenses.py b/src/reuse/cli/supported_licenses.py new file mode 100644 index 000000000..1bd82eb14 --- /dev/null +++ b/src/reuse/cli/supported_licenses.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightTect: 2021 Michael Weimann +# SPDX-FileCopyrightText: 2022 Florian Snow +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for supported-licenses subcommand.""" + +import click + +from .._licenses import _LICENSES, _load_license_list +from ..i18n import _ +from .main import main + +_HELP = _("List all licenses on the SPDX License List.") + + +@main.command(name="supported-licenses", help=_HELP) +def supported_licenses() -> None: + licenses = _load_license_list(_LICENSES)[1] + + for license_id, license_info in licenses.items(): + license_name = license_info["name"] + license_reference = license_info["reference"] + click.echo( + f"{license_id: <40}\t{license_name: <80}\t" + f"{license_reference: <50}" + ) diff --git a/tests/test_cli_supported_licenses.py b/tests/test_cli_supported_licenses.py new file mode 100644 index 000000000..2d909e306 --- /dev/null +++ b/tests/test_cli_supported_licenses.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightTect: 2021 Michael Weimann +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for supported-licenses.""" + +import re + +from click.testing import CliRunner + +from reuse.cli.main import main + + +class TestSupportedLicenses: + """Tests for supported-licenses.""" + + def test_simple(self): + """Invoke the supported-licenses command and check whether the result + contains at least one license in the expected format. + """ + + result = CliRunner().invoke(main, ["supported-licenses"]) + + assert result.exit_code == 0 + assert re.search( + # pylint: disable=line-too-long + r"GPL-3\.0-or-later\s+GNU General Public License v3\.0 or later\s+https:\/\/spdx\.org\/licenses\/GPL-3\.0-or-later\.html\s+\n", + result.output, + ) From 170f3768a04cd9620d04b33aaaa3344196182c19 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 1 Oct 2024 12:14:29 +0200 Subject: [PATCH 071/156] click: download Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_util.py | 1 + src/reuse/cli/__init__.py | 2 +- src/reuse/cli/download.py | 196 ++++++++++++++++++++++++++++++++ tests/test_cli_download.py | 225 +++++++++++++++++++++++++++++++++++++ 4 files changed, 423 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/download.py create mode 100644 tests/test_cli_download.py diff --git a/src/reuse/_util.py b/src/reuse/_util.py index c906dd64e..cd6e7f1d6 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -633,6 +633,7 @@ def print_incorrect_spdx_identifier( "SPDX License Identifiers." ) ) + out.write("\n") def detect_line_endings(text: str) -> str: diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index fc88b10a5..017371b14 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import convert_dep5, main, spdx, supported_licenses +from . import convert_dep5, download, main, spdx, supported_licenses diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py new file mode 100644 index 000000000..007e09a33 --- /dev/null +++ b/src/reuse/cli/download.py @@ -0,0 +1,196 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2023 Nico Rikken +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for download subcommand.""" + +import logging +import sys +from difflib import SequenceMatcher +from pathlib import Path +from typing import IO, Collection, Optional, cast +from urllib.error import URLError + +import click + +from .._licenses import ALL_NON_DEPRECATED_MAP +from .._util import StrPath +from ..download import _path_to_license_file, put_license_in_file +from ..i18n import _ +from ..project import Project +from ..report import ProjectReport +from .common import ClickObj, MutexOption +from .main import main + +_LOGGER = logging.getLogger(__name__) + + +def _similar_spdx_identifiers(identifier: str) -> list[str]: + """Given an incorrect SPDX identifier, return a list of similar ones.""" + suggestions: list[str] = [] + if identifier in ALL_NON_DEPRECATED_MAP: + return suggestions + + for valid_identifier in ALL_NON_DEPRECATED_MAP: + distance = SequenceMatcher( + a=identifier.lower(), b=valid_identifier[: len(identifier)].lower() + ).ratio() + if distance > 0.75: + suggestions.append(valid_identifier) + suggestions = sorted(suggestions) + + return suggestions + + +def _print_incorrect_spdx_identifier( + identifier: str, out: IO[str] = sys.stdout +) -> None: + """Print out that *identifier* is not valid, and follow up with some + suggestions. + """ + out.write( + _("'{}' is not a valid SPDX License Identifier.").format(identifier) + ) + out.write("\n") + + suggestions = _similar_spdx_identifiers(identifier) + if suggestions: + out.write("\n") + out.write(_("Did you mean:")) + out.write("\n") + for suggestion in suggestions: + out.write(f"* {suggestion}\n") + out.write("\n") + out.write( + _( + "See for a list of valid " + "SPDX License Identifiers." + ) + ) + out.write("\n") + + +def _already_exists(path: StrPath) -> None: + click.echo( + _("Error: {spdx_identifier} already exists.").format( + spdx_identifier=path + ) + ) + + +def _not_found(path: StrPath) -> None: + click.echo(_("Error: {path} does not exist.").format(path=path)) + + +def _could_not_download(identifier: str) -> None: + click.echo(_("Error: Failed to download license.")) + click.echo("") + if identifier not in ALL_NON_DEPRECATED_MAP: + _print_incorrect_spdx_identifier(identifier, out=sys.stdout) + else: + click.echo(_("Is your internet connection working?")) + + +def _successfully_downloaded(destination: StrPath) -> None: + click.echo( + _("Successfully downloaded {spdx_identifier}.").format( + spdx_identifier=destination + ) + ) + + +_ALL_MUTEX = ["all_", "output"] + + +_HELP = ( + _("Download a license and place it in the LICENSES/ directory.") + + "\n\n" + + _( + "LICENSE must be a valid SPDX License Identifier. You may specify" + " LICENSE multiple times to download multiple licenses." + ) +) + + +@main.command(name="download", help=_HELP) +@click.option( + "--all", + "all_", + cls=MutexOption, + mutually_exclusive=_ALL_MUTEX, + is_flag=True, + help=_("Download all missing licenses detected in the project."), +) +@click.option( + "--output", + "-o", + cls=MutexOption, + mutually_exclusive=_ALL_MUTEX, + type=click.Path(dir_okay=False, writable=True, path_type=Path), + help=_("Path to download to."), +) +@click.option( + "--source", + type=click.Path(exists=True, readable=True, path_type=Path), + help=_( + "Source from which to copy custom LicenseRef- licenses, either" + " a directory that contains the file or the file itself" + ), +) +@click.argument( + "license_", + metavar=_("LICENSE"), + type=str, + nargs=-1, +) +@click.pass_obj +def download( + obj: ClickObj, + license_: Collection[str], + all_: bool, + output: Optional[Path], + source: Optional[Path], +) -> None: + + if all_ and license_: + raise click.UsageError( + _( + "The 'LICENSE' argument and '--all' option are mutually" + " exclusive." + ) + ) + + licenses: Collection[str] = license_ # type: ignore + + if all_: + # TODO: This is fairly inefficient, but gets the job done. + report = ProjectReport.generate( + cast(Project, obj.project), do_checksum=False + ) + licenses = report.missing_licenses.keys() + + if len(licenses) > 1 and output: + raise click.UsageError( + _("Cannot use '--output' with more than one license.") + ) + + return_code = 0 + for lic in licenses: + destination: Path = output # type: ignore + if destination is None: + destination = _path_to_license_file(lic, obj.project) + try: + put_license_in_file(lic, destination=destination, source=source) + except URLError: + _could_not_download(lic) + return_code = 1 + except FileExistsError as err: + _already_exists(err.filename) + return_code = 1 + except FileNotFoundError as err: + _not_found(err.filename) + return_code = 1 + else: + _successfully_downloaded(destination) + sys.exit(return_code) diff --git a/tests/test_cli_download.py b/tests/test_cli_download.py new file mode 100644 index 000000000..d03cee9b8 --- /dev/null +++ b/tests/test_cli_download.py @@ -0,0 +1,225 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for download.""" + +# pylint: disable=redefined-outer-name,unused-argument + +import errno +import os +from pathlib import Path +from unittest.mock import create_autospec +from urllib.error import URLError + +import pytest +from click.testing import CliRunner + +from reuse.cli import download +from reuse.cli.main import main + + +@pytest.fixture() +def mock_put_license_in_file(monkeypatch): + """Create a mocked version of put_license_in_file.""" + result = create_autospec(download.put_license_in_file) + monkeypatch.setattr(download, "put_license_in_file", result) + return result + + +class TestDownload: + """Tests for download.""" + + def test_simple(self, empty_directory, mock_put_license_in_file): + """Straightforward test.""" + result = CliRunner().invoke(main, ["download", "0BSD"]) + + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", Path("LICENSES/0BSD.txt").resolve(), source=None + ) + + def test_all_and_license_mutually_exclusive(self, empty_directory): + """--all and license args are mutually exclusive.""" + result = CliRunner().invoke(main, ["download", "--all", "0BSD"]) + assert result.exit_code != 0 + assert "are mutually exclusive" in result.output + + def test_all_and_output_mutually_exclusive(self, empty_directory): + """--all and --output are mutually exclusive.""" + result = CliRunner().invoke( + main, ["download", "--all", "--output", "foo"] + ) + assert result.exit_code != 0 + assert "is mutually exclusive with" in result.output + + def test_file_exists(self, fake_repository, mock_put_license_in_file): + """The to-be-downloaded file already exists.""" + mock_put_license_in_file.side_effect = FileExistsError( + errno.EEXIST, "", "GPL-3.0-or-later.txt" + ) + + result = CliRunner().invoke(main, ["download", "GPL-3.0-or-later"]) + + assert result.exit_code == 1 + assert "GPL-3.0-or-later.txt already exists" in result.output + + def test_exception(self, empty_directory, mock_put_license_in_file): + """There was an error while downloading the license file.""" + mock_put_license_in_file.side_effect = URLError("test") + + result = CliRunner().invoke(main, ["download", "0BSD"]) + + assert result.exit_code == 1 + assert "internet" in result.output + + def test_invalid_spdx(self, empty_directory, mock_put_license_in_file): + """An invalid SPDX identifier was provided.""" + mock_put_license_in_file.side_effect = URLError("test") + + result = CliRunner().invoke(main, ["download", "does-not-exist"]) + + assert result.exit_code == 1 + assert "not a valid SPDX License Identifier" in result.output + + def test_custom_output(self, empty_directory, mock_put_license_in_file): + """Download the license into a custom file.""" + result = CliRunner().invoke(main, ["download", "-o", "foo", "0BSD"]) + + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", destination=Path("foo"), source=None + ) + + def test_custom_output_too_many( + self, empty_directory, mock_put_license_in_file + ): + """Providing more than one license with a custom output results in an + error. + """ + result = CliRunner().invoke( + main, + ["download", "-o", "foo", "0BSD", "GPL-3.0-or-later"], + ) + + assert result.exit_code != 0 + assert ( + "Cannot use '--output' with more than one license" in result.output + ) + + def test_inside_licenses_dir( + self, fake_repository, mock_put_license_in_file + ): + """While inside the LICENSES/ directory, don't create another LICENSES/ + directory. + """ + os.chdir(fake_repository / "LICENSES") + result = CliRunner().invoke(main, ["download", "0BSD"]) + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", destination=Path("0BSD.txt").absolute(), source=None + ) + + def test_inside_licenses_dir_in_git( + self, git_repository, mock_put_license_in_file + ): + """While inside a random LICENSES/ directory in a Git repository, use + the root LICENSES/ directory. + """ + (git_repository / "doc/LICENSES").mkdir() + os.chdir(git_repository / "doc/LICENSES") + result = CliRunner().invoke(main, ["download", "0BSD"]) + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", destination=Path("../../LICENSES/0BSD.txt"), source=None + ) + + def test_different_root(self, fake_repository, mock_put_license_in_file): + """Download using a different root.""" + (fake_repository / "new_root").mkdir() + + result = CliRunner().invoke( + main, + [ + "--root", + str((fake_repository / "new_root").resolve()), + "download", + "MIT", + ], + ) + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "MIT", Path("new_root/LICENSES/MIT.txt").resolve(), source=None + ) + + def test_licenseref_no_source(self, empty_directory): + """Downloading a LicenseRef license creates an empty file.""" + CliRunner().invoke(main, ["download", "LicenseRef-hello"]) + assert ( + empty_directory / "LICENSES/LicenseRef-hello.txt" + ).read_text() == "" + + def test_licenseref_source_file( + self, + empty_directory, + ): + """Downloading a LicenseRef license with a source file copies that + file's contents. + """ + (empty_directory / "foo.txt").write_text("foo") + CliRunner().invoke( + main, + ["download", "--source", "foo.txt", "LicenseRef-hello"], + ) + assert ( + empty_directory / "LICENSES/LicenseRef-hello.txt" + ).read_text() == "foo" + + def test_licenseref_source_dir(self, empty_directory): + """Downloading a LicenseRef license with a source dir copies the text + from the corresponding file in the directory. + """ + (empty_directory / "lics").mkdir() + (empty_directory / "lics/LicenseRef-hello.txt").write_text("foo") + + CliRunner().invoke( + main, ["download", "--source", "lics", "LicenseRef-hello"] + ) + assert ( + empty_directory / "LICENSES/LicenseRef-hello.txt" + ).read_text() == "foo" + + def test_licenseref_false_source_dir(self, empty_directory): + """Downloading a LicenseRef license with a source that does not contain + the license results in an error. + """ + (empty_directory / "lics").mkdir() + + result = CliRunner().invoke( + main, ["download", "--source", "lics", "LicenseRef-hello"] + ) + assert result.exit_code == 1 + assert ( + f"{Path('lics') / 'LicenseRef-hello.txt'} does not exist" + in result.output + ) + + +class TestSimilarIdentifiers: + """Test a private function _similar_spdx_identifiers.""" + + # pylint: disable=protected-access + + def test_typo(self): + """Given a misspelt SPDX License Identifier, suggest a better one.""" + result = download._similar_spdx_identifiers("GPL-3.0-or-lter") + + assert "GPL-3.0-or-later" in result + assert "AGPL-3.0-or-later" in result + assert "LGPL-3.0-or-later" in result + + def test_prefix(self): + """Given an incomplete SPDX License Identifier, suggest a better one.""" + result = download._similar_spdx_identifiers("CC0") + + assert "CC0-1.0" in result From 8be8d71b076c5d36dafc0f2b6c560a8a1a3dee4a Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 1 Oct 2024 13:31:07 +0200 Subject: [PATCH 072/156] click: lint-file Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/__init__.py | 2 +- src/reuse/cli/lint_file.py | 79 +++++++++++++++++++++++++++++++++++++ tests/test_cli_lint_file.py | 67 +++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/reuse/cli/lint_file.py create mode 100644 tests/test_cli_lint_file.py diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index 017371b14..aafbd7505 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import convert_dep5, download, main, spdx, supported_licenses +from . import convert_dep5, download, lint_file, main, spdx, supported_licenses diff --git a/src/reuse/cli/lint_file.py b/src/reuse/cli/lint_file.py new file mode 100644 index 000000000..0b42d9db8 --- /dev/null +++ b/src/reuse/cli/lint_file.py @@ -0,0 +1,79 @@ +# SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for lint-file subcommand.""" + +# pylint: disable=unused-argument + +import sys +from pathlib import Path +from typing import Collection, cast + +import click + +from ..i18n import _ +from ..lint import format_lines_subset +from ..project import Project +from ..report import ProjectSubsetReport +from .common import ClickObj, MutexOption +from .main import main + +_OUTPUT_MUTEX = ["quiet", "lines"] + +_HELP = _( + "Lint individual files. The specified FILEs are checked for the presence" + " of copyright and licensing information, and whether the found licenses" + " are included in the LICENSES/ directory." +) + + +@main.command(name="lint-file", help=_HELP) +@click.option( + "--quiet", + "-q", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Prevent output."), +) +@click.option( + "--lines", + "-l", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Format output as errors per line. (default)"), +) +@click.argument( + "files", + metavar=_("FILE"), + type=click.Path(exists=True, path_type=Path), + nargs=-1, +) +@click.pass_obj +def lint_file( + obj: ClickObj, quiet: bool, lines: bool, files: Collection[Path] +) -> None: + project = cast(Project, obj.project) + subset_files = {Path(file_) for file_ in files} + for file_ in subset_files: + if not file_.resolve().is_relative_to(project.root.resolve()): + raise click.UsageError( + _("'{file}' is not inside of '{root}'").format( + file=file_, root=project.root + ) + ) + report = ProjectSubsetReport.generate( + project, + subset_files, + multiprocessing=not obj.no_multiprocessing, + ) + + if quiet: + pass + else: + click.echo(format_lines_subset(report), nl=False) + + sys.exit(0 if report.is_compliant else 1) diff --git a/tests/test_cli_lint_file.py b/tests/test_cli_lint_file.py new file mode 100644 index 000000000..a02c25bee --- /dev/null +++ b/tests/test_cli_lint_file.py @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for lint-file.""" + +# pylint: disable=unused-argument + +from click.testing import CliRunner + +from reuse.cli.main import main + + +class TestLintFile: + """Tests for lint-file.""" + + def test_simple(self, fake_repository): + """A simple test to make sure it works.""" + result = CliRunner().invoke(main, ["lint-file", "src/custom.py"]) + assert result.exit_code == 0 + assert not result.output + + def test_quiet_lines_mutually_exclusive(self, empty_directory): + """'--quiet' and '--lines' are mutually exclusive.""" + (empty_directory / "foo.py").write_text("foo") + result = CliRunner().invoke( + main, ["lint-file", "--quiet", "--lines", "foo"] + ) + assert result.exit_code != 0 + assert "mutually exclusive" in result.output + + def test_no_copyright_licensing(self, fake_repository): + """A file is correctly spotted when it has no copyright or licensing + info. + """ + (fake_repository / "foo.py").write_text("foo") + result = CliRunner().invoke(main, ["lint-file", "foo.py"]) + assert result.exit_code == 1 + output = result.output + assert "foo.py" in output + assert "no license identifier" in output + assert "no copyright notice" in output + + def test_path_outside_project(self, empty_directory): + """A file can't be outside the project.""" + result = CliRunner().invoke(main, ["lint-file", ".."]) + assert result.exit_code != 0 + assert "'..' is not in" in result.output + + def test_file_not_exists(self, empty_directory): + """A file must exist.""" + result = CliRunner().invoke(main, ["lint-file", "foo.py"]) + assert "'foo.py' does not exist" in result.output + + def test_ignored_file(self, fake_repository): + """A corner case where a specified file is ignored. It isn't checked at + all. + """ + (fake_repository / "COPYING").write_text("foo") + result = CliRunner().invoke(main, ["lint-file", "COPYING"]) + assert result.exit_code == 0 + + def test_file_covered_by_toml(self, fake_repository_reuse_toml): + """If a file is covered by REUSE.toml, use its infos.""" + (fake_repository_reuse_toml / "doc/foo.md").write_text("foo") + result = CliRunner().invoke(main, ["lint-file", "doc/foo.md"]) + assert result.exit_code == 0 From f20fd33b17b56ac129059fdd2e4f23513b3254ec Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 1 Oct 2024 15:38:01 +0200 Subject: [PATCH 073/156] click: lint Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/__init__.py | 10 +- src/reuse/cli/lint.py | 116 +++++++++++++++++ tests/conftest.py | 46 ++++++- tests/test_cli_lint.py | 264 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 434 insertions(+), 2 deletions(-) create mode 100644 src/reuse/cli/lint.py create mode 100644 tests/test_cli_lint.py diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index aafbd7505..3fd1042a7 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,4 +2,12 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import convert_dep5, download, lint_file, main, spdx, supported_licenses +from . import ( + convert_dep5, + download, + lint, + lint_file, + main, + spdx, + supported_licenses, +) diff --git a/src/reuse/cli/lint.py b/src/reuse/cli/lint.py new file mode 100644 index 000000000..11d3305ba --- /dev/null +++ b/src/reuse/cli/lint.py @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2023 DB Systel GmbH +# SPDX-FileCopyrightText: 2024 Nico Rikken +# +# SPDX-License-Identifier: GPL-3.0-or-later + +# pylint: disable=unused-argument + +"""Click code for lint subcommand.""" + +import sys +from typing import cast + +import click + +from ..i18n import _ +from ..lint import format_json, format_lines, format_plain +from ..project import Project +from ..report import ProjectReport +from .common import ClickObj, MutexOption +from .main import main + +_OUTPUT_MUTEX = ["quiet", "json", "plain", "lines"] + +_HELP = ( + _( + "Lint the project directory for compliance with" + " version {reuse_version} of the REUSE Specification. You can" + " find the latest version of the specification at" + " ." + ) + + "\n\n" + + _("Specifically, the following criteria are checked:") + + "\n\n" + + _( + "- Are there any bad (unrecognised, not compliant with SPDX)" + " licenses in the project?" + ) + + "\n" + + _("- Are there any deprecated licenses in the project?") + + "\n" + + _( + "- Are there any license files in the LICENSES/ directory" + " without file extension?" + ) + + "\n" + + _( + "- Are any licenses referred to inside of the project, but" + " not included in the LICENSES/ directory?" + ) + + "\n" + + _( + "- Are any licenses included in the LICENSES/ directory that" + " are not used inside of the project?" + ) + + "\n" + + _("- Are there any read errors?") + + "\n" + + _("- Do all files have valid copyright and licensing information?") +) + + +@main.command(name="lint", help=_HELP) +@click.option( + "--quiet", + "-q", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Prevent output."), +) +@click.option( + "--json", + "-j", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Format output as JSON."), +) +@click.option( + "--plain", + "-p", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Format output as plain text. (default)"), +) +@click.option( + "--lines", + "-l", + cls=MutexOption, + mutually_exclusive=_OUTPUT_MUTEX, + is_flag=True, + help=_("Format output as errors per line."), +) +@click.pass_obj +def lint( + obj: ClickObj, quiet: bool, json: bool, plain: bool, lines: bool +) -> None: + report = ProjectReport.generate( + cast(Project, obj.project), + do_checksum=False, + multiprocessing=not obj.no_multiprocessing, + ) + + if quiet: + pass + elif json: + click.echo(format_json(report), nl=False) + elif lines: + click.echo(format_lines(report), nl=False) + else: + click.echo(format_plain(report), nl=False) + + sys.exit(0 if report.is_compliant else 1) diff --git a/tests/conftest.py b/tests/conftest.py index abcacfe00..075a5fe4d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -21,7 +21,7 @@ from inspect import cleandoc from io import StringIO from pathlib import Path -from typing import Generator +from typing import Generator, Optional from unittest.mock import create_autospec import pytest @@ -110,6 +110,17 @@ def git_exe() -> str: return str(GIT_EXE) +@pytest.fixture(params=[True, False]) +def optional_git_exe( + request, monkeypatch +) -> Generator[Optional[str], None, None]: + """Run the test with or without git.""" + exe = GIT_EXE if request.param else "" + monkeypatch.setattr("reuse.vcs.GIT_EXE", exe) + monkeypatch.setattr("reuse._util.GIT_EXE", exe) + yield exe + + @pytest.fixture() def hg_exe() -> str: """Run the test with mercurial (hg).""" @@ -118,6 +129,17 @@ def hg_exe() -> str: return str(HG_EXE) +@pytest.fixture(params=[True, False]) +def optional_hg_exe( + request, monkeypatch +) -> Generator[Optional[str], None, None]: + """Run the test with or without mercurial.""" + exe = HG_EXE if request.param else "" + monkeypatch.setattr("reuse.vcs.HG_EXE", exe) + monkeypatch.setattr("reuse._util.HG_EXE", exe) + yield exe + + @pytest.fixture() def jujutsu_exe() -> str: """Run the test with Jujutsu.""" @@ -126,6 +148,17 @@ def jujutsu_exe() -> str: return str(JUJUTSU_EXE) +@pytest.fixture(params=[True, False]) +def optional_jujutsu_exe( + request, monkeypatch +) -> Generator[Optional[str], None, None]: + """Run the test with or without Jujutsu.""" + exe = JUJUTSU_EXE if request.param else "" + monkeypatch.setattr("reuse.vcs.JUJUTSU_EXE", exe) + monkeypatch.setattr("reuse._util.JUJUTSU_EXE", exe) + yield exe + + @pytest.fixture() def pijul_exe() -> str: """Run the test with Pijul.""" @@ -134,6 +167,17 @@ def pijul_exe() -> str: return str(PIJUL_EXE) +@pytest.fixture(params=[True, False]) +def optional_pijul_exe( + request, monkeypatch +) -> Generator[Optional[str], None, None]: + """Run the test with or without Pijul.""" + exe = PIJUL_EXE if request.param else "" + monkeypatch.setattr("reuse.vcs.PIJUL_EXE", exe) + monkeypatch.setattr("reuse._util.PIJUL_EXE", exe) + yield exe + + @pytest.fixture(params=[True, False]) def multiprocessing(request, monkeypatch) -> Generator[bool, None, None]: """Run the test with or without multiprocessing.""" diff --git a/tests/test_cli_lint.py b/tests/test_cli_lint.py new file mode 100644 index 000000000..b29dcb7f9 --- /dev/null +++ b/tests/test_cli_lint.py @@ -0,0 +1,264 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2019 Stefan Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Skyler Grey +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +# pylint: disable=unused-argument,too-many-public-methods + +"""Tests for lint.""" + +import json +import os +import shutil +from inspect import cleandoc + +from click.testing import CliRunner +from conftest import RESOURCES_DIRECTORY + +from reuse._util import cleandoc_nl +from reuse.cli.main import main +from reuse.report import LINT_VERSION + + +class TestLint: + """Tests for lint.""" + + def test_simple(self, fake_repository, optional_git_exe, optional_hg_exe): + """Run a successful lint. The optional VCSs are there to make sure that + the test also works if these programs are not installed. + """ + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_reuse_toml(self, fake_repository_reuse_toml): + """Run a simple lint with REUSE.toml.""" + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_dep5(self, fake_repository_dep5): + """Run a simple lint with .reuse/dep5.""" + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_git(self, git_repository): + """Run a successful lint.""" + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_submodule(self, submodule_repository): + """Run a successful lint.""" + (submodule_repository / "submodule/foo.c").write_text("foo") + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_submodule_included(self, submodule_repository): + """Run a successful lint.""" + result = CliRunner().invoke(main, ["--include-submodules", "lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_submodule_included_fail(self, submodule_repository): + """Run a failed lint.""" + (submodule_repository / "submodule/foo.c").write_text("foo") + result = CliRunner().invoke(main, ["--include-submodules", "lint"]) + + assert result.exit_code == 1 + assert ":-(" in result.output + + def test_meson_subprojects(self, fake_repository): + """Verify that subprojects are ignored.""" + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_meson_subprojects_fail(self, subproject_repository): + """Verify that files in './subprojects' are not ignored.""" + # ./subprojects/foo.wrap misses license and linter fails + (subproject_repository / "subprojects/foo.wrap").write_text("foo") + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code == 1 + assert ":-(" in result.output + + def test_meson_subprojects_included_fail(self, subproject_repository): + """When Meson subprojects are included, fail on errors.""" + result = CliRunner().invoke( + main, ["--include-meson-subprojects", "lint"] + ) + + assert result.exit_code == 1 + assert ":-(" in result.output + + def test_meson_subprojects_included(self, subproject_repository): + """Successfully lint when Meson subprojects are included.""" + # ./subprojects/libfoo/foo.c has license and linter succeeds + (subproject_repository / "subprojects/libfoo/foo.c").write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2022 Jane Doe + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + ) + result = CliRunner().invoke( + main, ["--include-meson-subprojects", "lint"] + ) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_fail(self, fake_repository): + """Run a failed lint.""" + (fake_repository / "foo.py").write_text("foo") + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code > 0 + assert "foo.py" in result.output + assert ":-(" in result.output + + def test_fail_quiet(self, fake_repository): + """Run a failed lint.""" + (fake_repository / "foo.py").write_text("foo") + result = CliRunner().invoke(main, ["lint", "--quiet"]) + + assert result.exit_code > 0 + assert result.output == "" + + def test_dep5_decode_error(self, fake_repository_dep5): + """Display an error if dep5 cannot be decoded.""" + shutil.copy( + RESOURCES_DIRECTORY / "fsfe.png", + fake_repository_dep5 / ".reuse/dep5", + ) + result = CliRunner().invoke(main, ["lint"]) + assert result.exit_code != 0 + assert str(fake_repository_dep5 / ".reuse/dep5") in result.output + assert "could not be parsed" in result.output + assert "'utf-8' codec can't decode byte" in result.output + + def test_dep5_parse_error(self, fake_repository_dep5, capsys): + """Display an error if there's a dep5 parse error.""" + (fake_repository_dep5 / ".reuse/dep5").write_text("foo") + result = CliRunner().invoke(main, ["lint"]) + assert result.exit_code != 0 + assert str(fake_repository_dep5 / ".reuse/dep5") in result.output + assert "could not be parsed" in result.output + + def test_toml_parse_error_version(self, fake_repository_reuse_toml, capsys): + """If version has the wrong type, print an error.""" + (fake_repository_reuse_toml / "REUSE.toml").write_text("version = 'a'") + result = CliRunner().invoke(main, ["lint"]) + assert result.exit_code != 0 + assert str(fake_repository_reuse_toml / "REUSE.toml") in result.output + assert "could not be parsed" in result.output + + def test_toml_parse_error_annotation( + self, fake_repository_reuse_toml, capsys + ): + """If there is an error in an annotation, print an error.""" + (fake_repository_reuse_toml / "REUSE.toml").write_text( + cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = 1 + """ + ) + ) + result = CliRunner().invoke(main, ["lint"]) + assert result.exit_code != 0 + assert str(fake_repository_reuse_toml / "REUSE.toml") in result.output + assert "could not be parsed" in result.output + + def test_json(self, fake_repository): + """Run a failed lint.""" + result = CliRunner().invoke(main, ["lint", "--json"]) + output = json.loads(result.output) + + assert result.exit_code == 0 + assert output["lint_version"] == LINT_VERSION + assert len(output["files"]) == 8 + + def test_json_fail(self, fake_repository): + """Run a failed lint.""" + (fake_repository / "foo.py").write_text("foo") + result = CliRunner().invoke(main, ["lint", "--json"]) + output = json.loads(result.output) + + assert result.exit_code > 0 + assert output["lint_version"] == LINT_VERSION + assert len(output["non_compliant"]["missing_licensing_info"]) == 1 + assert len(output["non_compliant"]["missing_copyright_info"]) == 1 + assert len(output["files"]) == 9 + + def test_no_file_extension(self, fake_repository): + """If a license has no file extension, the lint fails.""" + (fake_repository / "LICENSES/CC0-1.0.txt").rename( + fake_repository / "LICENSES/CC0-1.0" + ) + result = CliRunner().invoke(main, ["lint"]) + + assert result.exit_code > 0 + assert "Licenses without file extension: CC0-1.0" in result.output + assert ":-(" in result.output + + def test_custom_root(self, fake_repository): + """Use a custom root location.""" + result = CliRunner().invoke(main, ["--root", "doc", "lint"]) + + assert result.exit_code > 0 + assert "usage.md" in result.output + assert ":-(" in result.output + + def test_custom_root_git(self, git_repository): + """Use a custom root location in a git repo.""" + result = CliRunner().invoke(main, ["--root", "doc", "lint"]) + + assert result.exit_code > 0 + assert "usage.md" in result.output + assert ":-(" in result.output + + def test_custom_root_different_cwd(self, fake_repository_reuse_toml): + """Use a custom root while CWD is different.""" + os.chdir("/") + result = CliRunner().invoke( + main, ["--root", str(fake_repository_reuse_toml), "lint"] + ) + + assert result.exit_code == 0 + assert ":-)" in result.output + + def test_custom_root_is_file(self, fake_repository): + """Custom root cannot be a file.""" + result = CliRunner().invoke(main, ["--root", ".reuse/dep5", "lint"]) + assert result.exit_code != 0 + + def test_custom_root_not_exists(self, fake_repository): + """Custom root must exist.""" + result = CliRunner().invoke(main, ["--root", "does-not-exist", "lint"]) + assert result.exit_code != 0 + + def test_no_multiprocessing(self, fake_repository, multiprocessing): + """--no-multiprocessing works.""" + result = CliRunner().invoke(main, ["--no-multiprocessing", "lint"]) + + assert result.exit_code == 0 + assert ":-)" in result.output From 281fc594bfa97ba360b8f9924f873abb8e279d16 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 3 Oct 2024 16:05:53 +0200 Subject: [PATCH 074/156] click: annotate Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_util.py | 1 + src/reuse/cli/__init__.py | 1 + src/reuse/cli/annotate.py | 483 ++++++++++ src/reuse/cli/common.py | 13 + tests/test_cli_annotate.py | 1767 ++++++++++++++++++++++++++++++++++++ 5 files changed, 2265 insertions(+) create mode 100644 src/reuse/cli/annotate.py create mode 100644 tests/test_cli_annotate.py diff --git a/src/reuse/_util.py b/src/reuse/_util.py index cd6e7f1d6..5eaf59428 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -259,6 +259,7 @@ def _contains_snippet(binary_file: BinaryIO) -> bool: return False +# FIXME: move to comment.py def _get_comment_style(path: StrPath) -> Optional[Type[CommentStyle]]: """Return value of CommentStyle detected for *path* or None.""" path = Path(path) diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index 3fd1042a7..c0a7798af 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from . import ( + annotate, convert_dep5, download, lint, diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py new file mode 100644 index 000000000..b70f31570 --- /dev/null +++ b/src/reuse/cli/annotate.py @@ -0,0 +1,483 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2019 Kirill Elagin +# SPDX-FileCopyrightText: 2019 Stefan Bakker +# SPDX-FileCopyrightText: 2020 Dmitry Bogatov +# SPDX-FileCopyrightText: 2021 Alliander N.V. +# SPDX-FileCopyrightText: 2021 Alvar Penning +# SPDX-FileCopyrightText: 2021 Robin Vobruba +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Yaman Qalieh +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Click code for annotate subcommand.""" + +import datetime +import logging +import sys +from pathlib import Path +from typing import Any, Collection, Iterable, Optional, Sequence, Type, cast + +import click +from binaryornot.check import is_binary +from boolean.boolean import Expression +from jinja2 import Environment, FileSystemLoader, Template +from jinja2.exceptions import TemplateNotFound + +from .. import ReuseInfo +from .._annotate import add_header_to_file +from .._util import ( + _COPYRIGHT_PREFIXES, + _determine_license_path, + _determine_license_suffix_path, + _get_comment_style, + _has_style, + _is_uncommentable, + make_copyright_line, +) +from ..comment import NAME_STYLE_MAP, CommentStyle +from ..i18n import _ +from ..project import Project +from .common import ClickObj, MutexOption, spdx_identifier +from .main import main + +_LOGGER = logging.getLogger(__name__) + + +def test_mandatory_option_required( + copyright_: Any, + license_: Any, + contributor: Any, +) -> None: + """Raise a parser error if one of the mandatory options is not provided.""" + if not any((copyright_, license_, contributor)): + raise click.UsageError( + _( + "Option '--copyright', '--license', or '--contributor' is" + " required." + ) + ) + + +def all_paths( + paths: Collection[Path], + recursive: bool, + project: Project, +) -> list[Path]: + """Return a set of all provided paths, converted into .license paths if they + exist. If *recursive* is enabled, all files belonging to *project* that are + recursive children of *paths* are also added. + + Directories are filtered out. + """ + if recursive: + result: set[Path] = set() + all_files = [path.resolve() for path in project.all_files()] + for path in paths: + if path.is_file(): + result.add(path) + else: + result |= { + child + for child in all_files + if path.resolve() in child.parents + } + else: + result = set(paths) + return [_determine_license_path(path) for path in result if path.is_file()] + + +def verify_paths_comment_style( + style: Any, + fallback_dot_license: Any, + skip_unrecognised: Any, + force_dot_license: Any, + paths: Iterable[Path], +) -> None: + """Exit if --style, --force-dot-license, --fallback-dot-license, + or --skip-unrecognised is not enabled and one of the paths has an + unrecognised style. + """ + if ( + not style + and not fallback_dot_license + and not skip_unrecognised + and not force_dot_license + ): + unrecognised_files: set[Path] = set() + + for path in paths: + if not _has_style(path): + unrecognised_files.add(path) + + if unrecognised_files: + raise click.UsageError( + "{}\n\n{}".format( + _( + "The following files do not have a recognised file" + " extension. Please use --style, --force-dot-license," + " --fallback-dot-license, or --skip-unrecognised:" + ), + "\n".join(str(path) for path in unrecognised_files), + ) + ) + + +def verify_paths_line_handling( + single_line: bool, + multi_line: bool, + forced_style: Optional[str], + paths: Iterable[Path], +) -> None: + """This function aborts the parser when --single-line or --multi-line is + used, but the file type does not support that type of comment style. + """ + for path in paths: + style: Optional[Type[CommentStyle]] = None + if forced_style is not None: + style = NAME_STYLE_MAP.get(forced_style) + if style is None: + style = _get_comment_style(path) + # This shouldn't happen because of prior tests, so let's not bother with + # this case. + if style is None: + continue + # TODO: list all non-functional paths + if single_line and not style.can_handle_single(): + raise click.UsageError( + _( + "'{path}' does not support single-line comments, please" + " do not use --single-line" + ).format(path=path) + ) + if multi_line and not style.can_handle_multi(): + raise click.UsageError( + _( + "'{path}' does not support multi-line comments, please" + " do not use --multi-line" + ).format(path=path) + ) + + +def find_template(project: Project, name: str) -> Template: + """Find a template given a name. + + Raises: + TemplateNotFound: if template could not be found. + """ + template_dir = project.root / ".reuse/templates" + env = Environment( + loader=FileSystemLoader(str(template_dir)), trim_blocks=True + ) + + names = [name] + if not name.endswith(".jinja2"): + names.append(f"{name}.jinja2") + if not name.endswith(".commented.jinja2"): + names.append(f"{name}.commented.jinja2") + + for item in names: + try: + return env.get_template(item) + except TemplateNotFound: + pass + raise TemplateNotFound(name) + + +def get_template( + template_str: Optional[str], project: Project +) -> tuple[Optional[Template], bool]: + """If a template is specified on the CLI, find and return it, including + whether it is a 'commented' template. + + If no template is specified, just return None. + """ + template: Optional[Template] = None + commented = False + if template_str: + try: + template = cast(Template, find_template(project, template_str)) + except TemplateNotFound as error: + raise click.UsageError( + _("Template '{template}' could not be found.").format( + template=template_str + ) + ) from error + + if ".commented" in Path(cast(str, template.name)).suffixes: + commented = True + return template, commented + + +def get_year(years: Sequence[str], exclude_year: bool) -> Optional[str]: + """Get the year. Normally it is today's year. If --year is specified once, + get that one. If it is specified twice (or more), return the range between + the two. + + If --exclude-year is specified, return None. + """ + year = None + if not exclude_year: + if years: + if len(years) > 1: + year = f"{min(years)} - {max(years)}" + else: + year = years[0] + else: + year = str(datetime.date.today().year) + return year + + +def get_reuse_info( + copyrights: Collection[str], + licenses: Collection[Expression], + contributors: Collection[str], + copyright_prefix: Optional[str], + year: Optional[str], +) -> ReuseInfo: + """Create a ReuseInfo object from --license, --copyright, and + --contributor. + """ + copyright_prefix = ( + copyright_prefix if copyright_prefix is not None else "spdx" + ) + copyright_lines = { + make_copyright_line(item, year=year, copyright_prefix=copyright_prefix) + for item in copyrights + } + + return ReuseInfo( + spdx_expressions=set(licenses), + copyright_lines=copyright_lines, + contributor_lines=set(contributors), + ) + +_YEAR_MUTEX = ["years", "exclude_year"] +_LINE_MUTEX = ["single_line", "multi_line"] +_STYLE_MUTEX = ["force_dot_license", "fallback_dot_license", "skip_unrecognised"] + +_HELP = ( + _("Add copyright and licensing into the header of one or more" " files.") + + "\n\n" + + _( + "By using --copyright and --license, you can specify which" + " copyright holders and licenses to add to the headers of the" + " given files." + ) + + "\n\n" + + _( + "By using --contributor, you can specify people or entity that" + " contributed but are not copyright holder of the given" + " files." + ) +) + + +@main.command(name="annotate", help=_HELP) +@click.option( + "--copyright", + "-c", + "copyrights", + type=str, + multiple=True, + help=_("Copyright statement."), +) +@click.option( + "--license", + "-l", + "licenses", + metavar=_("SPDX_IDENTIFIER"), + type=spdx_identifier, + multiple=True, + help=_("SPDX License Identifier."), +) +@click.option( + "--contributor", + "contributors", + type=str, + multiple=True, + help=_("File contributor."), +) +@click.option( + "--year", + "-y", + "years", + cls=MutexOption, + mutually_exclusive=_YEAR_MUTEX, + multiple=True, + type=str, + help=_("Year of copyright statement."), +) +@click.option( + "--style", + "-s", + cls=MutexOption, + mutually_exclusive=["skip_unrecognised"], # FIXME: test + type=click.Choice(list(NAME_STYLE_MAP)), + help=_("Comment style to use."), +) +@click.option( + "--copyright-prefix", + type=click.Choice(list(_COPYRIGHT_PREFIXES)), + help=_("Copyright prefix to use."), +) +@click.option( + "--copyright-style", + "copyright_prefix", + hidden=True, +) +@click.option( + "--template", + "-t", + "template_str", + type=str, + help=_("Name of template to use."), +) +@click.option( + "--exclude-year", + cls=MutexOption, + mutually_exclusive=_YEAR_MUTEX, + is_flag=True, + help=_("Do not include year in copyright statement."), +) +@click.option( + "--merge-copyrights", + is_flag=True, + help=_("Merge copyright lines if copyright statements are identical."), +) +@click.option( + "--single-line", + cls=MutexOption, + # FIXME: This results in an ugly error message that shows 'multi_line' + # instead of '--multi-line'. + mutually_exclusive=_LINE_MUTEX, + is_flag=True, + help=_("Force single-line comment style."), +) +@click.option( + "--multi-line", + cls=MutexOption, + mutually_exclusive=_LINE_MUTEX, + is_flag=True, + help=_("Force multi-line comment style."), +) +@click.option( + "--recursive", + "-r", + is_flag=True, + help=_("Add headers to all files under specified directories recursively."), +) +@click.option( + "--no-replace", + is_flag=True, + help=_("Do not replace the first header in the file; just add a new one."), +) +@click.option( + "--force-dot-license", + cls=MutexOption, + mutually_exclusive=_STYLE_MUTEX, + is_flag=True, + help=_("Always write a .license file instead of a header inside the file."), +) +@click.option( + "--fallback-dot-license", + cls=MutexOption, + mutually_exclusive=_STYLE_MUTEX, + is_flag=True, + help=_("Write a .license file to files with unrecognised comment styles."), +) +@click.option( + "--skip-unrecognised", + cls=MutexOption, + mutually_exclusive=_STYLE_MUTEX, + is_flag=True, + help=_("Skip files with unrecognised comment styles."), +) +@click.option( + "--skip-unrecognized", + "skip_unrecognised", + # FIXME: test if mutex is applied. + is_flag=True, + hidden=True, +) +@click.option( + "--skip-existing", + is_flag=True, + help=_("Skip files that already contain REUSE information."), +) +@click.argument( + "paths", + metavar=_("PATH"), + type=click.Path(exists=True, writable=True, path_type=Path), + nargs=-1, +) +@click.pass_obj +def annotate( + obj: ClickObj, + copyrights: Sequence[str], + licenses: Sequence[Expression], + contributors: Sequence[str], + years: Sequence[str], + style: Optional[str], + copyright_prefix: Optional[str], + template_str: Optional[str], + exclude_year: bool, + merge_copyrights: bool, + single_line: bool, + multi_line: bool, + recursive: bool, + no_replace: bool, + force_dot_license: bool, + fallback_dot_license: bool, + skip_unrecognised: bool, + skip_existing: bool, + paths: Sequence[Path], +) -> None: + project = cast(Project, obj.project) + + test_mandatory_option_required(copyrights, licenses, contributors) + paths = all_paths(paths, recursive, project) + verify_paths_comment_style( + style, fallback_dot_license, skip_unrecognised, force_dot_license, paths + ) + # Verify line handling and comment styles before proceeding. + verify_paths_line_handling(single_line, multi_line, style, paths) + template, commented = get_template(template_str, project) + year = get_year(years, exclude_year) + reuse_info = get_reuse_info( + copyrights, licenses, contributors, copyright_prefix, year + ) + + result = 0 + for path in paths: + binary = is_binary(str(path)) + if binary or _is_uncommentable(path) or force_dot_license: + new_path = _determine_license_suffix_path(path) + if binary: + _LOGGER.info( + _( + "'{path}' is a binary, therefore using '{new_path}'" + " for the header" + ).format(path=path, new_path=new_path) + ) + path = Path(new_path) + path.touch() + result += add_header_to_file( + path=path, + reuse_info=reuse_info, + template=template, + template_is_commented=commented, + style=style, + force_multi=multi_line, + skip_existing=skip_existing, + skip_unrecognised=skip_unrecognised, + fallback_dot_license=fallback_dot_license, + merge_copyrights=merge_copyrights, + replace=not no_replace, + out=sys.stdout, + ) + + sys.exit(min(result, 1)) diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index dd0a776ed..7840dd1f1 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -8,7 +8,10 @@ from typing import Any, Mapping, Optional import click +from boolean.boolean import Expression, ParseError +from license_expression import ExpressionError +from .._util import _LICENSING from ..i18n import _ from ..project import Project @@ -57,3 +60,13 @@ def handle_parse_result( ) ) return super().handle_parse_result(ctx, opts, args) + + +def spdx_identifier(text: str) -> Expression: + """factory for creating SPDX expressions.""" + try: + return _LICENSING.parse(text) + except (ExpressionError, ParseError) as error: + raise click.UsageError( + _("'{}' is not a valid SPDX expression.").format(text) + ) from error diff --git a/tests/test_cli_annotate.py b/tests/test_cli_annotate.py new file mode 100644 index 000000000..331b53cd1 --- /dev/null +++ b/tests/test_cli_annotate.py @@ -0,0 +1,1767 @@ +# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2019 Stefan Bakker +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2023 Maxim Cournoyer +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for annotate.""" + +import stat +from inspect import cleandoc + +import pytest +from click.testing import CliRunner + +from reuse._util import _COPYRIGHT_PREFIXES +from reuse.cli.main import main + +# pylint: disable=too-many-public-methods,too-many-lines,unused-argument + + +# REUSE-IgnoreStart + + +class TestAnnotate: + """Tests for annotate.""" + + # TODO: Replace this test with a monkeypatched test + def test_simple(self, fake_repository, mock_date_today): + """Add a header to a file that does not have one.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_simple_scheme(self, fake_repository, mock_date_today): + "Add a header to a Scheme file." + simple_file = fake_repository / "foo.scm" + simple_file.write_text("#t") + expected = cleandoc( + """ + ;;; SPDX-FileCopyrightText: 2018 Jane Doe + ;;; + ;;; SPDX-License-Identifier: GPL-3.0-or-later + + #t + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.scm", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_scheme_standardised(self, fake_repository, mock_date_today): + """The comment block is rewritten/standardised.""" + simple_file = fake_repository / "foo.scm" + simple_file.write_text( + cleandoc( + """ + ; SPDX-FileCopyrightText: 2018 Jane Doe + ; + ; SPDX-License-Identifier: GPL-3.0-or-later + + #t + """ + ) + ) + expected = cleandoc( + """ + ;;; SPDX-FileCopyrightText: 2018 Jane Doe + ;;; + ;;; SPDX-License-Identifier: GPL-3.0-or-later + + #t + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.scm", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_scheme_standardised2(self, fake_repository, mock_date_today): + """The comment block is rewritten/standardised.""" + simple_file = fake_repository / "foo.scm" + simple_file.write_text( + cleandoc( + """ + ;; SPDX-FileCopyrightText: 2018 Jane Doe + ;; + ;; SPDX-License-Identifier: GPL-3.0-or-later + + #t + """ + ) + ) + expected = cleandoc( + """ + ;;; SPDX-FileCopyrightText: 2018 Jane Doe + ;;; + ;;; SPDX-License-Identifier: GPL-3.0-or-later + + #t + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.scm", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_directory_argument(self, fake_repository): + """Directory arguments are ignored.""" + result = CliRunner().invoke( + main, ["annotate", "--copyright", "Jane Doe", "src"] + ) + + assert result.exit_code == 0 + assert result.output == "" + assert (fake_repository / "src").is_dir() + + def test_simple_no_replace(self, fake_repository, mock_date_today): + """Add a header to a file without replacing the existing header.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text( + cleandoc( + """ + # SPDX-FileCopyrightText: 2017 John Doe + # + # SPDX-License-Identifier: MIT + + pass + """ + ) + ) + expected = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + # SPDX-FileCopyrightText: 2017 John Doe + # + # SPDX-License-Identifier: MIT + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--no-replace", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_year(self, fake_repository): + """Add a header to a file with a custom year.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + # SPDX-FileCopyrightText: 2016 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2016", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_no_year(self, fake_repository): + """Add a header to a file without a year.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + # SPDX-FileCopyrightText: Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--exclude-year", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + @pytest.mark.parametrize( + "copyright_prefix", ["--copyright-prefix", "--copyright-style"] + ) + def test_copyright_prefix( + self, fake_repository, copyright_prefix, mock_date_today + ): + """Add a header with a specific copyright prefix. Also test the old name + of the parameter. + """ + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + # Copyright 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + copyright_prefix, + "string", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_shebang(self, fake_repository): + """Keep the shebang when annotating.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text( + cleandoc( + """ + #!/usr/bin/env python3 + + pass + """ + ) + ) + expected = cleandoc( + """ + #!/usr/bin/env python3 + + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_shebang_wrong_comment_style(self, fake_repository): + """If a comment style does not support the shebang at the top, don't + treat the shebang as special. + """ + simple_file = fake_repository / "foo.html" + simple_file.write_text( + cleandoc( + """ + #!/usr/bin/env python3 + + pass + """ + ) + ) + expected = cleandoc( + """ + + + #!/usr/bin/env python3 + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "foo.html", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_contributors_only( + self, fake_repository, mock_date_today, contributors + ): + """Add a header with only contributor information.""" + + if not contributors: + pytest.skip("No contributors to add") + + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + content = [] + + for contributor in sorted(contributors): + content.append(f"# SPDX-FileContributor: {contributor}") + + content += ["", "pass"] + expected = cleandoc("\n".join(content)) + + args = [ + "annotate", + ] + for contributor in contributors: + args += ["--contributor", contributor] + args += ["foo.py"] + + result = CliRunner().invoke( + main, + args, + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_contributors(self, fake_repository, mock_date_today, contributors): + """Add a header with contributor information.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + content = ["# SPDX-FileCopyrightText: 2018 Jane Doe"] + + if contributors: + for contributor in sorted(contributors): + content.append(f"# SPDX-FileContributor: {contributor}") + + content += [ + "#", + "# SPDX-License-Identifier: GPL-3.0-or-later", + "", + "pass", + ] + expected = cleandoc("\n".join(content)) + + args = [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + ] + for contributor in contributors: + args += ["--contributor", contributor] + args += ["foo.py"] + + result = CliRunner().invoke( + main, + args, + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_specify_style(self, fake_repository, mock_date_today): + """Add header to a file that does not have one, using a custom style.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + // SPDX-FileCopyrightText: 2018 Jane Doe + // + // SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--style", + "cpp", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_specify_style_unrecognised(self, fake_repository, mock_date_today): + """Add a header to a file that is unrecognised.""" + + simple_file = fake_repository / "hello.foo" + simple_file.touch() + expected = "# SPDX-FileCopyrightText: 2018 Jane Doe" + + result = CliRunner().invoke( + main, + [ + "annotate", + "--copyright", + "Jane Doe", + "--style", + "python", + "hello.foo", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text().strip() == expected + + def test_implicit_style(self, fake_repository, mock_date_today): + """Add a header to a file that has a recognised extension.""" + simple_file = fake_repository / "foo.js" + simple_file.write_text("pass") + expected = cleandoc( + """ + // SPDX-FileCopyrightText: 2018 Jane Doe + // + // SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.js", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_implicit_style_filename(self, fake_repository, mock_date_today): + """Add a header to a filename that is recognised.""" + simple_file = fake_repository / "Makefile" + simple_file.write_text("pass") + expected = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "Makefile", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_unrecognised_style(self, fake_repository): + """Add a header to a file that has an unrecognised extension.""" + simple_file = fake_repository / "foo.foo" + simple_file.write_text("pass") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.foo", + ], + ) + + assert result.exit_code != 0 + assert ( + "The following files do not have a recognised file extension" + in result.output + ) + assert "foo.foo" in result.output + + @pytest.mark.parametrize( + "skip_unrecognised", ["--skip-unrecognised", "--skip-unrecognized"] + ) + def test_skip_unrecognised(self, fake_repository, skip_unrecognised): + """Skip file that has an unrecognised extension.""" + simple_file = fake_repository / "foo.foo" + simple_file.write_text("pass") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + skip_unrecognised, + "foo.foo", + ], + ) + + assert result.exit_code == 0 + assert "Skipped unrecognised file 'foo.foo'" in result.output + + def test_skip_unrecognised_and_style_mutex(self, fake_repository): + """--skip-unrecognised and --style are mutually exclusive.""" + simple_file = fake_repository / "foo.foo" + simple_file.write_text("pass") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--style=c", + "--skip-unrecognised", + "foo.foo", + ], + ) + + assert result.exit_code != 0 + assert "mutually exclusive with" in result.output + + def test_no_data_to_add(self, fake_repository): + """Add a header, but supply no copyright, license, or contributor.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + + result = CliRunner().invoke(main, ["annotate", "foo.py"]) + + assert result.exit_code != 0 + assert ( + "Option '--copyright', '--license', or '--contributor' is required" + in result.output + ) + + def test_template_simple( + self, fake_repository, mock_date_today, template_simple_source + ): + """Add a header with a custom template.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" + template_file.parent.mkdir(parents=True, exist_ok=True) + template_file.write_text(template_simple_source) + expected = cleandoc( + """ + # Hello, world! + # + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate.jinja2", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_template_simple_multiple( + self, fake_repository, mock_date_today, template_simple_source + ): + """Add a header with a custom template to multiple files.""" + simple_files = [fake_repository / f"foo{i}.py" for i in range(10)] + for simple_file in simple_files: + simple_file.write_text("pass") + template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" + template_file.parent.mkdir(parents=True, exist_ok=True) + template_file.write_text(template_simple_source) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate.jinja2", + ] + + list(map(str, simple_files)), + ) + + assert result.exit_code == 0 + for simple_file in simple_files: + expected = cleandoc( + """ + # Hello, world! + # + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + assert simple_file.read_text() == expected + + def test_template_no_spdx(self, fake_repository, template_no_spdx_source): + """Add a header with a template that lacks REUSE info.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" + template_file.parent.mkdir(parents=True, exist_ok=True) + template_file.write_text(template_no_spdx_source) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate.jinja2", + "foo.py", + ], + ) + + assert result.exit_code == 1 + + def test_template_commented( + self, fake_repository, mock_date_today, template_commented_source + ): + """Add a header with a custom template that is already commented.""" + simple_file = fake_repository / "foo.c" + simple_file.write_text("pass") + template_file = ( + fake_repository / ".reuse/templates/mytemplate.commented.jinja2" + ) + template_file.parent.mkdir(parents=True, exist_ok=True) + template_file.write_text(template_commented_source) + expected = cleandoc( + """ + # Hello, world! + # + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate.commented.jinja2", + "foo.c", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_template_nonexistant(self, fake_repository): + """Raise an error when using a header that does not exist.""" + + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate.jinja2", + "foo.py", + ], + ) + + assert result.exit_code != 0 + assert ( + "Template 'mytemplate.jinja2' could not be found" in result.output + ) + + def test_template_without_extension( + self, fake_repository, mock_date_today, template_simple_source + ): + """Find the correct header even when not using an extension.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" + template_file.parent.mkdir(parents=True, exist_ok=True) + template_file.write_text(template_simple_source) + expected = cleandoc( + """ + # Hello, world! + # + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--template", + "mytemplate", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + def test_binary(self, fake_repository, mock_date_today, binary_string): + """Add a header to a .license file if the file is a binary.""" + binary_file = fake_repository / "foo.png" + binary_file.write_bytes(binary_string) + expected = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.png", + ], + ) + + assert result.exit_code == 0 + assert ( + binary_file.with_name(f"{binary_file.name}.license") + .read_text() + .strip() + == expected + ) + + def test_uncommentable_json(self, fake_repository, mock_date_today): + """Add a header to a .license file if the file is uncommentable, e.g., + JSON. + """ + json_file = fake_repository / "foo.json" + json_file.write_text('{"foo": 23, "bar": 42}') + expected = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.json", + ], + ) + + assert result.exit_code == 0 + assert ( + json_file.with_name(f"{json_file.name}.license").read_text().strip() + == expected + ) + + def test_fallback_dot_license(self, fake_repository, mock_date_today): + """Add a header to .license if --fallback-dot-license is given, and no + style yet exists. + """ + (fake_repository / "foo.py").write_text("Foo") + (fake_repository / "foo.foo").write_text("Foo") + + expected_py = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + expected_foo = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--fallback-dot-license", + "foo.py", + "foo.foo", + ], + ) + + assert result.exit_code == 0 + assert expected_py in (fake_repository / "foo.py").read_text() + assert (fake_repository / "foo.foo.license").exists() + assert ( + fake_repository / "foo.foo.license" + ).read_text().strip() == expected_foo + assert ( + "'foo.foo' is not recognised; creating 'foo.foo.license'" + in result.output + ) + + def test_force_dot_license(self, fake_repository, mock_date_today): + """Add a header to a .license file if --force-dot-license is given.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--force-dot-license", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert ( + simple_file.with_name(f"{simple_file.name}.license") + .read_text() + .strip() + == expected + ) + assert simple_file.read_text() == "pass" + + def test_force_dot_license_double(self, fake_repository, mock_date_today): + """If path.license already exists, don't create path.license.license.""" + simple_file = fake_repository / "foo.txt" + simple_file_license = fake_repository / "foo.txt.license" + simple_file_license_license = ( + fake_repository / "foo.txt.license.license" + ) + + simple_file.write_text("foo") + simple_file_license.write_text("foo") + expected = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--force-dot-license", + "foo.txt", + ], + ) + + assert result.exit_code == 0 + assert not simple_file_license_license.exists() + assert simple_file_license.read_text().strip() == expected + + def test_force_dot_license_unsupported_filetype( + self, fake_repository, mock_date_today + ): + """Add a header to a .license file if --force-dot-license is given, with + the base file being an otherwise unsupported filetype. + """ + simple_file = fake_repository / "foo.txt" + simple_file.write_text("Preserve this") + expected = cleandoc( + """ + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--force-dot-license", + "foo.txt", + ], + ) + + assert result.exit_code == 0 + assert ( + simple_file.with_name(f"{simple_file.name}.license") + .read_text() + .strip() + == expected + ) + assert simple_file.read_text() == "Preserve this" + + def test_to_read_only_file_forbidden( + self, fake_repository, mock_date_today + ): + """Cannot add a header without having write permission.""" + _file = fake_repository / "test.sh" + _file.write_text("#!/bin/sh") + _file.chmod(mode=stat.S_IREAD) + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "Apache-2.0", + "--copyright", + "mycorp", + "--style", + "python", + "test.sh", + ], + ) + + assert result.exit_code != 0 + assert "'test.sh' is not writable." in result.output + + def test_license_file(self, fake_repository, mock_date_today): + """Add a header to a .license file if it exists.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("foo") + license_file = fake_repository / "foo.py.license" + license_file.write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2016 John Doe + + Hello + """ + ) + ) + expected = ( + cleandoc( + """ + SPDX-FileCopyrightText: 2016 John Doe + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + "\n" + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert license_file.read_text() == expected + assert simple_file.read_text() == "foo" + + def test_license_file_only_one_newline( + self, fake_repository, mock_date_today + ): + """When a header is added to a .license file that already ends with a + newline, the new header should end with a single newline. + """ + simple_file = fake_repository / "foo.py" + simple_file.write_text("foo") + license_file = fake_repository / "foo.py.license" + license_file.write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2016 John Doe + + Hello + """ + ) + + "\n" + ) + expected = ( + cleandoc( + """ + SPDX-FileCopyrightText: 2016 John Doe + SPDX-FileCopyrightText: 2018 Jane Doe + + SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + "\n" + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert license_file.read_text() == expected + assert simple_file.read_text() == "foo" + + def test_year_mutually_exclusive(self, fake_repository): + """--exclude-year and --year are mutually exclusive.""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--exclude-year", + "--year", + "2020", + "src/source_code.py", + ], + ) + + assert result.exit_code != 0 + assert "is mutually exclusive with" in result.output + + def test_single_multi_line_mutually_exclusive(self, fake_repository): + """--single-line and --multi-line are mutually exclusive.""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--single-line", + "--multi-line", + "src/source_code.c", + ], + ) + + assert result.exit_code != 0 + assert "is mutually exclusive with" in result.output + + def test_skip_force_mutually_exclusive(self, fake_repository): + """--skip-unrecognised and --force-dot-license are mutually exclusive""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--force-dot-license", + "--skip-unrecognised", + "src/source_code.py", + ], + ) + + assert result.exit_code != 0 + assert "is mutually exclusive with" in result.output + + def test_multi_line_not_supported(self, fake_repository): + """Expect a fail if --multi-line is not supported for a file type.""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--multi-line", + "src/source_code.py", + ], + ) + + assert result.exit_code != 0 + assert ( + "'src/source_code.py' does not support multi-line comments" + in result.output + ) + + def test_multi_line_not_supported_custom_style(self, fake_repository): + """--multi-line also fails when used with a style that doesn't support + it through --style. + """ + (fake_repository / "foo.foo").write_text("foo") + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--multi-line", + "--force-dot-license", + "--style", + "python", + "foo.foo", + ], + ) + + assert result.exit_code != 0 + assert "'foo.foo' does not support multi-line" in result.output + + def test_single_line_not_supported(self, fake_repository): + """Expect a fail if --single-line is not supported for a file type.""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--single-line", + "src/source_code.html", + ], + ) + + assert result.exit_code != 0 + assert ( + "'src/source_code.html' does not support single-line comments" + in result.output + ) + + def test_force_multi_line_for_c(self, fake_repository, mock_date_today): + """--multi-line forces a multi-line comment for C.""" + simple_file = fake_repository / "foo.c" + simple_file.write_text("foo") + expected = cleandoc( + """ + /* + * SPDX-FileCopyrightText: 2018 Jane Doe + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + + foo + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--multi-line", + "foo.c", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == expected + + @pytest.mark.parametrize("line_ending", ["\r\n", "\r", "\n"]) + def test_line_endings(self, empty_directory, mock_date_today, line_ending): + """Given a file with a certain type of line ending, preserve it.""" + simple_file = empty_directory / "foo.py" + simple_file.write_bytes( + line_ending.encode("utf-8").join([b"hello", b"world"]) + ) + expected = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + hello + world + """ + ).replace("\n", line_ending) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + assert result.exit_code == 0 + with open(simple_file, newline="", encoding="utf-8") as fp: + contents = fp.read() + + assert contents == expected + + def test_skip_existing(self, fake_repository, mock_date_today): + """When annotate --skip-existing on a file that already contains REUSE + info, don't write additional information to it. + """ + for path in ("foo.py", "bar.py"): + (fake_repository / path).write_text("pass") + expected_foo = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + expected_bar = cleandoc( + """ + # SPDX-FileCopyrightText: 2018 John Doe + # + # SPDX-License-Identifier: MIT + + pass + """ + ) + + CliRunner().invoke( + main, + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "foo.py", + ], + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "MIT", + "--copyright", + "John Doe", + "--skip-existing", + "foo.py", + "bar.py", + ], + ) + + assert result.exit_code == 0 + assert (fake_repository / "foo.py").read_text() == expected_foo + assert (fake_repository / "bar.py").read_text() == expected_bar + + def test_recursive(self, fake_repository, mock_date_today): + """Add a header to a directory recursively.""" + (fake_repository / "src/one/two").mkdir(parents=True) + (fake_repository / "src/one/two/foo.py").write_text( + cleandoc( + """ + # SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + ) + (fake_repository / "src/hello.py").touch() + (fake_repository / "src/one/world.py").touch() + (fake_repository / "bar").mkdir(parents=True) + (fake_repository / "bar/bar.py").touch() + + result = CliRunner().invoke( + main, + [ + "annotate", + "--copyright", + "Joe Somebody", + "--recursive", + "src/", + ], + ) + + for path in (fake_repository / "src").rglob("src/**"): + content = path.read_text() + assert "SPDX-FileCopyrightText: 2018 Joe Somebody" in content + + assert ( + "Joe Somebody" not in (fake_repository / "bar/bar.py").read_text() + ) + assert result.exit_code == 0 + + def test_recursive_on_file(self, fake_repository, mock_date_today): + """Don't expect errors when annotate is run 'recursively' on a file.""" + result = CliRunner().invoke( + main, + [ + "annotate", + "--copyright", + "Joe Somebody", + "--recursive", + "src/source_code.py", + ], + ) + + assert ( + "Joe Somebody" + in (fake_repository / "src/source_code.py").read_text() + ) + assert result.exit_code == 0 + + def test_exit_if_unrecognised(self, fake_repository, mock_date_today): + """Expect error and no edited files if at least one file has not been + recognised, with --exit-if-unrecognised enabled.""" + (fake_repository / "baz").mkdir(parents=True) + (fake_repository / "baz/foo.py").write_text("foo") + (fake_repository / "baz/bar.unknown").write_text("bar") + (fake_repository / "baz/baz.sh").write_text("baz") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--license", + "Apache-2.0", + "--copyright", + "Jane Doe", + "--recursive", + "baz/", + ], + ) + + assert result.exit_code != 0 + assert ( + "The following files do not have a recognised file extension" + in result.output + ) + assert "baz/bar.unknown" in result.output + assert "foo.py" not in result.output + assert "Jane Doe" not in (fake_repository / "baz/foo.py").read_text() + + +class TestAnnotateMerge: + """Test merging copyright statements.""" + + def test_simple(self, fake_repository): + """Add multiple headers to a file with merge copyrights.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2016", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Mary Sue", + "--merge-copyrights", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == cleandoc( + """ + # SPDX-FileCopyrightText: 2016 Mary Sue + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2018", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Mary Sue", + "--merge-copyrights", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == cleandoc( + """ + # SPDX-FileCopyrightText: 2016 - 2018 Mary Sue + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + def test_multi_prefix(self, fake_repository): + """Add multiple headers to a file with merge copyrights.""" + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + + for i in range(0, 3): + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + str(2010 + i), + "--license", + "GPL-3.0-or-later", + "--copyright", + "Mary Sue", + "foo.py", + ], + ) + + assert result.exit_code == 0 + + for i in range(0, 5): + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + str(2015 + i), + "--license", + "GPL-3.0-or-later", + "--copyright-prefix", + "string-c", + "--copyright", + "Mary Sue", + "foo.py", + ], + ) + + assert result.exit_code == 0 + + assert simple_file.read_text() == cleandoc( + """ + # Copyright (C) 2015 Mary Sue + # Copyright (C) 2016 Mary Sue + # Copyright (C) 2017 Mary Sue + # Copyright (C) 2018 Mary Sue + # Copyright (C) 2019 Mary Sue + # SPDX-FileCopyrightText: 2010 Mary Sue + # SPDX-FileCopyrightText: 2011 Mary Sue + # SPDX-FileCopyrightText: 2012 Mary Sue + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2018", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Mary Sue", + "--merge-copyrights", + "foo.py", + ], + ) + + assert result.exit_code == 0 + assert simple_file.read_text() == cleandoc( + """ + # Copyright (C) 2010 - 2019 Mary Sue + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + def test_no_year_in_existing(self, fake_repository, mock_date_today): + """This checks the issue reported in + . If an existing + copyright line doesn't have a year, everything should still work. + """ + (fake_repository / "foo.py").write_text( + cleandoc( + """ + # SPDX-FileCopyrightText: Jane Doe + """ + ) + ) + CliRunner().invoke( + main, + [ + "annotate", + "--merge-copyrights", + "--copyright", + "John Doe", + "foo.py", + ], + ) + assert ( + cleandoc( + """ + # SPDX-FileCopyrightText: 2018 John Doe + # SPDX-FileCopyrightText: Jane Doe + """ + ) + in (fake_repository / "foo.py").read_text() + ) + + def test_all_prefixes(self, fake_repository, mock_date_today): + """Test that merging works for all copyright prefixes.""" + # TODO: there should probably also be a test for mixing copyright + # prefixes, but this behaviour is really unpredictable to me at the + # moment, and the whole copyright-line-as-string thing needs + # overhauling. + simple_file = fake_repository / "foo.py" + for copyright_prefix, copyright_string in _COPYRIGHT_PREFIXES.items(): + simple_file.write_text("pass") + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2016", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--copyright-style", + copyright_prefix, + "--merge-copyrights", + "foo.py", + ], + ) + assert result.exit_code == 0 + assert simple_file.read_text(encoding="utf-8") == cleandoc( + f""" + # {copyright_string} 2016 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = CliRunner().invoke( + main, + [ + "annotate", + "--year", + "2018", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + "--copyright-style", + copyright_prefix, + "--merge-copyrights", + "foo.py", + ], + ) + assert result.exit_code == 0 + assert simple_file.read_text(encoding="utf-8") == cleandoc( + f""" + # {copyright_string} 2016 - 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + +# REUSE-IgnoreEnd From dd744c098901fe2d8a278cf7d4cc7cc34933d962 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 10:21:40 +0200 Subject: [PATCH 075/156] Remove argparse code Signed-off-by: Carmen Bianca BAKKER --- pyproject.toml | 3 +- src/reuse/_annotate.py | 383 +------ src/reuse/_format.py | 50 - src/reuse/_lint_file.py | 63 -- src/reuse/_main.py | 327 ------ src/reuse/_util.py | 118 +-- src/reuse/convert_dep5.py | 29 +- src/reuse/download.py | 112 +- src/reuse/lint.py | 46 +- src/reuse/spdx.py | 94 -- src/reuse/supported_licenses.py | 35 - tests/test_main.py | 700 ------------- tests/test_main_annotate.py | 1577 ----------------------------- tests/test_main_annotate_merge.py | 260 ----- tests/test_util.py | 151 --- 15 files changed, 8 insertions(+), 3940 deletions(-) delete mode 100644 src/reuse/_format.py delete mode 100644 src/reuse/_lint_file.py delete mode 100644 src/reuse/_main.py delete mode 100644 src/reuse/spdx.py delete mode 100644 src/reuse/supported_licenses.py delete mode 100644 tests/test_main.py delete mode 100644 tests/test_main_annotate.py delete mode 100644 tests/test_main_annotate_merge.py diff --git a/pyproject.toml b/pyproject.toml index bd9292f50..86c681dd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,8 +99,7 @@ pyls-isort = "*" python-lsp-black = "*" [tool.poetry.scripts] -reuse = 'reuse._main:main' -reuse2 = "reuse.cli.main:main" +reuse = "reuse.cli.main:main" [tool.poetry.build] generate-setup-file = false diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index 40daec635..a2644c95a 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -15,33 +15,21 @@ """Functions for the CLI portion of manipulating headers.""" -import datetime import logging -import os import sys -from argparse import SUPPRESS, ArgumentParser, Namespace from gettext import gettext as _ -from pathlib import Path -from typing import IO, Iterable, Optional, Type, cast +from typing import IO, Optional, Type, cast -from binaryornot.check import is_binary from jinja2 import Environment, FileSystemLoader, Template from jinja2.exceptions import TemplateNotFound from . import ReuseInfo from ._util import ( - _COPYRIGHT_PREFIXES, - PathType, StrPath, - _determine_license_path, _determine_license_suffix_path, _get_comment_style, - _has_style, - _is_uncommentable, contains_reuse_info, detect_line_endings, - make_copyright_line, - spdx_identifier, ) from .comment import ( NAME_STYLE_MAP, @@ -55,35 +43,6 @@ _LOGGER = logging.getLogger(__name__) -def verify_paths_line_handling( - args: Namespace, - paths: Iterable[Path], -) -> None: - """This function aborts the parser when --single-line or --multi-line is - used, but the file type does not support that type of comment style. - """ - for path in paths: - style = NAME_STYLE_MAP.get(args.style) - if style is None: - style = _get_comment_style(path) - if style is None: - continue - if args.single_line and not style.can_handle_single(): - args.parser.error( - _( - "'{path}' does not support single-line comments, please" - " do not use --single-line" - ).format(path=path) - ) - if args.multi_line and not style.can_handle_multi(): - args.parser.error( - _( - "'{path}' does not support multi-line comments, please" - " do not use --multi-line" - ).format(path=path) - ) - - def find_template(project: Project, name: str) -> Template: """Find a template given a name. @@ -211,343 +170,3 @@ def add_header_to_file( out.write("\n") return result - - -def style_and_unrecognised_warning(args: Namespace) -> None: - """Log a warning if --style is used together with --skip-unrecognised.""" - if args.style is not None and args.skip_unrecognised: - _LOGGER.warning( - _( - "--skip-unrecognised has no effect when used together with" - " --style" - ) - ) - - -def test_mandatory_option_required(args: Namespace) -> None: - """Raise a parser error if one of the mandatory options is not provided.""" - if not any((args.contributor, args.copyright, args.license)): - args.parser.error( - _("option --contributor, --copyright or --license is required") - ) - - -def all_paths(args: Namespace, project: Project) -> set[Path]: - """Return a set of all provided paths, converted into .license paths if they - exist. If recursive is enabled, all files belonging to *project* are also - added. - """ - if args.recursive: - paths: set[Path] = set() - all_files = [path.resolve() for path in project.all_files()] - for path in args.path: - if path.is_file(): - paths.add(path) - else: - paths |= { - child - for child in all_files - if path.resolve() in child.parents - } - else: - paths = args.path - return {_determine_license_path(path) for path in paths} - - -def get_template( - args: Namespace, project: Project -) -> tuple[Optional[Template], bool]: - """If a template is specified on the CLI, find and return it, including - whether it is a 'commented' template. - - If no template is specified, just return None. - """ - template: Optional[Template] = None - commented = False - if args.template: - try: - template = cast(Template, find_template(project, args.template)) - except TemplateNotFound: - args.parser.error( - _("template {template} could not be found").format( - template=args.template - ) - ) - # This code is never reached, but mypy is not aware that - # parser.error quits the program. - raise - - if ".commented" in Path(cast(str, template.name)).suffixes: - commented = True - return template, commented - - -def get_year(args: Namespace) -> Optional[str]: - """Get the year. Normally it is today's year. If --year is specified once, - get that one. If it is specified twice (or more), return the range between - the two. - - If --exclude-year is specified, return None. - """ - year = None - if not args.exclude_year: - if args.year and len(args.year) > 1: - year = f"{min(args.year)} - {max(args.year)}" - elif args.year: - year = args.year[0] - else: - year = str(datetime.date.today().year) - return year - - -def get_reuse_info(args: Namespace, year: Optional[str]) -> ReuseInfo: - """Create a ReuseInfo object from --license, --copyright, and - --contributor. - """ - expressions = set(args.license) if args.license is not None else set() - copyright_prefix = ( - args.copyright_prefix if args.copyright_prefix is not None else "spdx" - ) - copyright_lines = ( - { - make_copyright_line( - item, year=year, copyright_prefix=copyright_prefix - ) - for item in args.copyright - } - if args.copyright is not None - else set() - ) - contributors = ( - set(args.contributor) if args.contributor is not None else set() - ) - - return ReuseInfo( - spdx_expressions=expressions, - copyright_lines=copyright_lines, - contributor_lines=contributors, - ) - - -def verify_write_access( - paths: Iterable[StrPath], parser: ArgumentParser -) -> None: - """Raise a parser.error if one of the paths is not writable.""" - not_writeable = [ - str(path) for path in paths if not os.access(path, os.W_OK) - ] - if not_writeable: - parser.error( - _("can't write to '{}'").format("', '".join(not_writeable)) - ) - - -def verify_paths_comment_style(args: Namespace, paths: Iterable[Path]) -> None: - """Exit if --style, --force-dot-license, --fallback-dot-license, - or --skip-unrecognised is not enabled and one of the paths has an - unrecognised style. - """ - if ( - not args.style - and not args.fallback_dot_license - and not args.skip_unrecognised - and not args.force_dot_license - ): - unrecognised_files = [] - - for path in paths: - if not _has_style(path): - unrecognised_files.append(path) - - if unrecognised_files: - args.parser.error( - "{}\n\n{}".format( - _( - "The following files do not have a recognised file" - " extension. Please use --style, --force-dot-license," - " --fallback-dot-license, or --skip-unrecognised:" - ), - "\n".join(str(path) for path in unrecognised_files), - ) - ) - - -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - parser.add_argument( - "--copyright", - "-c", - action="append", - type=str, - help=_("copyright statement, repeatable"), - ) - parser.add_argument( - "--license", - "-l", - action="append", - type=spdx_identifier, - help=_("SPDX Identifier, repeatable"), - ) - parser.add_argument( - "--contributor", - action="append", - type=str, - help=_("file contributor, repeatable"), - ) - year_mutex_group = parser.add_mutually_exclusive_group() - year_mutex_group.add_argument( - "--year", - "-y", - action="append", - type=str, - help=_("year of copyright statement, optional"), - ) - parser.add_argument( - "--style", - "-s", - action="store", - type=str, - choices=list(NAME_STYLE_MAP), - help=_("comment style to use, optional"), - ) - parser.add_argument( - "--copyright-prefix", - action="store", - choices=list(_COPYRIGHT_PREFIXES.keys()), - help=_("copyright prefix to use, optional"), - ) - parser.add_argument( - "--copyright-style", - action="store", - dest="copyright_prefix", - help=SUPPRESS, - ) - parser.add_argument( - "--template", - "-t", - action="store", - type=str, - help=_("name of template to use, optional"), - ) - year_mutex_group.add_argument( - "--exclude-year", - action="store_true", - help=_("do not include year in statement"), - ) - parser.add_argument( - "--merge-copyrights", - action="store_true", - help=_("merge copyright lines if copyright statements are identical"), - ) - line_mutex_group = parser.add_mutually_exclusive_group() - line_mutex_group.add_argument( - "--single-line", - action="store_true", - help=_("force single-line comment style, optional"), - ) - line_mutex_group.add_argument( - "--multi-line", - action="store_true", - help=_("force multi-line comment style, optional"), - ) - parser.add_argument( - "--recursive", - "-r", - action="store_true", - help=_( - "add headers to all files under specified directories recursively" - ), - ) - parser.add_argument( - "--no-replace", - action="store_true", - help=_( - "do not replace the first header in the file; just add a new one" - ), - ) - style_mutex_group = parser.add_mutually_exclusive_group() - style_mutex_group.add_argument( - "--force-dot-license", - action="store_true", - help=_( - "always write a .license file instead of a header inside the file" - ), - ) - style_mutex_group.add_argument( - "--fallback-dot-license", - action="store_true", - help=_( - "write a .license file to files with unrecognised comment styles" - ), - ) - style_mutex_group.add_argument( - "--skip-unrecognised", - action="store_true", - help=_("skip files with unrecognised comment styles"), - ) - style_mutex_group.add_argument( - "--skip-unrecognized", - dest="skip_unrecognised", - action="store_true", - help=SUPPRESS, - ) - parser.add_argument( - "--skip-existing", - action="store_true", - help=_("skip files that already contain REUSE information"), - ) - parser.add_argument("path", action="store", nargs="+", type=PathType("r")) - - -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """Add headers to files.""" - test_mandatory_option_required(args) - - style_and_unrecognised_warning(args) - - paths = all_paths(args, project) - - verify_paths_comment_style(args, paths) - - if not args.force_dot_license: - verify_write_access(paths, args.parser) - - # Verify line handling and comment styles before proceeding - verify_paths_line_handling(args, paths) - - template, commented = get_template(args, project) - - year = get_year(args) - - reuse_info = get_reuse_info(args, year) - - result = 0 - for path in paths: - binary = is_binary(str(path)) - if binary or _is_uncommentable(path) or args.force_dot_license: - new_path = _determine_license_suffix_path(path) - if binary: - _LOGGER.info( - _( - "'{path}' is a binary, therefore using '{new_path}'" - " for the header" - ).format(path=path, new_path=new_path) - ) - path = Path(new_path) - path.touch() - result += add_header_to_file( - path=path, - reuse_info=reuse_info, - template=template, - template_is_commented=commented, - style=args.style, - force_multi=args.multi_line, - skip_existing=args.skip_existing, - skip_unrecognised=args.skip_unrecognised, - fallback_dot_license=args.fallback_dot_license, - merge_copyrights=args.merge_copyrights, - replace=not args.no_replace, - out=out, - ) - - return min(result, 1) diff --git a/src/reuse/_format.py b/src/reuse/_format.py deleted file mode 100644 index afc8bc3d8..000000000 --- a/src/reuse/_format.py +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Formatting functions primarily for the CLI.""" - -from textwrap import fill, indent -from typing import Iterator - -WIDTH = 78 -INDENT = 2 - - -def fill_paragraph(text: str, width: int = WIDTH, indent_width: int = 0) -> str: - """Wrap a single paragraph.""" - return indent( - fill(text.strip(), width=width - indent_width), indent_width * " " - ) - - -def fill_all(text: str, width: int = WIDTH, indent_width: int = 0) -> str: - """Wrap all paragraphs.""" - return "\n\n".join( - fill_paragraph(paragraph, width=width, indent_width=indent_width) - for paragraph in split_into_paragraphs(text) - ) - - -def split_into_paragraphs(text: str) -> Iterator[str]: - """Yield all paragraphs in a text. A paragraph is a piece of text - surrounded by empty lines. - """ - lines = text.splitlines() - paragraph = "" - - for line in lines: - if not line: - if paragraph: - yield paragraph - paragraph = "" - else: - continue - else: - if paragraph: - padding = " " - else: - padding = "" - paragraph = f"{paragraph}{padding}{line}" - if paragraph: - yield paragraph diff --git a/src/reuse/_lint_file.py b/src/reuse/_lint_file.py deleted file mode 100644 index 2c8d53eb3..000000000 --- a/src/reuse/_lint_file.py +++ /dev/null @@ -1,63 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Kerry McAdams -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Linting specific files happens here. The linting here is nothing more than -reading the reports and printing some conclusions. -""" - -import sys -from argparse import ArgumentParser, Namespace -from gettext import gettext as _ -from pathlib import Path -from typing import IO - -from ._util import PathType -from .lint import format_lines_subset -from .project import Project -from .report import ProjectSubsetReport - - -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - mutex_group = parser.add_mutually_exclusive_group() - mutex_group.add_argument( - "-q", "--quiet", action="store_true", help=_("prevents output") - ) - mutex_group.add_argument( - "-l", - "--lines", - action="store_true", - help=_("formats output as errors per line (default)"), - ) - parser.add_argument( - "files", - action="store", - nargs="*", - type=PathType("r"), - help=_("files to lint"), - ) - - -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """List all non-compliant files from specified file list.""" - subset_files = {Path(file_) for file_ in args.files} - for file_ in subset_files: - if not file_.resolve().is_relative_to(project.root.resolve()): - args.parser.error( - _("'{file}' is not inside of '{root}'").format( - file=file_, root=project.root - ) - ) - report = ProjectSubsetReport.generate( - project, - subset_files, - multiprocessing=not args.no_multiprocessing, - ) - - if args.quiet: - pass - else: - out.write(format_lines_subset(report)) - - return 0 if report.is_compliant else 1 diff --git a/src/reuse/_main.py b/src/reuse/_main.py deleted file mode 100644 index 3acfd1cab..000000000 --- a/src/reuse/_main.py +++ /dev/null @@ -1,327 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2022 Florian Snow -# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# SPDX-FileCopyrightText: 2024 Kerry McAdams -# SPDX-FileCopyrightText: 2024 Emil Velikov -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Entry functions for reuse.""" - -import argparse -import contextlib -import logging -import os -import sys -import warnings -from gettext import gettext as _ -from pathlib import Path -from types import ModuleType -from typing import IO, Callable, Optional, Type, cast - -from . import ( - __REUSE_version__, - __version__, - _annotate, - _lint_file, - convert_dep5, - download, - lint, - spdx, - supported_licenses, -) -from ._format import INDENT, fill_all, fill_paragraph -from ._util import PathType, setup_logging -from .global_licensing import GlobalLicensingParseError -from .project import GlobalLicensingConflict, Project -from .vcs import find_root - -shtab: Optional[ModuleType] = None -with contextlib.suppress(ImportError): - import shtab # type: ignore[no-redef,import-not-found] - -_LOGGER = logging.getLogger(__name__) - -_DESCRIPTION_LINES = [ - _( - "reuse is a tool for compliance with the REUSE" - " recommendations. See for more" - " information, and for the online" - " documentation." - ), - _( - "This version of reuse is compatible with version {} of the REUSE" - " Specification." - ).format(__REUSE_version__), - _("Support the FSFE's work:"), -] - -_INDENTED_LINE = _( - "Donations are critical to our strength and autonomy. They enable us to" - " continue working for Free Software wherever necessary. Please consider" - " making a donation at ." -) - -_DESCRIPTION_TEXT = ( - fill_all("\n\n".join(_DESCRIPTION_LINES)) - + "\n\n" - + fill_paragraph(_INDENTED_LINE, indent_width=INDENT) -) - -_EPILOG_TEXT = "" - - -def parser() -> argparse.ArgumentParser: - """Create the parser and return it.""" - # pylint: disable=redefined-outer-name - parser = argparse.ArgumentParser( - formatter_class=argparse.RawTextHelpFormatter, - description=_DESCRIPTION_TEXT, - epilog=_EPILOG_TEXT, - ) - parser.add_argument( - "--debug", action="store_true", help=_("enable debug statements") - ) - parser.add_argument( - "--suppress-deprecation", - action="store_true", - help=_("hide deprecation warnings"), - ) - parser.add_argument( - "--include-submodules", - action="store_true", - help=_("do not skip over Git submodules"), - ) - parser.add_argument( - "--include-meson-subprojects", - action="store_true", - help=_("do not skip over Meson subprojects"), - ) - parser.add_argument( - "--no-multiprocessing", - action="store_true", - help=_("do not use multiprocessing"), - ) - parser.add_argument( - "--root", - action="store", - metavar="PATH", - type=PathType("r", force_directory=True), - help=_("define root of project"), - ) - if shtab: - # This is magic. Running `reuse -s bash` now prints bash completions. - shtab.add_argument_to(parser, ["-s", "--print-completion"]) - parser.add_argument( - "--version", - action="store_true", - help=_("show program's version number and exit"), - ) - parser.set_defaults(func=lambda *args: parser.print_help()) - - subparsers = parser.add_subparsers(title=_("subcommands")) - - add_command( - subparsers, - "annotate", - _annotate.add_arguments, - _annotate.run, - help=_("add copyright and licensing into the header of files"), - description=fill_all( - _( - "Add copyright and licensing into the header of one or more" - " files.\n" - "\n" - "By using --copyright and --license, you can specify which" - " copyright holders and licenses to add to the headers of the" - " given files.\n" - "\n" - "By using --contributor, you can specify people or entity that" - " contributed but are not copyright holder of the given" - " files." - ) - ), - ) - - add_command( - subparsers, - "download", - download.add_arguments, - download.run, - help=_("download a license and place it in the LICENSES/ directory"), - description=fill_all( - _("Download a license and place it in the LICENSES/ directory.") - ), - ) - - add_command( - subparsers, - "lint", - lint.add_arguments, - lint.run, - help=_("list all non-compliant files"), - description=fill_all( - _( - "Lint the project directory for compliance with" - " version {reuse_version} of the REUSE Specification. You can" - " find the latest version of the specification at" - " .\n" - "\n" - "Specifically, the following criteria are checked:\n" - "\n" - "- Are there any bad (unrecognised, not compliant with SPDX)" - " licenses in the project?\n" - "\n" - "- Are there any deprecated licenses in the project?\n" - "\n" - "- Are there any license files in the LICENSES/ directory" - " without file extension?\n" - "\n" - "- Are any licenses referred to inside of the project, but" - " not included in the LICENSES/ directory?\n" - "\n" - "- Are any licenses included in the LICENSES/ directory that" - " are not used inside of the project?\n" - "\n" - "- Are there any read errors?\n" - "\n" - "- Do all files have valid copyright and licensing" - " information?" - ).format(reuse_version=__REUSE_version__) - ), - ) - - add_command( - subparsers, - "lint-file", - _lint_file.add_arguments, - _lint_file.run, - description=fill_all( - _( - "Lint individual files. The specified files are checked for" - " the presence of copyright and licensing information, and" - " whether the found licenses are included in the LICENSES/" - " directory." - ) - ), - help=_("list non-compliant files from specified list of files"), - ) - - add_command( - subparsers, - "spdx", - spdx.add_arguments, - spdx.run, - description=fill_all( - _("Generate an SPDX bill of materials in RDF format.") - ), - help=_("print the project's bill of materials in SPDX format"), - ) - - add_command( - subparsers, - "supported-licenses", - supported_licenses.add_arguments, - supported_licenses.run, - description=fill_all( - _("List all non-deprecated SPDX licenses from the official list.") - ), - help=_("list all supported SPDX licenses"), - aliases=["supported-licences"], - ) - - add_command( - subparsers, - "convert-dep5", - convert_dep5.add_arguments, - convert_dep5.run, - description=fill_all( - _( - "Convert .reuse/dep5 into a REUSE.toml file in your project" - " root. The generated file is semantically identical. The" - " .reuse/dep5 file is subsequently deleted." - ) - ), - help=_("convert .reuse/dep5 to REUSE.toml"), - ) - - return parser - - -def add_command( # pylint: disable=too-many-arguments,redefined-builtin - subparsers: argparse._SubParsersAction, - name: str, - add_arguments_func: Callable[[argparse.ArgumentParser], None], - run_func: Callable[[argparse.Namespace, Project, IO[str]], int], - formatter_class: Optional[Type[argparse.HelpFormatter]] = None, - description: Optional[str] = None, - help: Optional[str] = None, - aliases: Optional[list[str]] = None, -) -> None: - """Add a subparser for a command.""" - if formatter_class is None: - formatter_class = argparse.RawTextHelpFormatter - subparser = subparsers.add_parser( - name, - formatter_class=formatter_class, - description=description, - help=help, - aliases=aliases or [], - ) - add_arguments_func(subparser) - subparser.set_defaults(func=run_func) - subparser.set_defaults(parser=subparser) - - -def main(args: Optional[list[str]] = None, out: IO[str] = sys.stdout) -> int: - """Main entry function.""" - if args is None: - args = cast(list[str], sys.argv[1:]) - - main_parser = parser() - parsed_args = main_parser.parse_args(args) - - setup_logging(level=logging.DEBUG if parsed_args.debug else logging.WARNING) - # Show all warnings raised by ourselves. - if not parsed_args.suppress_deprecation: - warnings.filterwarnings("default", module="reuse") - - if parsed_args.version: - out.write(f"reuse {__version__}\n") - return 0 - - # Very stupid workaround to not print a DEP5 deprecation warning in the - # middle of conversion to REUSE.toml. - if args and args[0] == "convert-dep5": - os.environ["_SUPPRESS_DEP5_WARNING"] = "1" - - root = parsed_args.root - if root is None: - root = find_root() - if root is None: - root = Path.cwd() - try: - project = Project.from_directory(root) - # FileNotFoundError and NotADirectoryError don't need to be caught because - # argparse already made sure of these things. - except GlobalLicensingParseError as error: - main_parser.error( - _( - "'{path}' could not be parsed. We received the following error" - " message: {message}" - ).format(path=error.source, message=str(error)) - ) - except GlobalLicensingConflict as error: - main_parser.error(str(error)) - except OSError as error: - main_parser.error(str(error)) - - project.include_submodules = parsed_args.include_submodules - project.include_meson_subprojects = parsed_args.include_meson_subprojects - - return parsed_args.func(parsed_args, project, out) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 5eaf59428..222629fef 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -19,10 +19,7 @@ import re import shutil import subprocess -import sys -from argparse import ArgumentTypeError from collections import Counter -from difflib import SequenceMatcher from gettext import gettext as _ from hashlib import sha1 from inspect import cleandoc @@ -31,11 +28,10 @@ from pathlib import Path from typing import IO, Any, BinaryIO, Iterator, Optional, Type, Union, cast -from boolean.boolean import Expression, ParseError +from boolean.boolean import ParseError from license_expression import ExpressionError, Licensing from . import ReuseInfo, SourceType -from ._licenses import ALL_NON_DEPRECATED_MAP from .comment import ( EXTENSION_COMMENT_STYLE_MAP_LOWERCASE, FILENAME_COMMENT_STYLE_MAP_LOWERCASE, @@ -525,118 +521,6 @@ def _checksum(path: StrPath) -> str: return file_sha1.hexdigest() -class PathType: - """Factory for creating Paths""" - - def __init__( - self, - mode: str = "r", - force_file: bool = False, - force_directory: bool = False, - ): - if mode in ("r", "r+", "w"): - self._mode = mode - else: - raise ValueError(f"mode='{mode}' is not valid") - self._force_file = force_file - self._force_directory = force_directory - if self._force_file and self._force_directory: - raise ValueError( - "'force_file' and 'force_directory' cannot both be True" - ) - - def _check_read(self, path: Path) -> None: - if path.exists() and os.access(path, os.R_OK): - if self._force_file and not path.is_file(): - raise ArgumentTypeError(_("'{}' is not a file").format(path)) - if self._force_directory and not path.is_dir(): - raise ArgumentTypeError( - _("'{}' is not a directory").format(path) - ) - return - raise ArgumentTypeError(_("can't open '{}'").format(path)) - - def _check_write(self, path: Path) -> None: - if path.is_dir(): - raise ArgumentTypeError( - _("can't write to directory '{}'").format(path) - ) - if path.exists() and os.access(path, os.W_OK): - return - if not path.exists() and os.access(path.parent, os.W_OK): - return - raise ArgumentTypeError(_("can't write to '{}'").format(path)) - - def __call__(self, string: str) -> Path: - path = Path(string) - - try: - if self._mode in ("r", "r+"): - self._check_read(path) - if self._mode in ("w", "r+"): - self._check_write(path) - return path - except OSError as error: - raise ArgumentTypeError( - _("can't read or write '{}'").format(path) - ) from error - - -def spdx_identifier(text: str) -> Expression: - """argparse factory for creating SPDX expressions.""" - try: - return _LICENSING.parse(text) - except (ExpressionError, ParseError) as error: - raise ArgumentTypeError( - _("'{}' is not a valid SPDX expression, aborting").format(text) - ) from error - - -def similar_spdx_identifiers(identifier: str) -> list[str]: - """Given an incorrect SPDX identifier, return a list of similar ones.""" - suggestions: list[str] = [] - if identifier in ALL_NON_DEPRECATED_MAP: - return suggestions - - for valid_identifier in ALL_NON_DEPRECATED_MAP: - distance = SequenceMatcher( - a=identifier.lower(), b=valid_identifier[: len(identifier)].lower() - ).ratio() - if distance > 0.75: - suggestions.append(valid_identifier) - suggestions = sorted(suggestions) - - return suggestions - - -def print_incorrect_spdx_identifier( - identifier: str, out: IO[str] = sys.stdout -) -> None: - """Print out that *identifier* is not valid, and follow up with some - suggestions. - """ - out.write( - _("'{}' is not a valid SPDX License Identifier.").format(identifier) - ) - out.write("\n") - - suggestions = similar_spdx_identifiers(identifier) - if suggestions: - out.write("\n") - out.write(_("Did you mean:")) - out.write("\n") - for suggestion in suggestions: - out.write(f"* {suggestion}\n") - out.write("\n") - out.write( - _( - "See for a list of valid " - "SPDX License Identifiers." - ) - ) - out.write("\n") - - def detect_line_endings(text: str) -> str: """Return one of '\n', '\r' or '\r\n' depending on the line endings used in *text*. Return os.linesep if there are no line endings. diff --git a/src/reuse/convert_dep5.py b/src/reuse/convert_dep5.py index b33a8b219..cba50ea5d 100644 --- a/src/reuse/convert_dep5.py +++ b/src/reuse/convert_dep5.py @@ -5,16 +5,12 @@ """Logic to convert a .reuse/dep5 file to a REUSE.toml file.""" import re -import sys -from argparse import ArgumentParser, Namespace -from gettext import gettext as _ -from typing import IO, Any, Iterable, Optional, TypeVar, Union, cast +from typing import Any, Iterable, Optional, TypeVar, Union, cast import tomlkit from debian.copyright import Copyright, FilesParagraph, Header -from .global_licensing import REUSE_TOML_VERSION, ReuseDep5 -from .project import Project +from .global_licensing import REUSE_TOML_VERSION _SINGLE_ASTERISK_PATTERN = re.compile(r"(? str: result.update(header) result["annotations"] = annotations return tomlkit.dumps(result) - - -# pylint: disable=unused-argument -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - # Nothing to do. - - -# pylint: disable=unused-argument -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """Convert .reuse/dep5 to REUSE.toml.""" - if not (project.root / ".reuse/dep5").exists(): - args.parser.error(_("no '.reuse/dep5' file")) - - text = toml_from_dep5( - cast(ReuseDep5, project.global_licensing).dep5_copyright - ) - (project.root / "REUSE.toml").write_text(text) - (project.root / ".reuse/dep5").unlink() - - return 0 diff --git a/src/reuse/download.py b/src/reuse/download.py index 29ce3f71b..3de8fc62e 100644 --- a/src/reuse/download.py +++ b/src/reuse/download.py @@ -9,25 +9,14 @@ import logging import os import shutil -import sys import urllib.request -from argparse import ArgumentParser, Namespace -from gettext import gettext as _ from pathlib import Path -from typing import IO, Optional, cast +from typing import Optional, cast from urllib.error import URLError from urllib.parse import urljoin -from ._licenses import ALL_NON_DEPRECATED_MAP -from ._util import ( - _LICENSEREF_PATTERN, - PathType, - StrPath, - find_licenses_directory, - print_incorrect_spdx_identifier, -) +from ._util import _LICENSEREF_PATTERN, StrPath, find_licenses_directory from .project import Project -from .report import ProjectReport from .vcs import VCSStrategyNone _LOGGER = logging.getLogger(__name__) @@ -119,100 +108,3 @@ def put_license_in_file( with destination.open("w", encoding="utf-8") as fp: fp.write(header) fp.write(text) - - -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - parser.add_argument( - "license", - action="store", - nargs="*", - help=_("SPDX License Identifier of license"), - ) - parser.add_argument( - "--all", - action="store_true", - help=_("download all missing licenses detected in the project"), - ) - parser.add_argument( - "--output", "-o", dest="file", action="store", type=PathType("w") - ) - parser.add_argument( - "--source", - action="store", - type=PathType("r"), - help=_( - "source from which to copy custom LicenseRef- licenses, either" - " a directory that contains the file or the file itself" - ), - ) - - -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """Download license and place it in the LICENSES/ directory.""" - - def _already_exists(path: StrPath) -> None: - out.write( - _("Error: {spdx_identifier} already exists.").format( - spdx_identifier=path - ) - ) - out.write("\n") - - def _not_found(path: StrPath) -> None: - out.write(_("Error: {path} does not exist.").format(path=path)) - - def _could_not_download(identifier: str) -> None: - out.write(_("Error: Failed to download license.")) - out.write(" ") - if identifier not in ALL_NON_DEPRECATED_MAP: - print_incorrect_spdx_identifier(identifier, out=out) - else: - out.write(_("Is your internet connection working?")) - out.write("\n") - - def _successfully_downloaded(destination: StrPath) -> None: - out.write( - _("Successfully downloaded {spdx_identifier}.").format( - spdx_identifier=destination - ) - ) - out.write("\n") - - licenses = args.license - if args.all: - # TODO: This is fairly inefficient, but gets the job done. - report = ProjectReport.generate(project) - licenses = report.missing_licenses - if args.file: - _LOGGER.warning( - _("--output has no effect when used together with --all") - ) - args.file = None - elif not args.license: - args.parser.error(_("the following arguments are required: license")) - elif len(args.license) > 1 and args.file: - args.parser.error(_("cannot use --output with more than one license")) - - return_code = 0 - for lic in licenses: - if args.file: - destination = args.file - else: - destination = _path_to_license_file(lic, project) - try: - put_license_in_file( - lic, destination=destination, source=args.source - ) - except URLError: - _could_not_download(lic) - return_code = 1 - except FileExistsError as err: - _already_exists(err.filename) - return_code = 1 - except FileNotFoundError as err: - _not_found(err.filename) - return_code = 1 - else: - _successfully_downloaded(destination) - return return_code diff --git a/src/reuse/lint.py b/src/reuse/lint.py index 97277edf0..781cd6583 100644 --- a/src/reuse/lint.py +++ b/src/reuse/lint.py @@ -10,42 +10,16 @@ """ import json -import sys -from argparse import ArgumentParser, Namespace from gettext import gettext as _ from io import StringIO from pathlib import Path from textwrap import TextWrapper -from typing import IO, Any, Optional +from typing import Any, Optional from . import __REUSE_version__ -from .project import Project from .report import ProjectReport, ProjectReportSubsetProtocol -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - mutex_group = parser.add_mutually_exclusive_group() - mutex_group.add_argument( - "-q", "--quiet", action="store_true", help=_("prevents output") - ) - mutex_group.add_argument( - "-j", "--json", action="store_true", help=_("formats output as JSON") - ) - mutex_group.add_argument( - "-p", - "--plain", - action="store_true", - help=_("formats output as plain text (default)"), - ) - mutex_group.add_argument( - "-l", - "--lines", - action="store_true", - help=_("formats output as errors per line"), - ) - - # pylint: disable=too-many-branches,too-many-statements,too-many-locals def format_plain(report: ProjectReport) -> str: """Formats data dictionary as plaintext string to be printed to sys.stdout @@ -347,21 +321,3 @@ def license_path(lic: str) -> Optional[Path]: subset_output = format_lines_subset(report) return output.getvalue() + subset_output - - -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """List all non-compliant files.""" - report = ProjectReport.generate( - project, do_checksum=False, multiprocessing=not args.no_multiprocessing - ) - - if args.quiet: - pass - elif args.json: - out.write(format_json(report)) - elif args.lines: - out.write(format_lines(report)) - else: - out.write(format_plain(report)) - - return 0 if report.is_compliant else 1 diff --git a/src/reuse/spdx.py b/src/reuse/spdx.py deleted file mode 100644 index 20cb2739f..000000000 --- a/src/reuse/spdx.py +++ /dev/null @@ -1,94 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2022 Pietro Albini -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Compilation of the SPDX Document.""" - -import contextlib -import logging -import sys -from argparse import ArgumentParser, Namespace -from gettext import gettext as _ -from typing import IO - -from . import _IGNORE_SPDX_PATTERNS -from ._util import PathType -from .project import Project -from .report import ProjectReport - -_LOGGER = logging.getLogger(__name__) - - -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to the parser.""" - parser.add_argument( - "--output", "-o", dest="file", action="store", type=PathType("w") - ) - parser.add_argument( - "--add-license-concluded", - action="store_true", - help=_( - "populate the LicenseConcluded field; note that reuse cannot " - "guarantee the field is accurate" - ), - ) - parser.add_argument( - "--creator-person", - metavar="NAME", - help=_("name of the person signing off on the SPDX report"), - ) - parser.add_argument( - "--creator-organization", - metavar="NAME", - help=_("name of the organization signing off on the SPDX report"), - ) - - -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """Print the project's bill of materials.""" - # The SPDX spec mandates that a creator must be specified when a license - # conclusion is made, so here we enforce that. More context: - # https://github.com/fsfe/reuse-tool/issues/586#issuecomment-1310425706 - if ( - args.add_license_concluded - and args.creator_person is None - and args.creator_organization is None - ): - args.parser.error( - _( - "error: --creator-person=NAME or --creator-organization=NAME" - " required when --add-license-concluded is provided" - ), - ) - - with contextlib.ExitStack() as stack: - if args.file: - out = stack.enter_context(args.file.open("w", encoding="utf-8")) - if not any( - pattern.match(args.file.name) - for pattern in _IGNORE_SPDX_PATTERNS - ): - # pylint: disable=line-too-long - _LOGGER.warning( - _( - "'{path}' does not match a common SPDX file pattern. Find" - " the suggested naming conventions here:" - " https://spdx.github.io/spdx-spec/conformance/#44-standard-data-format-requirements" - ).format(path=out.name) - ) - - report = ProjectReport.generate( - project, - multiprocessing=not args.no_multiprocessing, - add_license_concluded=args.add_license_concluded, - ) - - out.write( - report.bill_of_materials( - creator_person=args.creator_person, - creator_organization=args.creator_organization, - ) - ) - - return 0 diff --git a/src/reuse/supported_licenses.py b/src/reuse/supported_licenses.py deleted file mode 100644 index 736d3df3f..000000000 --- a/src/reuse/supported_licenses.py +++ /dev/null @@ -1,35 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2022 Florian Snow -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""supported-licenses command handler""" - -import sys -from argparse import ArgumentParser, Namespace -from typing import IO - -from ._licenses import _LICENSES, _load_license_list -from .project import Project - - -# pylint: disable=unused-argument -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to the parser.""" - - -# pylint: disable=unused-argument -def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: - """Print the supported SPDX licenses list""" - - licenses = _load_license_list(_LICENSES)[1] - - for license_id, license_info in licenses.items(): - license_name = license_info["name"] - license_reference = license_info["reference"] - out.write( - f"{license_id: <40}\t{license_name: <80}\t" - f"{license_reference: <50}\n" - ) - - return 0 diff --git a/tests/test_main.py b/tests/test_main.py deleted file mode 100644 index d3443d3ae..000000000 --- a/tests/test_main.py +++ /dev/null @@ -1,700 +0,0 @@ -# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2019 Stefan Bakker -# SPDX-FileCopyrightText: 2022 Florian Snow -# SPDX-FileCopyrightText: 2022 Pietro Albini -# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER -# SPDX-FileCopyrightText: 2024 Skyler Grey -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Tests for reuse._main: lint, spdx, download""" - -# pylint: disable=redefined-outer-name,unused-argument - -import errno -import json -import os -import re -import shutil -import warnings -from inspect import cleandoc -from pathlib import Path -from typing import Generator, Optional -from unittest.mock import create_autospec -from urllib.error import URLError - -import pytest -from conftest import RESOURCES_DIRECTORY -from freezegun import freeze_time - -from reuse import download -from reuse._main import main, shtab -from reuse._util import GIT_EXE, HG_EXE, JUJUTSU_EXE, PIJUL_EXE, cleandoc_nl -from reuse.report import LINT_VERSION - -# REUSE-IgnoreStart - - -@pytest.fixture(params=[True, False]) -def optional_git_exe( - request, monkeypatch -) -> Generator[Optional[str], None, None]: - """Run the test with or without git.""" - exe = GIT_EXE if request.param else "" - monkeypatch.setattr("reuse.vcs.GIT_EXE", exe) - monkeypatch.setattr("reuse._util.GIT_EXE", exe) - yield exe - - -@pytest.fixture(params=[True, False]) -def optional_hg_exe( - request, monkeypatch -) -> Generator[Optional[str], None, None]: - """Run the test with or without mercurial.""" - exe = HG_EXE if request.param else "" - monkeypatch.setattr("reuse.vcs.HG_EXE", exe) - monkeypatch.setattr("reuse._util.HG_EXE", exe) - yield exe - - -@pytest.fixture(params=[True, False]) -def optional_jujutsu_exe( - request, monkeypatch -) -> Generator[Optional[str], None, None]: - """Run the test with or without Jujutsu.""" - exe = JUJUTSU_EXE if request.param else "" - monkeypatch.setattr("reuse.vcs.JUJUTSU_EXE", exe) - monkeypatch.setattr("reuse._util.JUJUTSU_EXE", exe) - yield exe - - -@pytest.fixture(params=[True, False]) -def optional_pijul_exe( - request, monkeypatch -) -> Generator[Optional[str], None, None]: - """Run the test with or without Pijul.""" - exe = PIJUL_EXE if request.param else "" - monkeypatch.setattr("reuse.vcs.PIJUL_EXE", exe) - monkeypatch.setattr("reuse._util.PIJUL_EXE", exe) - yield exe - - -@pytest.fixture() -def mock_put_license_in_file(monkeypatch): - """Create a mocked version of put_license_in_file.""" - result = create_autospec(download.put_license_in_file) - monkeypatch.setattr(download, "put_license_in_file", result) - return result - - -@pytest.mark.skipif(not shtab, reason="shtab required") -def test_print_completion(capsys): - """shtab completions are printed.""" - with pytest.raises(SystemExit) as error: - main(["--print-completion", "bash"]) - - assert error.value.code == 0 - assert "AUTOMATICALLY GENERATED by `shtab`" in capsys.readouterr().out - - -def test_lint(fake_repository, stringio, optional_git_exe, optional_hg_exe): - """Run a successful lint. The optional VCSs are there to make sure that the - test also works if these programs are not installed. - """ - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_reuse_toml(fake_repository_reuse_toml, stringio): - """Run a simple lint with REUSE.toml.""" - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_dep5(fake_repository_dep5, stringio): - """Run a simple lint with .reuse/dep5.""" - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_git(git_repository, stringio): - """Run a successful lint.""" - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_submodule(submodule_repository, stringio): - """Run a successful lint.""" - (submodule_repository / "submodule/foo.c").write_text("foo") - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_submodule_included(submodule_repository, stringio): - """Run a successful lint.""" - result = main(["--include-submodules", "lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_submodule_included_fail(submodule_repository, stringio): - """Run a failed lint.""" - (submodule_repository / "submodule/foo.c").write_text("foo") - result = main(["--include-submodules", "lint"], out=stringio) - - assert result == 1 - assert ":-(" in stringio.getvalue() - - -def test_lint_meson_subprojects(fake_repository, stringio): - """Verify that subprojects are ignored.""" - result = main(["lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_meson_subprojects_fail(subproject_repository, stringio): - """Verify that files in './subprojects' are not ignored.""" - # ./subprojects/foo.wrap misses license and linter fails - (subproject_repository / "subprojects/foo.wrap").write_text("foo") - result = main(["lint"], out=stringio) - - assert result == 1 - assert ":-(" in stringio.getvalue() - - -def test_lint_meson_subprojects_included_fail(subproject_repository, stringio): - """When Meson subprojects are included, fail on errors.""" - result = main(["--include-meson-subprojects", "lint"], out=stringio) - - assert result == 1 - assert ":-(" in stringio.getvalue() - - -def test_lint_meson_subprojects_included(subproject_repository, stringio): - """Successfully lint when Meson subprojects are included.""" - # ./subprojects/libfoo/foo.c has license and linter succeeds - (subproject_repository / "subprojects/libfoo/foo.c").write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2022 Jane Doe - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - ) - result = main(["--include-meson-subprojects", "lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_fail(fake_repository, stringio): - """Run a failed lint.""" - (fake_repository / "foo.py").write_text("foo") - result = main(["lint"], out=stringio) - - assert result > 0 - assert "foo.py" in stringio.getvalue() - assert ":-(" in stringio.getvalue() - - -def test_lint_fail_quiet(fake_repository, stringio): - """Run a failed lint.""" - (fake_repository / "foo.py").write_text("foo") - result = main(["lint", "--quiet"], out=stringio) - - assert result > 0 - assert stringio.getvalue() == "" - - -def test_lint_dep5_decode_error(fake_repository_dep5, capsys): - """Display an error if dep5 cannot be decoded.""" - shutil.copy( - RESOURCES_DIRECTORY / "fsfe.png", fake_repository_dep5 / ".reuse/dep5" - ) - with pytest.raises(SystemExit): - main(["lint"]) - error = capsys.readouterr().err - assert str(fake_repository_dep5 / ".reuse/dep5") in error - assert "could not be parsed" in error - assert "'utf-8' codec can't decode byte" in error - - -def test_lint_dep5_parse_error(fake_repository_dep5, capsys): - """Display an error if there's a dep5 parse error.""" - (fake_repository_dep5 / ".reuse/dep5").write_text("foo") - with pytest.raises(SystemExit): - main(["lint"]) - error = capsys.readouterr().err - assert str(fake_repository_dep5 / ".reuse/dep5") in error - assert "could not be parsed" in error - - -def test_lint_toml_parse_error_version(fake_repository_reuse_toml, capsys): - """If version has the wrong type, print an error.""" - (fake_repository_reuse_toml / "REUSE.toml").write_text("version = 'a'") - with pytest.raises(SystemExit): - main(["lint"]) - error = capsys.readouterr().err - assert str(fake_repository_reuse_toml / "REUSE.toml") in error - assert "could not be parsed" in error - - -def test_lint_toml_parse_error_annotation(fake_repository_reuse_toml, capsys): - """If there is an error in an annotation, print an error.""" - (fake_repository_reuse_toml / "REUSE.toml").write_text( - cleandoc_nl( - """ - version = 1 - - [[annotations]] - path = 1 - """ - ) - ) - with pytest.raises(SystemExit): - main(["lint"]) - error = capsys.readouterr().err - assert str(fake_repository_reuse_toml / "REUSE.toml") in error - assert "could not be parsed" in error - - -def test_lint_json(fake_repository, stringio): - """Run a failed lint.""" - result = main(["lint", "--json"], out=stringio) - output = json.loads(stringio.getvalue()) - - assert result == 0 - assert output["lint_version"] == LINT_VERSION - assert len(output["files"]) == 8 - - -def test_lint_json_fail(fake_repository, stringio): - """Run a failed lint.""" - (fake_repository / "foo.py").write_text("foo") - result = main(["lint", "--json"], out=stringio) - output = json.loads(stringio.getvalue()) - - assert result > 0 - assert output["lint_version"] == LINT_VERSION - assert len(output["non_compliant"]["missing_licensing_info"]) == 1 - assert len(output["non_compliant"]["missing_copyright_info"]) == 1 - assert len(output["files"]) == 9 - - -def test_lint_no_file_extension(fake_repository, stringio): - """If a license has no file extension, the lint fails.""" - (fake_repository / "LICENSES/CC0-1.0.txt").rename( - fake_repository / "LICENSES/CC0-1.0" - ) - result = main(["lint"], out=stringio) - - assert result > 0 - assert "Licenses without file extension: CC0-1.0" in stringio.getvalue() - assert ":-(" in stringio.getvalue() - - -def test_lint_custom_root(fake_repository, stringio): - """Use a custom root location.""" - result = main(["--root", "doc", "lint"], out=stringio) - - assert result > 0 - assert "usage.md" in stringio.getvalue() - assert ":-(" in stringio.getvalue() - - -def test_lint_custom_root_git(git_repository, stringio): - """Use a custom root location in a git repo.""" - result = main(["--root", "doc", "lint"], out=stringio) - - assert result > 0 - assert "usage.md" in stringio.getvalue() - assert ":-(" in stringio.getvalue() - - -def test_lint_custom_root_different_cwd(fake_repository_reuse_toml, stringio): - """Use a custom root while CWD is different.""" - os.chdir("/") - result = main( - ["--root", str(fake_repository_reuse_toml), "lint"], out=stringio - ) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -def test_lint_custom_root_is_file(fake_repository, stringio): - """Custom root cannot be a file.""" - with pytest.raises(SystemExit): - main(["--root", ".reuse/dep5", "lint"], out=stringio) - - -def test_lint_custom_root_not_exists(fake_repository, stringio): - """Custom root must exist.""" - with pytest.raises(SystemExit): - main(["--root", "does-not-exist", "lint"], out=stringio) - - -def test_lint_no_multiprocessing(fake_repository, stringio, multiprocessing): - """--no-multiprocessing works.""" - result = main(["--no-multiprocessing", "lint"], out=stringio) - - assert result == 0 - assert ":-)" in stringio.getvalue() - - -class TestLintFile: - """Tests for lint-file.""" - - def test_simple(self, fake_repository, stringio): - """A simple test to make sure it works.""" - result = main(["lint-file", "src/custom.py"], out=stringio) - assert result == 0 - assert not stringio.getvalue() - - def test_no_copyright_licensing(self, fake_repository, stringio): - """A file is correctly spotted when it has no copyright or licensing - info. - """ - (fake_repository / "foo.py").write_text("foo") - result = main(["lint-file", "foo.py"], out=stringio) - assert result == 1 - output = stringio.getvalue() - assert "foo.py" in output - assert "no license identifier" in output - assert "no copyright notice" in output - - def test_path_outside_project(self, empty_directory, capsys): - """A file can't be outside the project.""" - with pytest.raises(SystemExit): - main(["lint-file", ".."]) - assert "'..' is not in" in capsys.readouterr().err - - def test_file_not_exists(self, empty_directory, capsys): - """A file must exist.""" - with pytest.raises(SystemExit): - main(["lint-file", "foo.py"]) - assert "can't open 'foo.py'" in capsys.readouterr().err - - def test_ignored_file(self, fake_repository, stringio): - """A corner case where a specified file is ignored. It isn't checked at - all. - """ - (fake_repository / "COPYING").write_text("foo") - result = main(["lint-file", "COPYING"], out=stringio) - assert result == 0 - - def test_file_covered_by_toml(self, fake_repository_reuse_toml, stringio): - """If a file is covered by REUSE.toml, use its infos.""" - (fake_repository_reuse_toml / "doc/foo.md").write_text("foo") - result = main(["lint-file", "doc/foo.md"], out=stringio) - assert result == 0 - - -@freeze_time("2024-04-08T17:34:00Z") -def test_spdx(fake_repository, stringio): - """Compile to an SPDX document.""" - os.chdir(str(fake_repository)) - result = main(["spdx"], out=stringio) - output = stringio.getvalue() - - # Ensure no LicenseConcluded is included without the flag - assert "\nLicenseConcluded: NOASSERTION\n" in output - assert "\nLicenseConcluded: GPL-3.0-or-later\n" not in output - assert "\nCreator: Person: Anonymous ()\n" in output - assert "\nCreator: Organization: Anonymous ()\n" in output - assert "\nCreated: 2024-04-08T17:34:00Z\n" in output - - # TODO: This test is rubbish. - assert result == 0 - assert output - - -def test_spdx_creator_info(fake_repository, stringio): - """Ensure the --creator-* flags are properly formatted""" - os.chdir(str(fake_repository)) - result = main( - [ - "spdx", - "--creator-person=Jane Doe (jane.doe@example.org)", - "--creator-organization=FSFE", - ], - out=stringio, - ) - output = stringio.getvalue() - - assert result == 0 - assert "\nCreator: Person: Jane Doe (jane.doe@example.org)\n" in output - assert "\nCreator: Organization: FSFE ()\n" in output - - -def test_spdx_add_license_concluded(fake_repository, stringio): - """Compile to an SPDX document with the LicenseConcluded field.""" - os.chdir(str(fake_repository)) - result = main( - [ - "spdx", - "--add-license-concluded", - "--creator-person=Jane Doe", - "--creator-organization=FSFE", - ], - out=stringio, - ) - output = stringio.getvalue() - - # Ensure no LicenseConcluded is included without the flag - assert result == 0 - assert "\nLicenseConcluded: NOASSERTION\n" not in output - assert "\nLicenseConcluded: GPL-3.0-or-later\n" in output - assert "\nCreator: Person: Jane Doe ()\n" in output - assert "\nCreator: Organization: FSFE ()\n" in output - - -def test_spdx_add_license_concluded_without_creator_info( - fake_repository, stringio -): - """Adding LicenseConcluded should require creator information""" - os.chdir(str(fake_repository)) - with pytest.raises(SystemExit): - main(["spdx", "--add-license-concluded"], out=stringio) - - -def test_spdx_no_multiprocessing(fake_repository, stringio, multiprocessing): - """--no-multiprocessing works.""" - os.chdir(str(fake_repository)) - result = main(["--no-multiprocessing", "spdx"], out=stringio) - - # TODO: This test is rubbish. - assert result == 0 - assert stringio.getvalue() - - -def test_download(fake_repository, stringio, mock_put_license_in_file): - """Straightforward test.""" - result = main(["download", "0BSD"], out=stringio) - - assert result == 0 - mock_put_license_in_file.assert_called_with( - "0BSD", Path("LICENSES/0BSD.txt").resolve(), source=None - ) - - -def test_download_file_exists( - fake_repository, stringio, mock_put_license_in_file -): - """The to-be-downloaded file already exists.""" - mock_put_license_in_file.side_effect = FileExistsError( - errno.EEXIST, "", "GPL-3.0-or-later.txt" - ) - - result = main(["download", "GPL-3.0-or-later"], out=stringio) - - assert result == 1 - assert "GPL-3.0-or-later.txt already exists" in stringio.getvalue() - - -def test_download_exception( - fake_repository, stringio, mock_put_license_in_file -): - """There was an error while downloading the license file.""" - mock_put_license_in_file.side_effect = URLError("test") - - result = main(["download", "0BSD"], out=stringio) - - assert result == 1 - assert "internet" in stringio.getvalue() - - -def test_download_invalid_spdx( - fake_repository, stringio, mock_put_license_in_file -): - """An invalid SPDX identifier was provided.""" - mock_put_license_in_file.side_effect = URLError("test") - - result = main(["download", "does-not-exist"], out=stringio) - - assert result == 1 - assert "not a valid SPDX License Identifier" in stringio.getvalue() - - -def test_download_custom_output( - empty_directory, stringio, mock_put_license_in_file -): - """Download the license into a custom file.""" - result = main(["download", "-o", "foo", "0BSD"], out=stringio) - - assert result == 0 - mock_put_license_in_file.assert_called_with( - "0BSD", destination=Path("foo"), source=None - ) - - -def test_download_custom_output_too_many( - empty_directory, stringio, mock_put_license_in_file -): - """Providing more than one license with a custom output results in an - error. - """ - with pytest.raises(SystemExit): - main( - ["download", "-o", "foo", "0BSD", "GPL-3.0-or-later"], out=stringio - ) - - -def test_download_inside_licenses_dir( - fake_repository, stringio, mock_put_license_in_file -): - """While inside the LICENSES/ directory, don't create another LICENSES/ - directory. - """ - os.chdir(fake_repository / "LICENSES") - result = main(["download", "0BSD"], out=stringio) - assert result == 0 - mock_put_license_in_file.assert_called_with( - "0BSD", destination=Path("0BSD.txt").absolute(), source=None - ) - - -def test_download_inside_licenses_dir_in_git( - git_repository, stringio, mock_put_license_in_file -): - """While inside a random LICENSES/ directory in a Git repository,.use the - root LICENSES/ directory. - """ - (git_repository / "doc/LICENSES").mkdir() - os.chdir(git_repository / "doc/LICENSES") - result = main(["download", "0BSD"], out=stringio) - assert result == 0 - mock_put_license_in_file.assert_called_with( - "0BSD", destination=Path("../../LICENSES/0BSD.txt"), source=None - ) - - -def test_download_different_root( - fake_repository, stringio, mock_put_license_in_file -): - """Download using a different root.""" - (fake_repository / "new_root").mkdir() - - result = main( - [ - "--root", - str((fake_repository / "new_root").resolve()), - "download", - "MIT", - ], - out=stringio, - ) - assert result == 0 - mock_put_license_in_file.assert_called_with( - "MIT", Path("new_root/LICENSES/MIT.txt").resolve(), source=None - ) - - -def test_download_licenseref_no_source(empty_directory, stringio): - """Downloading a LicenseRef license creates an empty file.""" - main(["download", "LicenseRef-hello"], out=stringio) - assert (empty_directory / "LICENSES/LicenseRef-hello.txt").read_text() == "" - - -def test_download_licenseref_source_file(empty_directory, stringio): - """Downloading a LicenseRef license with a source file copies that file's - contents. - """ - (empty_directory / "foo.txt").write_text("foo") - main(["download", "--source", "foo.txt", "LicenseRef-hello"], out=stringio) - assert ( - empty_directory / "LICENSES/LicenseRef-hello.txt" - ).read_text() == "foo" - - -def test_download_licenseref_source_dir(empty_directory, stringio): - """Downloading a LicenseRef license with a source dir copies the text from - the corresponding file in the directory. - """ - (empty_directory / "lics").mkdir() - (empty_directory / "lics/LicenseRef-hello.txt").write_text("foo") - - main(["download", "--source", "lics", "LicenseRef-hello"], out=stringio) - assert ( - empty_directory / "LICENSES/LicenseRef-hello.txt" - ).read_text() == "foo" - - -def test_download_licenseref_false_source_dir(empty_directory, stringio): - """Downloading a LicenseRef license with a source that does not contain the - license results in an error. - """ - (empty_directory / "lics").mkdir() - - result = main( - ["download", "--source", "lics", "LicenseRef-hello"], out=stringio - ) - assert result != 0 - assert ( - f"{Path('lics') / 'LicenseRef-hello.txt'} does not exist" - in stringio.getvalue() - ) - - -def test_supported_licenses(stringio): - """Invoke the supported-licenses command and check whether the result - contains at least one license in the expected format. - """ - - assert main(["supported-licenses"], out=stringio) == 0 - assert re.search( - # pylint: disable=line-too-long - r"GPL-3\.0-or-later\s+GNU General Public License v3\.0 or later\s+https:\/\/spdx\.org\/licenses\/GPL-3\.0-or-later\.html\s+\n", - stringio.getvalue(), - ) - - -def test_convert_dep5(fake_repository_dep5, stringio): - """Convert a DEP5 repository to a REUSE.toml repository.""" - result = main(["convert-dep5"], out=stringio) - - assert result == 0 - assert not (fake_repository_dep5 / ".reuse/dep5").exists() - assert (fake_repository_dep5 / "REUSE.toml").exists() - assert (fake_repository_dep5 / "REUSE.toml").read_text() == cleandoc_nl( - """ - version = 1 - - [[annotations]] - path = "doc/**" - precedence = "aggregate" - SPDX-FileCopyrightText = "2017 Jane Doe" - SPDX-License-Identifier = "CC0-1.0" - """ - ) - - -def test_convert_dep5_no_dep5_file(fake_repository, stringio): - """Cannot convert when there is no .reuse/dep5 file.""" - with pytest.raises(SystemExit): - main(["convert-dep5"], out=stringio) - - -def test_convert_dep5_no_warning(fake_repository_dep5, stringio): - """No PendingDeprecationWarning when running convert-dep5.""" - with warnings.catch_warnings(record=True) as caught_warnings: - result = main(["convert-dep5"], out=stringio) - assert result == 0 - assert not caught_warnings - - -# REUSE-IgnoreEnd diff --git a/tests/test_main_annotate.py b/tests/test_main_annotate.py deleted file mode 100644 index db184cf83..000000000 --- a/tests/test_main_annotate.py +++ /dev/null @@ -1,1577 +0,0 @@ -# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2019 Stefan Bakker -# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker -# SPDX-FileCopyrightText: 2022 Florian Snow -# SPDX-FileCopyrightText: 2023 Maxim Cournoyer -# SPDX-FileCopyrightText: 2024 Rivos Inc. -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Tests for reuse._main: annotate""" -import logging -import stat -from inspect import cleandoc - -import pytest - -from reuse._main import main - -# pylint: disable=too-many-lines,unused-argument - - -# REUSE-IgnoreStart - - -# TODO: Replace this test with a monkeypatched test -def test_annotate_simple(fake_repository, stringio, mock_date_today): - """Add a header to a file that does not have one.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_simple_scheme(fake_repository, stringio, mock_date_today): - "Add a header to a Scheme file." - simple_file = fake_repository / "foo.scm" - simple_file.write_text("#t") - expected = cleandoc( - """ - ;;; SPDX-FileCopyrightText: 2018 Jane Doe - ;;; - ;;; SPDX-License-Identifier: GPL-3.0-or-later - - #t - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.scm", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_scheme_standardised( - fake_repository, stringio, mock_date_today -): - """The comment block is rewritten/standardised.""" - simple_file = fake_repository / "foo.scm" - simple_file.write_text( - cleandoc( - """ - ; SPDX-FileCopyrightText: 2018 Jane Doe - ; - ; SPDX-License-Identifier: GPL-3.0-or-later - - #t - """ - ) - ) - expected = cleandoc( - """ - ;;; SPDX-FileCopyrightText: 2018 Jane Doe - ;;; - ;;; SPDX-License-Identifier: GPL-3.0-or-later - - #t - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.scm", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_scheme_standardised2( - fake_repository, stringio, mock_date_today -): - """The comment block is rewritten/standardised.""" - simple_file = fake_repository / "foo.scm" - simple_file.write_text( - cleandoc( - """ - ;; SPDX-FileCopyrightText: 2018 Jane Doe - ;; - ;; SPDX-License-Identifier: GPL-3.0-or-later - - #t - """ - ) - ) - expected = cleandoc( - """ - ;;; SPDX-FileCopyrightText: 2018 Jane Doe - ;;; - ;;; SPDX-License-Identifier: GPL-3.0-or-later - - #t - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.scm", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_simple_no_replace(fake_repository, stringio, mock_date_today): - """Add a header to a file without replacing the existing header.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text( - cleandoc( - """ - # SPDX-FileCopyrightText: 2017 John Doe - # - # SPDX-License-Identifier: MIT - - pass - """ - ) - ) - expected = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - # SPDX-FileCopyrightText: 2017 John Doe - # - # SPDX-License-Identifier: MIT - - pass - """ - ) - - result = main( - [ - "annotate", - "--no-replace", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_year(fake_repository, stringio): - """Add a header to a file with a custom year.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - # SPDX-FileCopyrightText: 2016 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--year", - "2016", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_no_year(fake_repository, stringio): - """Add a header to a file without a year.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - # SPDX-FileCopyrightText: Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--exclude-year", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -@pytest.mark.parametrize( - "copyright_prefix", ["--copyright-prefix", "--copyright-style"] -) -def test_annotate_copyright_prefix( - fake_repository, copyright_prefix, stringio, mock_date_today -): - """Add a header with a specific copyright prefix. Also test the old name of - the parameter. - """ - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - # Copyright 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - copyright_prefix, - "string", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_shebang(fake_repository, stringio): - """Keep the shebang when annotating.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text( - cleandoc( - """ - #!/usr/bin/env python3 - - pass - """ - ) - ) - expected = cleandoc( - """ - #!/usr/bin/env python3 - - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_shebang_wrong_comment_style(fake_repository, stringio): - """If a comment style does not support the shebang at the top, don't treat - the shebang as special. - """ - simple_file = fake_repository / "foo.html" - simple_file.write_text( - cleandoc( - """ - #!/usr/bin/env python3 - - pass - """ - ) - ) - expected = cleandoc( - """ - - - #!/usr/bin/env python3 - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "foo.html", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_contributors_only( - fake_repository, stringio, mock_date_today, contributors -): - """Add a header with only contributor information.""" - - if not contributors: - pytest.skip("No contributors to add") - - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - content = [] - - for contributor in sorted(contributors): - content.append(f"# SPDX-FileContributor: {contributor}") - - content += ["", "pass"] - expected = cleandoc("\n".join(content)) - - args = [ - "annotate", - ] - for contributor in contributors: - args += ["--contributor", contributor] - args += ["foo.py"] - - result = main( - args, - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_contributors( - fake_repository, stringio, mock_date_today, contributors -): - """Add a header with contributor information.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - content = ["# SPDX-FileCopyrightText: 2018 Jane Doe"] - - if contributors: - for contributor in sorted(contributors): - content.append(f"# SPDX-FileContributor: {contributor}") - - content += ["#", "# SPDX-License-Identifier: GPL-3.0-or-later", "", "pass"] - expected = cleandoc("\n".join(content)) - - args = [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - ] - for contributor in contributors: - args += ["--contributor", contributor] - args += ["foo.py"] - - result = main( - args, - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_specify_style(fake_repository, stringio, mock_date_today): - """Add a header to a file that does not have one, using a custom style.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - // SPDX-FileCopyrightText: 2018 Jane Doe - // - // SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--style", - "cpp", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_specify_style_unrecognised( - fake_repository, stringio, mock_date_today -): - """Add a header to a file that is unrecognised.""" - - simple_file = fake_repository / "hello.foo" - simple_file.touch() - expected = "# SPDX-FileCopyrightText: 2018 Jane Doe" - - result = main( - [ - "annotate", - "--copyright", - "Jane Doe", - "--style", - "python", - "hello.foo", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text().strip() == expected - - -def test_annotate_implicit_style(fake_repository, stringio, mock_date_today): - """Add a header to a file that has a recognised extension.""" - simple_file = fake_repository / "foo.js" - simple_file.write_text("pass") - expected = cleandoc( - """ - // SPDX-FileCopyrightText: 2018 Jane Doe - // - // SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.js", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_implicit_style_filename( - fake_repository, stringio, mock_date_today -): - """Add a header to a filename that is recognised.""" - simple_file = fake_repository / "Makefile" - simple_file.write_text("pass") - expected = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "Makefile", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_unrecognised_style(fake_repository, capsys): - """Add a header to a file that has an unrecognised extension.""" - simple_file = fake_repository / "foo.foo" - simple_file.write_text("pass") - - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.foo", - ], - ) - - stdout = capsys.readouterr().err - assert ( - "The following files do not have a recognised file extension" in stdout - ) - assert "foo.foo" in stdout - - -@pytest.mark.parametrize( - "skip_unrecognised", ["--skip-unrecognised", "--skip-unrecognized"] -) -def test_annotate_skip_unrecognised( - fake_repository, skip_unrecognised, stringio -): - """Skip file that has an unrecognised extension.""" - simple_file = fake_repository / "foo.foo" - simple_file.write_text("pass") - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - skip_unrecognised, - "foo.foo", - ], - out=stringio, - ) - - assert result == 0 - assert "Skipped unrecognised file 'foo.foo'" in stringio.getvalue() - - -def test_annotate_skip_unrecognised_and_style( - fake_repository, stringio, caplog -): - """--skip-unrecognised and --style show warning message.""" - simple_file = fake_repository / "foo.foo" - simple_file.write_text("pass") - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--style=c", - "--skip-unrecognised", - "foo.foo", - ], - out=stringio, - ) - - assert result == 0 - loglevel = logging.getLogger("reuse").level - if loglevel > logging.WARNING: - pytest.skip( - "Test needs LogLevel <= WARNING (e.g. WARNING, INFO, DEBUG)." - ) - else: - assert "no effect" in caplog.text - - -def test_annotate_no_copyright_or_license(fake_repository): - """Add a header, but supply no copyright or license.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - - with pytest.raises(SystemExit): - main(["annotate", "foo.py"]) - - -def test_annotate_template_simple( - fake_repository, stringio, mock_date_today, template_simple_source -): - """Add a header with a custom template.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" - template_file.parent.mkdir(parents=True, exist_ok=True) - template_file.write_text(template_simple_source) - expected = cleandoc( - """ - # Hello, world! - # - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate.jinja2", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_template_simple_multiple( - fake_repository, stringio, mock_date_today, template_simple_source -): - """Add a header with a custom template to multiple files.""" - simple_files = [fake_repository / f"foo{i}.py" for i in range(10)] - for simple_file in simple_files: - simple_file.write_text("pass") - template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" - template_file.parent.mkdir(parents=True, exist_ok=True) - template_file.write_text(template_simple_source) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate.jinja2", - ] - + list(map(str, simple_files)), - out=stringio, - ) - - assert result == 0 - for simple_file in simple_files: - expected = cleandoc( - """ - # Hello, world! - # - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - assert simple_file.read_text() == expected - - -def test_annotate_template_no_spdx( - fake_repository, stringio, template_no_spdx_source -): - """Add a header with a template that lacks REUSE info.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" - template_file.parent.mkdir(parents=True, exist_ok=True) - template_file.write_text(template_no_spdx_source) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate.jinja2", - "foo.py", - ], - out=stringio, - ) - - assert result == 1 - - -def test_annotate_template_commented( - fake_repository, stringio, mock_date_today, template_commented_source -): - """Add a header with a custom template that is already commented.""" - simple_file = fake_repository / "foo.c" - simple_file.write_text("pass") - template_file = ( - fake_repository / ".reuse/templates/mytemplate.commented.jinja2" - ) - template_file.parent.mkdir(parents=True, exist_ok=True) - template_file.write_text(template_commented_source) - expected = cleandoc( - """ - # Hello, world! - # - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate.commented.jinja2", - "foo.c", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_template_nonexistant(fake_repository): - """Raise an error when using a header that does not exist.""" - - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate.jinja2", - "foo.py", - ] - ) - - -def test_annotate_template_without_extension( - fake_repository, stringio, mock_date_today, template_simple_source -): - """Find the correct header even when not using an extension.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" - template_file.parent.mkdir(parents=True, exist_ok=True) - template_file.write_text(template_simple_source) - expected = cleandoc( - """ - # Hello, world! - # - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--template", - "mytemplate", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -def test_annotate_binary( - fake_repository, stringio, mock_date_today, binary_string -): - """Add a header to a .license file if the file is a binary.""" - binary_file = fake_repository / "foo.png" - binary_file.write_bytes(binary_string) - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.png", - ], - out=stringio, - ) - - assert result == 0 - assert ( - binary_file.with_name(f"{binary_file.name}.license").read_text().strip() - == expected - ) - - -def test_annotate_uncommentable_json( - fake_repository, stringio, mock_date_today -): - """Add a header to a .license file if the file is uncommentable, e.g., - JSON. - """ - json_file = fake_repository / "foo.json" - json_file.write_text('{"foo": 23, "bar": 42}') - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.json", - ], - out=stringio, - ) - - assert result == 0 - assert ( - json_file.with_name(f"{json_file.name}.license").read_text().strip() - == expected - ) - - -def test_annotate_fallback_dot_license( - fake_repository, stringio, mock_date_today -): - """Add a header to .license if --fallback-dot-license is given, and no style - yet exists. - """ - (fake_repository / "foo.py").write_text("Foo") - (fake_repository / "foo.foo").write_text("Foo") - - expected_py = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - expected_foo = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--fallback-dot-license", - "foo.py", - "foo.foo", - ], - out=stringio, - ) - - assert result == 0 - assert expected_py in (fake_repository / "foo.py").read_text() - assert (fake_repository / "foo.foo.license").exists() - assert ( - fake_repository / "foo.foo.license" - ).read_text().strip() == expected_foo - assert ( - "'foo.foo' is not recognised; creating 'foo.foo.license'" - in stringio.getvalue() - ) - - -def test_annotate_force_dot_license(fake_repository, stringio, mock_date_today): - """Add a header to a .license file if --force-dot-license is given.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--force-dot-license", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert ( - simple_file.with_name(f"{simple_file.name}.license").read_text().strip() - == expected - ) - assert simple_file.read_text() == "pass" - - -def test_annotate_force_dot_license_double( - fake_repository, stringio, mock_date_today -): - """When path.license already exists, don't create path.license.license.""" - simple_file = fake_repository / "foo.txt" - simple_file_license = fake_repository / "foo.txt.license" - simple_file_license_license = fake_repository / "foo.txt.license.license" - - simple_file.write_text("foo") - simple_file_license.write_text("foo") - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--force-dot-license", - "foo.txt", - ], - out=stringio, - ) - - assert result == 0 - assert not simple_file_license_license.exists() - assert simple_file_license.read_text().strip() == expected - - -def test_annotate_force_dot_license_unsupported_filetype( - fake_repository, stringio, mock_date_today -): - """Add a header to a .license file if --force-dot-license is given, with the - base file being an otherwise unsupported filetype. - """ - simple_file = fake_repository / "foo.txt" - simple_file.write_text("Preserve this") - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--force-dot-license", - "foo.txt", - ], - out=stringio, - ) - - assert result == 0 - assert ( - simple_file.with_name(f"{simple_file.name}.license").read_text().strip() - == expected - ) - assert simple_file.read_text() == "Preserve this" - - -def test_annotate_force_dot_license_doesnt_write_to_file( - fake_repository, stringio, mock_date_today -): - """Adding a header to a .license file if --force-dot-license is given, - doesn't require write permission to the file, just the directory. - """ - simple_file = fake_repository / "foo.txt" - simple_file.write_text("Preserve this") - simple_file.chmod(mode=stat.S_IREAD) - expected = cleandoc( - """ - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--force-dot-license", - "foo.txt", - ], - out=stringio, - ) - - assert result == 0 - assert ( - simple_file.with_name(f"{simple_file.name}.license").read_text().strip() - == expected - ) - assert simple_file.read_text() == "Preserve this" - - -def test_annotate_to_read_only_file_does_not_traceback( - fake_repository, stringio, mock_date_today -): - """Trying to add a header without having write permission, shouldn't result - in a traceback. See issue #398""" - _file = fake_repository / "test.sh" - _file.write_text("#!/bin/sh") - _file.chmod(mode=stat.S_IREAD) - with pytest.raises(SystemExit) as info: - main( - [ - "annotate", - "--license", - "Apache-2.0", - "--copyright", - "mycorp", - "--style", - "python", - "test.sh", - ] - ) - assert info.value # should not exit with 0 - - -def test_annotate_license_file(fake_repository, stringio, mock_date_today): - """Add a header to a .license file if it exists.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("foo") - license_file = fake_repository / "foo.py.license" - license_file.write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2016 John Doe - - Hello - """ - ) - ) - expected = ( - cleandoc( - """ - SPDX-FileCopyrightText: 2016 John Doe - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - + "\n" - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert license_file.read_text() == expected - assert simple_file.read_text() == "foo" - - -def test_annotate_license_file_only_one_newline( - fake_repository, stringio, mock_date_today -): - """When a header is added to a .license file that already ends with a - newline, the new header should end with a single newline. - """ - simple_file = fake_repository / "foo.py" - simple_file.write_text("foo") - license_file = fake_repository / "foo.py.license" - license_file.write_text( - cleandoc( - """ - SPDX-FileCopyrightText: 2016 John Doe - - Hello - """ - ) - + "\n" - ) - expected = ( - cleandoc( - """ - SPDX-FileCopyrightText: 2016 John Doe - SPDX-FileCopyrightText: 2018 Jane Doe - - SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - + "\n" - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert license_file.read_text() == expected - assert simple_file.read_text() == "foo" - - -def test_annotate_year_mutually_exclusive(fake_repository): - """--exclude-year and --year are mutually exclusive.""" - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--exclude-year", - "--year", - "2020", - "src/source_code.py", - ] - ) - - -def test_annotate_single_multi_line_mutually_exclusive(fake_repository): - """--single-line and --multi-line are mutually exclusive.""" - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--single-line", - "--multi-line", - "src/source_code.c", - ] - ) - - -def test_annotate_skip_force_mutually_exclusive(fake_repository): - """--skip-unrecognised and --force-dot-license are mutually exclusive.""" - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--force-dot-license", - "--skip-unrecognised", - "src/source_code.py", - ] - ) - - -def test_annotate_multi_line_not_supported(fake_repository): - """Expect a fail if --multi-line is not supported for a file type.""" - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--multi-line", - "src/source_code.py", - ] - ) - - -def test_annotate_multi_line_not_supported_custom_style( - fake_repository, capsys -): - """--multi-line also fails when used with a style that doesn't support it - through --style. - """ - (fake_repository / "foo.foo").write_text("foo") - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--multi-line", - "--force-dot-license", - "--style", - "python", - "foo.foo", - ], - ) - - assert "'foo.foo' does not support multi-line" in capsys.readouterr().err - - -def test_annotate_single_line_not_supported(fake_repository): - """Expect a fail if --single-line is not supported for a file type.""" - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--single-line", - "src/source_code.html", - ] - ) - - -def test_annotate_force_multi_line_for_c( - fake_repository, stringio, mock_date_today -): - """--multi-line forces a multi-line comment for C.""" - simple_file = fake_repository / "foo.c" - simple_file.write_text("foo") - expected = cleandoc( - """ - /* - * SPDX-FileCopyrightText: 2018 Jane Doe - * - * SPDX-License-Identifier: GPL-3.0-or-later - */ - - foo - """ - ) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--multi-line", - "foo.c", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == expected - - -@pytest.mark.parametrize("line_ending", ["\r\n", "\r", "\n"]) -def test_annotate_line_endings( - empty_directory, stringio, mock_date_today, line_ending -): - """Given a file with a certain type of line ending, preserve it.""" - simple_file = empty_directory / "foo.py" - simple_file.write_bytes( - line_ending.encode("utf-8").join([b"hello", b"world"]) - ) - expected = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - hello - world - """ - ).replace("\n", line_ending) - - result = main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - with open(simple_file, newline="", encoding="utf-8") as fp: - contents = fp.read() - - assert contents == expected - - -def test_annotate_skip_existing(fake_repository, stringio, mock_date_today): - """When annotate --skip-existing on a file that already contains REUSE info, - don't write additional information to it. - """ - for path in ("foo.py", "bar.py"): - (fake_repository / path).write_text("pass") - expected_foo = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - expected_bar = cleandoc( - """ - # SPDX-FileCopyrightText: 2018 John Doe - # - # SPDX-License-Identifier: MIT - - pass - """ - ) - - main( - [ - "annotate", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "foo.py", - ], - out=stringio, - ) - - result = main( - [ - "annotate", - "--license", - "MIT", - "--copyright", - "John Doe", - "--skip-existing", - "foo.py", - "bar.py", - ] - ) - - assert result == 0 - assert (fake_repository / "foo.py").read_text() == expected_foo - assert (fake_repository / "bar.py").read_text() == expected_bar - - -def test_annotate_recursive(fake_repository, stringio, mock_date_today): - """Add a header to a directory recursively.""" - (fake_repository / "src/one/two").mkdir(parents=True) - (fake_repository / "src/one/two/foo.py").write_text( - cleandoc( - """ - # SPDX-License-Identifier: GPL-3.0-or-later - """ - ) - ) - (fake_repository / "src/hello.py").touch() - (fake_repository / "src/one/world.py").touch() - (fake_repository / "bar").mkdir(parents=True) - (fake_repository / "bar/bar.py").touch() - - result = main( - [ - "annotate", - "--copyright", - "Joe Somebody", - "--recursive", - "src/", - ], - out=stringio, - ) - - for path in (fake_repository / "src").rglob("src/**"): - content = path.read_text() - assert "SPDX-FileCopyrightText: 2018 Joe Somebody" in content - - assert "Joe Somebody" not in (fake_repository / "bar/bar.py").read_text() - assert result == 0 - - -def test_annotate_recursive_on_file(fake_repository, stringio, mock_date_today): - """Don't expect errors when annotate is run 'recursively' on a file.""" - result = main( - [ - "annotate", - "--copyright", - "Joe Somebody", - "--recursive", - "src/source_code.py", - ], - out=stringio, - ) - - assert ( - "Joe Somebody" in (fake_repository / "src/source_code.py").read_text() - ) - assert result == 0 - - -def test_annotate_exit_if_unrecognised( - fake_repository, stringio, mock_date_today -): - """Expect error and no edited files if at least one file has not been - recognised, with --exit-if-unrecognised enabled.""" - (fake_repository / "baz").mkdir(parents=True) - (fake_repository / "baz/foo.py").write_text("foo") - (fake_repository / "baz/bar.unknown").write_text("bar") - (fake_repository / "baz/baz.sh").write_text("baz") - - with pytest.raises(SystemExit): - main( - [ - "annotate", - "--license", - "Apache-2.0", - "--copyright", - "Jane Doe", - "--recursive", - "--exit-if-unrecognised", - "baz/", - ] - ) - - assert "Jane Doe" not in (fake_repository / "baz/foo.py").read_text() - - -# REUSE-IgnoreEnd diff --git a/tests/test_main_annotate_merge.py b/tests/test_main_annotate_merge.py deleted file mode 100644 index 9f60de082..000000000 --- a/tests/test_main_annotate_merge.py +++ /dev/null @@ -1,260 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Liam Beguin -# SPDX-FileCopyrightText: 2024 Rivos Inc. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Tests for reuse._main: annotate merge-copyrights option""" - -from inspect import cleandoc - -from reuse._main import main -from reuse._util import _COPYRIGHT_PREFIXES - -# pylint: disable=unused-argument - -# REUSE-IgnoreStart - - -def test_annotate_merge_copyrights_simple(fake_repository, stringio): - """Add multiple headers to a file with merge copyrights.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - - result = main( - [ - "annotate", - "--year", - "2016", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Mary Sue", - "--merge-copyrights", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == cleandoc( - """ - # SPDX-FileCopyrightText: 2016 Mary Sue - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--year", - "2018", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Mary Sue", - "--merge-copyrights", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == cleandoc( - """ - # SPDX-FileCopyrightText: 2016 - 2018 Mary Sue - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - -def test_annotate_merge_copyrights_multi_prefix(fake_repository, stringio): - """Add multiple headers to a file with merge copyrights.""" - simple_file = fake_repository / "foo.py" - simple_file.write_text("pass") - - for i in range(0, 3): - result = main( - [ - "annotate", - "--year", - str(2010 + i), - "--license", - "GPL-3.0-or-later", - "--copyright", - "Mary Sue", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - - for i in range(0, 5): - result = main( - [ - "annotate", - "--year", - str(2015 + i), - "--license", - "GPL-3.0-or-later", - "--copyright-prefix", - "string-c", - "--copyright", - "Mary Sue", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - - assert simple_file.read_text() == cleandoc( - """ - # Copyright (C) 2015 Mary Sue - # Copyright (C) 2016 Mary Sue - # Copyright (C) 2017 Mary Sue - # Copyright (C) 2018 Mary Sue - # Copyright (C) 2019 Mary Sue - # SPDX-FileCopyrightText: 2010 Mary Sue - # SPDX-FileCopyrightText: 2011 Mary Sue - # SPDX-FileCopyrightText: 2012 Mary Sue - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--year", - "2018", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Mary Sue", - "--merge-copyrights", - "foo.py", - ], - out=stringio, - ) - - assert result == 0 - assert simple_file.read_text() == cleandoc( - """ - # Copyright (C) 2010 - 2019 Mary Sue - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - -def test_annotate_merge_copyrights_no_year_in_existing( - fake_repository, stringio, mock_date_today -): - """This checks the issue reported in - . If an existing copyright - line doesn't have a year, everything should still work. - """ - (fake_repository / "foo.py").write_text( - cleandoc( - """ - # SPDX-FileCopyrightText: Jane Doe - """ - ) - ) - main( - [ - "annotate", - "--merge-copyrights", - "--copyright", - "John Doe", - "foo.py", - ] - ) - assert ( - cleandoc( - """ - # SPDX-FileCopyrightText: 2018 John Doe - # SPDX-FileCopyrightText: Jane Doe - """ - ) - in (fake_repository / "foo.py").read_text() - ) - - -def test_annotate_merge_copyrights_all_prefixes( - fake_repository, stringio, mock_date_today -): - """Test that merging works for all copyright prefixes.""" - # TODO: there should probably also be a test for mixing copyright prefixes, - # but this behaviour is really unpredictable to me at the moment, and the - # whole copyright-line-as-string thing needs overhauling. - simple_file = fake_repository / "foo.py" - for copyright_prefix, copyright_string in _COPYRIGHT_PREFIXES.items(): - simple_file.write_text("pass") - result = main( - [ - "annotate", - "--year", - "2016", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--copyright-style", - copyright_prefix, - "--merge-copyrights", - "foo.py", - ], - out=stringio, - ) - assert result == 0 - assert simple_file.read_text(encoding="utf-8") == cleandoc( - f""" - # {copyright_string} 2016 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - result = main( - [ - "annotate", - "--year", - "2018", - "--license", - "GPL-3.0-or-later", - "--copyright", - "Jane Doe", - "--copyright-style", - copyright_prefix, - "--merge-copyrights", - "foo.py", - ], - out=stringio, - ) - assert result == 0 - assert simple_file.read_text(encoding="utf-8") == cleandoc( - f""" - # {copyright_string} 2016 - 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-3.0-or-later - - pass - """ - ) - - -# REUSE-IgnoreEnd diff --git a/tests/test_util.py b/tests/test_util.py index a081b3d0f..e26445fe8 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -11,14 +11,11 @@ """Tests for reuse._util""" import os -from argparse import ArgumentTypeError from inspect import cleandoc from io import BytesIO -from pathlib import Path import pytest from boolean.boolean import ParseError -from conftest import no_root, posix from reuse import _util from reuse._util import _LICENSING @@ -489,138 +486,6 @@ def test_make_copyright_line_multine_error(): _util.make_copyright_line("hello\nworld") -# pylint: disable=unused-argument - - -def test_pathtype_read_simple(fake_repository): - """Get a Path to a readable file.""" - result = _util.PathType("r")("src/source_code.py") - - assert result == Path("src/source_code.py") - - -def test_pathtype_read_directory(fake_repository): - """Get a Path to a readable directory.""" - result = _util.PathType("r")("src") - - assert result == Path("src") - - -def test_pathtype_read_directory_force_file(fake_repository): - """Cannot read a directory when a file is forced.""" - with pytest.raises(ArgumentTypeError): - _util.PathType("r", force_file=True)("src") - - -@no_root -@posix -def test_pathtype_read_not_readable(fake_repository): - """Cannot read a nonreadable file.""" - try: - os.chmod("src/source_code.py", 0o000) - - with pytest.raises(ArgumentTypeError): - _util.PathType("r")("src/source_code.py") - finally: - os.chmod("src/source_code.py", 0o777) - - -def test_pathtype_read_not_exists(empty_directory): - """Cannot read a file that does not exist.""" - with pytest.raises(ArgumentTypeError): - _util.PathType("r")("foo.py") - - -def test_pathtype_read_write_not_exists(empty_directory): - """Cannot read/write a file that does not exist.""" - with pytest.raises(ArgumentTypeError): - _util.PathType("r+")("foo.py") - - -@no_root -@posix -def test_pathtype_read_write_only_write(empty_directory): - """A write-only file loaded with read/write needs both permissions.""" - path = Path("foo.py") - path.touch() - - try: - path.chmod(0o222) - - with pytest.raises(ArgumentTypeError): - _util.PathType("r+")("foo.py") - finally: - path.chmod(0o777) - - -@no_root -@posix -def test_pathtype_read_write_only_read(empty_directory): - """A read-only file loaded with read/write needs both permissions.""" - path = Path("foo.py") - path.touch() - - try: - path.chmod(0o444) - - with pytest.raises(ArgumentTypeError): - _util.PathType("r+")("foo.py") - finally: - path.chmod(0o777) - - -def test_pathtype_write_not_exists(empty_directory): - """Get a Path for a file that does not exist.""" - result = _util.PathType("w")("foo.py") - - assert result == Path("foo.py") - - -def test_pathtype_write_exists(fake_repository): - """Get a Path for a file that exists.""" - result = _util.PathType("w")("src/source_code.py") - - assert result == Path("src/source_code.py") - - -def test_pathtype_write_directory(fake_repository): - """Cannot write to directory.""" - with pytest.raises(ArgumentTypeError): - _util.PathType("w")("src") - - -@no_root -@posix -def test_pathtype_write_exists_but_not_writeable(fake_repository): - """Cannot get Path of file that exists but isn't writeable.""" - os.chmod("src/source_code.py", 0o000) - - with pytest.raises(ArgumentTypeError): - _util.PathType("w")("src/source_code.py") - - os.chmod("src/source_code.py", 0o777) - - -@no_root -@posix -def test_pathtype_write_not_exist_but_directory_not_writeable(fake_repository): - """Cannot get Path of file that does not exist but directory isn't - writeable. - """ - os.chmod("src", 0o000) - - with pytest.raises(ArgumentTypeError): - _util.PathType("w")("src/foo.py") - - os.chmod("src", 0o777) - - -def test_pathtype_invalid_mode(empty_directory): - """Only valid modes are 'r' and 'w'.""" - with pytest.raises(ValueError): - _util.PathType("o") - - def test_decoded_text_from_binary_simple(): """A unicode string encoded as bytes object decodes back correctly.""" text = "Hello, world ☺" @@ -642,22 +507,6 @@ def test_decoded_text_from_binary_crlf(): assert _util.decoded_text_from_binary(BytesIO(encoded)) == "Hello\nworld" -def test_similar_spdx_identifiers_typo(): - """Given a misspelt SPDX License Identifier, suggest a better one.""" - result = _util.similar_spdx_identifiers("GPL-3.0-or-lter") - - assert "GPL-3.0-or-later" in result - assert "AGPL-3.0-or-later" in result - assert "LGPL-3.0-or-later" in result - - -def test_similar_spdx_identifiers_prefix(): - """Given an incomplete SPDX License Identifier, suggest a better one.""" - result = _util.similar_spdx_identifiers("CC0") - - assert "CC0-1.0" in result - - def test_detect_line_endings_windows(): """Given a CRLF string, detect the line endings.""" assert _util.detect_line_endings("hello\r\nworld") == "\r\n" From 74f715f660175b0948989c77adc798e6b0efa511 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 10:59:28 +0200 Subject: [PATCH 076/156] Use click for pot file generation Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/gettext.yaml | 5 ++++- .gitignore | 1 - Makefile | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gettext.yaml b/.github/workflows/gettext.yaml index c86d6e81b..b2d9c0c0c 100644 --- a/.github/workflows/gettext.yaml +++ b/.github/workflows/gettext.yaml @@ -25,6 +25,9 @@ jobs: token: ${{ secrets.FSFE_SYSTEM_TOKEN }} - name: Install gettext and wlc run: sudo apt-get install -y gettext wlc + # We mostly install reuse to install the click dependency. + - name: Install reuse + run: poetry install --no-interaction --only main - name: Lock Weblate run: | wlc --url https://hosted.weblate.org/api/ --key ${{secrets.WEBLATE_KEY }} lock fsfe/reuse-tool @@ -34,7 +37,7 @@ jobs: - name: Pull Weblate translations run: git pull origin main - name: Create .pot file - run: make create-pot + run: poetry run make create-pot # Normally, POT-Creation-Date changes in two locations. Check if the diff # includes more than just those two lines. - name: Check if sufficient lines were changed diff --git a/.gitignore b/.gitignore index 880aee8b9..466122efe 100644 --- a/.gitignore +++ b/.gitignore @@ -147,7 +147,6 @@ dmypy.json # End of https://www.gitignore.io/api/linux,python -po/reuse.pot *.mo docs/api/ docs/history.md diff --git a/Makefile b/Makefile index 8626dcd1f..7edcd64f8 100644 --- a/Makefile +++ b/Makefile @@ -67,8 +67,8 @@ dist: clean-build clean-pyc clean-docs ## builds source and wheel package .PHONY: create-pot create-pot: ## generate .pot file xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot src/reuse/**.py - xgettext --add-comments --output=po/argparse.pot /usr/lib*/python3*/argparse.py - msgcat --output=po/reuse.pot po/reuse.pot po/argparse.pot + xgettext --add-comments --output=po/click.pot "${VIRTUAL_ENV}"/lib/python*/*-packages/click/**.py + msgcat --output=po/reuse.pot po/reuse.pot po/click.pot for name in po/*.po; do \ msgmerge --output=$${name} $${name} po/reuse.pot; \ done From 18dac76b385009528b7b808bf4da83cb86031669 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 11:04:20 +0200 Subject: [PATCH 077/156] Use class-based gettext Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_annotate.py | 2 +- src/reuse/_util.py | 2 +- src/reuse/global_licensing.py | 2 +- src/reuse/header.py | 2 +- src/reuse/lint.py | 2 +- src/reuse/project.py | 2 +- src/reuse/report.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index a2644c95a..abfead236 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -17,7 +17,6 @@ import logging import sys -from gettext import gettext as _ from typing import IO, Optional, Type, cast from jinja2 import Environment, FileSystemLoader, Template @@ -38,6 +37,7 @@ EmptyCommentStyle, ) from .header import MissingReuseInfo, add_new_header, find_and_replace_header +from .i18n import _ from .project import Project _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 222629fef..5683c3fac 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -20,7 +20,6 @@ import shutil import subprocess from collections import Counter -from gettext import gettext as _ from hashlib import sha1 from inspect import cleandoc from itertools import chain @@ -39,6 +38,7 @@ UncommentableCommentStyle, _all_style_classes, ) +from .i18n import _ StrPath = Union[str, PathLike[str]] diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 1d9d4aec4..64ecfc26f 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -11,7 +11,6 @@ from abc import ABC, abstractmethod from collections import defaultdict from enum import Enum -from gettext import gettext as _ from pathlib import Path, PurePath from typing import ( Any, @@ -37,6 +36,7 @@ from . import ReuseException, ReuseInfo, SourceType from ._util import _LICENSING, StrPath from .covered_files import iter_files +from .i18n import _ from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/header.py b/src/reuse/header.py index bf7b9abb7..06d838c6d 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -16,7 +16,6 @@ import logging import re -from gettext import gettext as _ from typing import NamedTuple, Optional, Sequence, Type, cast from boolean.boolean import ParseError @@ -36,6 +35,7 @@ EmptyCommentStyle, PythonCommentStyle, ) +from .i18n import _ _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/lint.py b/src/reuse/lint.py index 781cd6583..7d60d7129 100644 --- a/src/reuse/lint.py +++ b/src/reuse/lint.py @@ -10,13 +10,13 @@ """ import json -from gettext import gettext as _ from io import StringIO from pathlib import Path from textwrap import TextWrapper from typing import Any, Optional from . import __REUSE_version__ +from .i18n import _ from .report import ProjectReport, ProjectReportSubsetProtocol diff --git a/src/reuse/project.py b/src/reuse/project.py index c4f12038c..21692bf5e 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -15,7 +15,6 @@ import os import warnings from collections import defaultdict -from gettext import gettext as _ from pathlib import Path from typing import Collection, Iterator, NamedTuple, Optional, Type @@ -39,6 +38,7 @@ ReuseDep5, ReuseTOML, ) +from .i18n import _ from .vcs import VCSStrategy, VCSStrategyNone, all_vcs_strategies _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/report.py b/src/reuse/report.py index fff28242b..c121dc9e9 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -16,7 +16,6 @@ import logging import multiprocessing as mp import random -from gettext import gettext as _ from hashlib import md5 from io import StringIO from os import cpu_count @@ -35,6 +34,7 @@ from . import __REUSE_version__, __version__ from ._util import _LICENSEREF_PATTERN, _LICENSING, StrPath, _checksum from .global_licensing import ReuseDep5 +from .i18n import _ from .project import Project, ReuseInfo _LOGGER = logging.getLogger(__name__) From d17dde504ad16304c00ef75e0ec673a24b99f651 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 11:27:21 +0200 Subject: [PATCH 078/156] Move some functions to comment.py This required quite some re-plumbing. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_annotate.py | 6 +++--- src/reuse/_util.py | 37 +++-------------------------------- src/reuse/cli/annotate.py | 24 +++++++++++++++-------- src/reuse/cli/download.py | 2 +- src/reuse/comment.py | 27 ++++++++++++++++++++++++- src/reuse/covered_files.py | 2 +- src/reuse/download.py | 3 ++- src/reuse/global_licensing.py | 3 ++- src/reuse/project.py | 2 +- src/reuse/report.py | 3 ++- src/reuse/types.py | 11 +++++++++++ src/reuse/vcs.py | 2 +- 12 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 src/reuse/types.py diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index abfead236..e914f5c27 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -24,9 +24,7 @@ from . import ReuseInfo from ._util import ( - StrPath, _determine_license_suffix_path, - _get_comment_style, contains_reuse_info, detect_line_endings, ) @@ -35,10 +33,12 @@ CommentCreateError, CommentStyle, EmptyCommentStyle, + get_comment_style, ) from .header import MissingReuseInfo, add_new_header, find_and_replace_header from .i18n import _ from .project import Project +from .types import StrPath _LOGGER = logging.getLogger(__name__) @@ -89,7 +89,7 @@ def add_header_to_file( cast(str, style) ) if comment_style is None: - comment_style = _get_comment_style(path) + comment_style = get_comment_style(path) if comment_style is None: if skip_unrecognised: out.write(_("Skipped unrecognised file '{path}'").format(path=path)) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 5683c3fac..04af137d5 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -23,24 +23,16 @@ from hashlib import sha1 from inspect import cleandoc from itertools import chain -from os import PathLike from pathlib import Path -from typing import IO, Any, BinaryIO, Iterator, Optional, Type, Union, cast +from typing import IO, Any, BinaryIO, Iterator, Optional, Union from boolean.boolean import ParseError from license_expression import ExpressionError, Licensing from . import ReuseInfo, SourceType -from .comment import ( - EXTENSION_COMMENT_STYLE_MAP_LOWERCASE, - FILENAME_COMMENT_STYLE_MAP_LOWERCASE, - CommentStyle, - UncommentableCommentStyle, - _all_style_classes, -) +from .comment import _all_style_classes # TODO: This import is not ideal here. from .i18n import _ - -StrPath = Union[str, PathLike[str]] +from .types import StrPath GIT_EXE = shutil.which("git") HG_EXE = shutil.which("hg") @@ -255,29 +247,6 @@ def _contains_snippet(binary_file: BinaryIO) -> bool: return False -# FIXME: move to comment.py -def _get_comment_style(path: StrPath) -> Optional[Type[CommentStyle]]: - """Return value of CommentStyle detected for *path* or None.""" - path = Path(path) - style = FILENAME_COMMENT_STYLE_MAP_LOWERCASE.get(path.name.lower()) - if style is None: - style = cast( - Optional[Type[CommentStyle]], - EXTENSION_COMMENT_STYLE_MAP_LOWERCASE.get(path.suffix.lower()), - ) - return style - - -def _is_uncommentable(path: Path) -> bool: - """*path*'s extension has the UncommentableCommentStyle.""" - return _get_comment_style(path) == UncommentableCommentStyle - - -def _has_style(path: Path) -> bool: - """*path*'s extension has a CommentStyle.""" - return _get_comment_style(path) is not None - - def merge_copyright_lines(copyright_lines: set[str]) -> set[str]: """Parse all copyright lines and merge identical statements making years into a range. diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index b70f31570..25f92cf8f 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -33,12 +33,15 @@ _COPYRIGHT_PREFIXES, _determine_license_path, _determine_license_suffix_path, - _get_comment_style, - _has_style, - _is_uncommentable, make_copyright_line, ) -from ..comment import NAME_STYLE_MAP, CommentStyle +from ..comment import ( + NAME_STYLE_MAP, + CommentStyle, + get_comment_style, + has_style, + is_uncommentable, +) from ..i18n import _ from ..project import Project from .common import ClickObj, MutexOption, spdx_identifier @@ -110,7 +113,7 @@ def verify_paths_comment_style( unrecognised_files: set[Path] = set() for path in paths: - if not _has_style(path): + if not has_style(path): unrecognised_files.add(path) if unrecognised_files: @@ -140,7 +143,7 @@ def verify_paths_line_handling( if forced_style is not None: style = NAME_STYLE_MAP.get(forced_style) if style is None: - style = _get_comment_style(path) + style = get_comment_style(path) # This shouldn't happen because of prior tests, so let's not bother with # this case. if style is None: @@ -255,9 +258,14 @@ def get_reuse_info( contributor_lines=set(contributors), ) + _YEAR_MUTEX = ["years", "exclude_year"] _LINE_MUTEX = ["single_line", "multi_line"] -_STYLE_MUTEX = ["force_dot_license", "fallback_dot_license", "skip_unrecognised"] +_STYLE_MUTEX = [ + "force_dot_license", + "fallback_dot_license", + "skip_unrecognised", +] _HELP = ( _("Add copyright and licensing into the header of one or more" " files.") @@ -454,7 +462,7 @@ def annotate( result = 0 for path in paths: binary = is_binary(str(path)) - if binary or _is_uncommentable(path) or force_dot_license: + if binary or is_uncommentable(path) or force_dot_license: new_path = _determine_license_suffix_path(path) if binary: _LOGGER.info( diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index 007e09a33..d3a318733 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -15,11 +15,11 @@ import click from .._licenses import ALL_NON_DEPRECATED_MAP -from .._util import StrPath from ..download import _path_to_license_file, put_license_in_file from ..i18n import _ from ..project import Project from ..report import ProjectReport +from ..types import StrPath from .common import ClickObj, MutexOption from .main import main diff --git a/src/reuse/comment.py b/src/reuse/comment.py index ac1253ab5..ac2e415f5 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -28,8 +28,11 @@ import logging import operator import re +from pathlib import Path from textwrap import dedent -from typing import NamedTuple, Optional, Type +from typing import NamedTuple, Optional, Type, cast + +from .types import StrPath _LOGGER = logging.getLogger(__name__) @@ -923,3 +926,25 @@ def _all_style_classes() -> list[Type[CommentStyle]]: #: A map of human-friendly names against style classes. NAME_STYLE_MAP = {style.SHORTHAND: style for style in _result} + + +def get_comment_style(path: StrPath) -> Optional[Type[CommentStyle]]: + """Return value of CommentStyle detected for *path* or None.""" + path = Path(path) + style = FILENAME_COMMENT_STYLE_MAP_LOWERCASE.get(path.name.lower()) + if style is None: + style = cast( + Optional[Type[CommentStyle]], + EXTENSION_COMMENT_STYLE_MAP_LOWERCASE.get(path.suffix.lower()), + ) + return style + + +def is_uncommentable(path: Path) -> bool: + """*path*'s extension has the UncommentableCommentStyle.""" + return get_comment_style(path) == UncommentableCommentStyle + + +def has_style(path: Path) -> bool: + """*path*'s extension has a CommentStyle.""" + return get_comment_style(path) is not None diff --git a/src/reuse/covered_files.py b/src/reuse/covered_files.py index 549b331f7..ad4e019b6 100644 --- a/src/reuse/covered_files.py +++ b/src/reuse/covered_files.py @@ -19,7 +19,7 @@ _IGNORE_FILE_PATTERNS, _IGNORE_MESON_PARENT_DIR_PATTERNS, ) -from ._util import StrPath +from .types import StrPath from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/download.py b/src/reuse/download.py index 3de8fc62e..0901da70c 100644 --- a/src/reuse/download.py +++ b/src/reuse/download.py @@ -15,8 +15,9 @@ from urllib.error import URLError from urllib.parse import urljoin -from ._util import _LICENSEREF_PATTERN, StrPath, find_licenses_directory +from ._util import _LICENSEREF_PATTERN, find_licenses_directory from .project import Project +from .types import StrPath from .vcs import VCSStrategyNone _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 64ecfc26f..3a0415294 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -34,9 +34,10 @@ from license_expression import ExpressionError from . import ReuseException, ReuseInfo, SourceType -from ._util import _LICENSING, StrPath +from ._util import _LICENSING from .covered_files import iter_files from .i18n import _ +from .types import StrPath from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/project.py b/src/reuse/project.py index 21692bf5e..7895313fa 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -25,7 +25,6 @@ from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( _LICENSEREF_PATTERN, - StrPath, _determine_license_path, relative_from_root, reuse_info_of_file, @@ -39,6 +38,7 @@ ReuseTOML, ) from .i18n import _ +from .types import StrPath from .vcs import VCSStrategy, VCSStrategyNone, all_vcs_strategies _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/report.py b/src/reuse/report.py index c121dc9e9..f3e5eeaa8 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -32,10 +32,11 @@ from uuid import uuid4 from . import __REUSE_version__, __version__ -from ._util import _LICENSEREF_PATTERN, _LICENSING, StrPath, _checksum +from ._util import _LICENSEREF_PATTERN, _LICENSING, _checksum from .global_licensing import ReuseDep5 from .i18n import _ from .project import Project, ReuseInfo +from .types import StrPath _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/types.py b/src/reuse/types.py new file mode 100644 index 000000000..0c86917b5 --- /dev/null +++ b/src/reuse/types.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Some typing definitions.""" + +from os import PathLike +from typing import Union + +#: Something that looks like a path. +StrPath = Union[str, PathLike[str]] diff --git a/src/reuse/vcs.py b/src/reuse/vcs.py index eaec9f7ac..135c91393 100644 --- a/src/reuse/vcs.py +++ b/src/reuse/vcs.py @@ -22,10 +22,10 @@ HG_EXE, JUJUTSU_EXE, PIJUL_EXE, - StrPath, execute_command, relative_from_root, ) +from .types import StrPath if TYPE_CHECKING: from .project import Project From 95d5e3ca9214a1dacf5ce8ccaadc332d2082b87a Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 13:54:46 +0200 Subject: [PATCH 079/156] Clean up after big refactoring Having refactored argparse to click, this is just cleanup afterwards. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__main__.py | 7 ++-- src/reuse/cli/__init__.py | 2 ++ src/reuse/cli/annotate.py | 9 +++-- src/reuse/cli/common.py | 12 ++++++- src/reuse/cli/convert_dep5.py | 4 ++- src/reuse/cli/download.py | 5 +-- src/reuse/cli/lint.py | 4 ++- src/reuse/cli/lint_file.py | 4 ++- src/reuse/cli/main.py | 52 ++++++++++++++++------------- src/reuse/cli/spdx.py | 11 +++--- src/reuse/cli/supported_licenses.py | 1 + src/reuse/report.py | 4 +-- tests/test_cli_annotate.py | 9 +++-- tests/test_cli_convert_dep5.py | 2 ++ tests/test_cli_spdx.py | 2 ++ 15 files changed, 81 insertions(+), 47 deletions(-) diff --git a/src/reuse/__main__.py b/src/reuse/__main__.py index 952a87b7d..f5c3e2606 100644 --- a/src/reuse/__main__.py +++ b/src/reuse/__main__.py @@ -4,9 +4,8 @@ """Entry module for reuse.""" -import sys - if __name__ == "__main__": - from ._main import main + from .cli.main import main - sys.exit(main()) + # pylint: disable=no-value-for-parameter + main() diff --git a/src/reuse/cli/__init__.py b/src/reuse/cli/__init__.py index c0a7798af..2138eeb27 100644 --- a/src/reuse/cli/__init__.py +++ b/src/reuse/cli/__init__.py @@ -2,6 +2,8 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +"""All command-line functionality.""" + from . import ( annotate, convert_dep5, diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index 25f92cf8f..f32fc9b31 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -44,7 +44,7 @@ ) from ..i18n import _ from ..project import Project -from .common import ClickObj, MutexOption, spdx_identifier +from .common import ClickObj, MutexOption, requires_project, spdx_identifier from .main import main _LOGGER = logging.getLogger(__name__) @@ -284,6 +284,7 @@ def get_reuse_info( ) +@requires_project @main.command(name="annotate", help=_HELP) @click.option( "--copyright", @@ -323,7 +324,7 @@ def get_reuse_info( "--style", "-s", cls=MutexOption, - mutually_exclusive=["skip_unrecognised"], # FIXME: test + mutually_exclusive=["skip_unrecognised"], type=click.Choice(list(NAME_STYLE_MAP)), help=_("Comment style to use."), ) @@ -359,8 +360,6 @@ def get_reuse_info( @click.option( "--single-line", cls=MutexOption, - # FIXME: This results in an ugly error message that shows 'multi_line' - # instead of '--multi-line'. mutually_exclusive=_LINE_MUTEX, is_flag=True, help=_("Force single-line comment style."), @@ -407,7 +406,6 @@ def get_reuse_info( @click.option( "--skip-unrecognized", "skip_unrecognised", - # FIXME: test if mutex is applied. is_flag=True, hidden=True, ) @@ -444,6 +442,7 @@ def annotate( skip_existing: bool, paths: Sequence[Path], ) -> None: + # pylint: disable=too-many-arguments,too-many-locals,missing-function-docstring project = cast(Project, obj.project) test_mandatory_option_required(copyrights, licenses, contributors) diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index 7840dd1f1..88189bfcf 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -5,7 +5,7 @@ """Utilities that are common to multiple CLI commands.""" from dataclasses import dataclass -from typing import Any, Mapping, Optional +from typing import Any, Callable, Mapping, Optional, TypeVar import click from boolean.boolean import Expression, ParseError @@ -15,6 +15,16 @@ from ..i18n import _ from ..project import Project +F = TypeVar("F", bound=Callable) + + +def requires_project(f: F) -> F: + """A decorator to mark subcommands that require a :class:`Project` object. + Make sure to apply this decorator _first_. + """ + setattr(f, "requires_project", True) + return f + @dataclass(frozen=True) class ClickObj: diff --git a/src/reuse/cli/convert_dep5.py b/src/reuse/cli/convert_dep5.py index 99d4911a4..f213bc33d 100644 --- a/src/reuse/cli/convert_dep5.py +++ b/src/reuse/cli/convert_dep5.py @@ -13,7 +13,7 @@ from ..global_licensing import ReuseDep5 from ..i18n import _ from ..project import Project -from .common import ClickObj +from .common import ClickObj, requires_project from .main import main _HELP = _( @@ -23,9 +23,11 @@ ) +@requires_project @main.command(name="convert-dep5", help=_HELP) @click.pass_obj def convert_dep5(obj: ClickObj) -> None: + # pylint: disable=missing-function-docstring project = cast(Project, obj.project) if not (project.root / ".reuse/dep5").exists(): raise click.UsageError(_("no '.reuse/dep5' file")) diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index d3a318733..a1d57b915 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -20,7 +20,7 @@ from ..project import Project from ..report import ProjectReport from ..types import StrPath -from .common import ClickObj, MutexOption +from .common import ClickObj, MutexOption, requires_project from .main import main _LOGGER = logging.getLogger(__name__) @@ -113,6 +113,7 @@ def _successfully_downloaded(destination: StrPath) -> None: ) +@requires_project @main.command(name="download", help=_HELP) @click.option( "--all", @@ -152,7 +153,7 @@ def download( output: Optional[Path], source: Optional[Path], ) -> None: - + # pylint: disable=missing-function-docstring if all_ and license_: raise click.UsageError( _( diff --git a/src/reuse/cli/lint.py b/src/reuse/cli/lint.py index 11d3305ba..f4545081f 100644 --- a/src/reuse/cli/lint.py +++ b/src/reuse/cli/lint.py @@ -18,7 +18,7 @@ from ..lint import format_json, format_lines, format_plain from ..project import Project from ..report import ProjectReport -from .common import ClickObj, MutexOption +from .common import ClickObj, MutexOption, requires_project from .main import main _OUTPUT_MUTEX = ["quiet", "json", "plain", "lines"] @@ -61,6 +61,7 @@ ) +@requires_project @main.command(name="lint", help=_HELP) @click.option( "--quiet", @@ -98,6 +99,7 @@ def lint( obj: ClickObj, quiet: bool, json: bool, plain: bool, lines: bool ) -> None: + # pylint: disable=missing-function-docstring report = ProjectReport.generate( cast(Project, obj.project), do_checksum=False, diff --git a/src/reuse/cli/lint_file.py b/src/reuse/cli/lint_file.py index 0b42d9db8..7de7d83e1 100644 --- a/src/reuse/cli/lint_file.py +++ b/src/reuse/cli/lint_file.py @@ -17,7 +17,7 @@ from ..lint import format_lines_subset from ..project import Project from ..report import ProjectSubsetReport -from .common import ClickObj, MutexOption +from .common import ClickObj, MutexOption, requires_project from .main import main _OUTPUT_MUTEX = ["quiet", "lines"] @@ -29,6 +29,7 @@ ) +@requires_project @main.command(name="lint-file", help=_HELP) @click.option( "--quiet", @@ -56,6 +57,7 @@ def lint_file( obj: ClickObj, quiet: bool, lines: bool, files: Collection[Path] ) -> None: + # pylint: disable=missing-function-docstring project = cast(Project, obj.project) subset_files = {Path(file_) for file_ in files} for file_ in subset_files: diff --git a/src/reuse/cli/main.py b/src/reuse/cli/main.py index aebe161bc..b2e2a9552 100644 --- a/src/reuse/cli/main.py +++ b/src/reuse/cli/main.py @@ -74,7 +74,8 @@ + "\n\n" + _("Support the FSFE's work:") + "\n\n" - # FIXME: Indent this. + # Indent next paragraph. + + " " + _( "Donations are critical to our strength and autonomy. They enable us" " to continue working for Free Software wherever necessary. Please" @@ -133,6 +134,7 @@ def main( no_multiprocessing: bool, root: Optional[Path], ) -> None: + # pylint: disable=missing-function-docstring,too-many-arguments setup_logging(level=logging.DEBUG if debug else logging.WARNING) # Very stupid workaround to not print a DEP5 deprecation warning in the @@ -143,29 +145,31 @@ def main( if not suppress_deprecation: warnings.filterwarnings("default", module="reuse") - # FIXME: Not needed for all subcommands. - if root is None: - root = find_root() - if root is None: - root = Path.cwd() - - # FIXME: Not needed for all subcommands. - try: - project = Project.from_directory(root) - # FileNotFoundError and NotADirectoryError don't need to be caught because - # argparse already made sure of these things. - except GlobalLicensingParseError as error: - raise click.UsageError( - _( - "'{path}' could not be parsed. We received the following error" - " message: {message}" - ).format(path=error.source, message=str(error)) - ) from error - - except (GlobalLicensingConflict, OSError) as error: - raise click.UsageError(str(error)) from error - project.include_submodules = include_submodules - project.include_meson_subprojects = include_meson_subprojects + project: Optional[Project] = None + if ctx.invoked_subcommand: + cmd = main.get_command(ctx, ctx.invoked_subcommand) + if getattr(cmd, "requires_project", False): + if root is None: + root = find_root() + if root is None: + root = Path.cwd() + + try: + project = Project.from_directory(root) + # FileNotFoundError and NotADirectoryError don't need to be caught + # because argparse already made sure of these things. + except GlobalLicensingParseError as error: + raise click.UsageError( + _( + "'{path}' could not be parsed. We received the" + " following error message: {message}" + ).format(path=error.source, message=str(error)) + ) from error + + except (GlobalLicensingConflict, OSError) as error: + raise click.UsageError(str(error)) from error + project.include_submodules = include_submodules + project.include_meson_subprojects = include_meson_subprojects ctx.obj = ClickObj( no_multiprocessing=no_multiprocessing, diff --git a/src/reuse/cli/spdx.py b/src/reuse/cli/spdx.py index 25a9a8e0f..115dd25d9 100644 --- a/src/reuse/cli/spdx.py +++ b/src/reuse/cli/spdx.py @@ -7,16 +7,16 @@ import contextlib import logging -from typing import Optional, cast import sys +from typing import Optional, cast import click -from ..project import Project from .. import _IGNORE_SPDX_PATTERNS -from ..report import ProjectReport from ..i18n import _ -from .common import ClickObj +from ..project import Project +from ..report import ProjectReport +from .common import ClickObj, requires_project from .main import main _LOGGER = logging.getLogger(__name__) @@ -24,6 +24,7 @@ _HELP = _("Generate an SPDX bill of materials.") +@requires_project @main.command(name="spdx", help=_HELP) @click.option( "--output", @@ -68,6 +69,8 @@ def spdx( creator_person: Optional[str], creator_organization: Optional[str], ) -> None: + # pylint: disable=missing-function-docstring + # The SPDX spec mandates that a creator must be specified when a license # conclusion is made, so here we enforce that. More context: # https://github.com/fsfe/reuse-tool/issues/586#issuecomment-1310425706 diff --git a/src/reuse/cli/supported_licenses.py b/src/reuse/cli/supported_licenses.py index 1bd82eb14..65c8df96a 100644 --- a/src/reuse/cli/supported_licenses.py +++ b/src/reuse/cli/supported_licenses.py @@ -17,6 +17,7 @@ @main.command(name="supported-licenses", help=_HELP) def supported_licenses() -> None: + # pylint: disable=missing-function-docstring licenses = _load_license_list(_LICENSES)[1] for license_id, license_info in licenses.items(): diff --git a/src/reuse/report.py b/src/reuse/report.py index f3e5eeaa8..dd2a0355a 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -143,8 +143,8 @@ def _generate_file_reports( def _process_error(error: Exception, path: StrPath) -> None: # Facilitate better debugging by being able to quit the program. - if isinstance(error, bdb.BdbQuit): - raise bdb.BdbQuit() from error + if isinstance(error, (bdb.BdbQuit, KeyboardInterrupt)): + raise error if isinstance(error, (OSError, UnicodeError)): _LOGGER.error( _("Could not read '{path}'").format(path=path), diff --git a/tests/test_cli_annotate.py b/tests/test_cli_annotate.py index 331b53cd1..f7b5f8925 100644 --- a/tests/test_cli_annotate.py +++ b/tests/test_cli_annotate.py @@ -621,7 +621,12 @@ def test_skip_unrecognised(self, fake_repository, skip_unrecognised): assert result.exit_code == 0 assert "Skipped unrecognised file 'foo.foo'" in result.output - def test_skip_unrecognised_and_style_mutex(self, fake_repository): + @pytest.mark.parametrize( + "skip_unrecognised", ["--skip-unrecognised", "--skip-unrecognized"] + ) + def test_skip_unrecognised_and_style_mutex( + self, fake_repository, skip_unrecognised + ): """--skip-unrecognised and --style are mutually exclusive.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") @@ -635,7 +640,7 @@ def test_skip_unrecognised_and_style_mutex(self, fake_repository): "--copyright", "Jane Doe", "--style=c", - "--skip-unrecognised", + skip_unrecognised, "foo.foo", ], ) diff --git a/tests/test_cli_convert_dep5.py b/tests/test_cli_convert_dep5.py index 5b8c32ba4..679fc3513 100644 --- a/tests/test_cli_convert_dep5.py +++ b/tests/test_cli_convert_dep5.py @@ -11,6 +11,8 @@ from reuse._util import cleandoc_nl from reuse.cli.main import main +# pylint: disable=unused-argument + class TestConvertDep5: """Tests for convert-dep5.""" diff --git a/tests/test_cli_spdx.py b/tests/test_cli_spdx.py index 613a548a5..b9bb466c6 100644 --- a/tests/test_cli_spdx.py +++ b/tests/test_cli_spdx.py @@ -15,6 +15,8 @@ from reuse.cli.main import main +# pylint: disable=unused-argument + class TestSpdx: """Tests for spdx.""" From 00b281f1deebee356cd9ec0b927ded7cff337c0c Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 14:02:03 +0200 Subject: [PATCH 080/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/changed/click.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/changed/click.md diff --git a/changelog.d/changed/click.md b/changelog.d/changed/click.md new file mode 100644 index 000000000..fcb9830c1 --- /dev/null +++ b/changelog.d/changed/click.md @@ -0,0 +1,3 @@ +- Switched from `argparse` to `click` for handling the CLI. The CLI should still + handle identically, with identical options and arguments, but some stuff + changed under the hood. (#1084) From df46eaa4cea1c1f710c1ae831ce15f2962ffc416 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 15:32:49 +0200 Subject: [PATCH 081/156] Improve the documentation Signed-off-by: Carmen Bianca BAKKER --- README.md | 17 +++++++++++------ changelog.d/changed/click.md | 18 ++++++++++++++++-- docs/man/reuse-annotate.rst | 10 +++++----- docs/man/reuse-convert-dep5.rst | 2 +- docs/man/reuse-download.rst | 4 ++-- docs/man/reuse-lint-file.rst | 2 +- docs/man/reuse-lint.rst | 2 +- docs/man/reuse-spdx.rst | 2 +- docs/man/reuse-supported-licenses.rst | 2 +- docs/man/reuse.rst | 16 ++++------------ src/reuse/cli/annotate.py | 22 ++++++++++++++-------- src/reuse/cli/convert_dep5.py | 2 +- src/reuse/cli/download.py | 2 +- src/reuse/cli/lint.py | 11 ++++++----- src/reuse/cli/lint_file.py | 8 ++++---- src/reuse/cli/main.py | 1 + src/reuse/cli/spdx.py | 4 ++-- 17 files changed, 72 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 64ba00c1d..c772e9b34 100644 --- a/README.md +++ b/README.md @@ -270,13 +270,18 @@ repos: ### Shell completion -You can generate a shell completion script with `reuse --print-completion bash`. -Replace 'bash' as needed. You must place the printed text in a file dictated by -your shell to benefit from completions. +In order to enable shell completion, you need to generate the shell completion +script. You do this with `_REUSE_COMPLETE=bash_source reuse`. Replace `bash` +with `zsh` or `fish` as needed, or any other shells supported by the +Python`click` library. You can then source the output in your shell rc file, +like so (e.g.`~/.bashrc`): -This functionality depends on `shtab`, which is an optional dependency. To -benefit from this feature, install reuse with the `completion` extra, like -`pipx install reuse[completion]`. +```bash +eval "$(_REUSE__COMPLETE=bash_source reuse)" +``` + +Alternatively, you can place the generated completion script in +`${XDG_DATA_HOME}/bash-completion/completions/reuse`. ## Maintainers diff --git a/changelog.d/changed/click.md b/changelog.d/changed/click.md index fcb9830c1..bedc5e5a7 100644 --- a/changelog.d/changed/click.md +++ b/changelog.d/changed/click.md @@ -1,3 +1,17 @@ - Switched from `argparse` to `click` for handling the CLI. The CLI should still - handle identically, with identical options and arguments, but some stuff - changed under the hood. (#1084) + handle the same, with identical options and arguments, but some stuff changed + under the hood. (#1084) + + Find here a small list of differences: + + - `-h` is no longer shorthand for `--help`. + - `--version` now outputs "reuse, version X.Y.Z", followed by a licensing + blurb on different paragraphs. + - Some options are made explicitly mutually exclusive, such as `annotate`'s + `--skip-unrecognised` and `--style`, and `download`'s `--output` and + `--all`. + - Subcommands which take a list of things (files, license) as arguments, such + as `annotate`, `lint-file`, or `download`, now also allow zero arguments. + This will do nothing, but can be useful in scripting. + - `annotate` and `lint-file` now also take directories as arguments. This will + do nothing, but can be useful in scripting. diff --git a/docs/man/reuse-annotate.rst b/docs/man/reuse-annotate.rst index ae01e0af2..9a1795cb6 100644 --- a/docs/man/reuse-annotate.rst +++ b/docs/man/reuse-annotate.rst @@ -46,22 +46,22 @@ Mandatory options ----------------- At least *one* among the following options is required. They contain the -information which the tool will add to the file(s). +information which the tool will add to the file(s). You can repeat these +options. .. option:: -c, --copyright COPYRIGHT A copyright holder. This does not contain the year or the copyright prefix. See :option:`--year` and :option:`--copyright-prefix` for the year and prefix. - This option can be repeated. .. option:: -l, --license LICENSE - An SPDX license identifier. This option can be repeated. + An SPDX license identifier. .. option:: --contributor CONTRIBUTOR A name of a contributor. The contributor will be added via the - ``SPDX-FileContributor:`` tag. This option can be repeated. + ``SPDX-FileContributor:`` tag. Other options ------------- @@ -143,7 +143,7 @@ Other options Instead of aborting when a file extension does not have an associated comment style, skip those files. -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-convert-dep5.rst b/docs/man/reuse-convert-dep5.rst index 427344c2b..0be35935b 100644 --- a/docs/man/reuse-convert-dep5.rst +++ b/docs/man/reuse-convert-dep5.rst @@ -21,7 +21,7 @@ functionally equivalent ``REUSE.toml`` file in the root of the project. The Options ------- -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-download.rst b/docs/man/reuse-download.rst index 4c79f0fa3..88adc424d 100644 --- a/docs/man/reuse-download.rst +++ b/docs/man/reuse-download.rst @@ -36,11 +36,11 @@ Options If downloading a single file, output it to a specific file instead of putting it in a detected ``LICENSES/`` directory. -.. option:: --source SOURCE +.. option:: --source PATH Specify a source from which to copy custom ``LicenseRef-`` files. This can be a directory containing such file, or a path to the file itself. -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-lint-file.rst b/docs/man/reuse-lint-file.rst index 314cc46da..8e9487cb3 100644 --- a/docs/man/reuse-lint-file.rst +++ b/docs/man/reuse-lint-file.rst @@ -45,6 +45,6 @@ Options Output one line per error, prefixed by the file path. This option is the default. -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-lint.rst b/docs/man/reuse-lint.rst index 6c0cf6d77..03c66c2dd 100644 --- a/docs/man/reuse-lint.rst +++ b/docs/man/reuse-lint.rst @@ -97,6 +97,6 @@ Options Output one line per error, prefixed by the file path. -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-spdx.rst b/docs/man/reuse-spdx.rst index 46515dced..e6d5fb4e4 100644 --- a/docs/man/reuse-spdx.rst +++ b/docs/man/reuse-spdx.rst @@ -41,6 +41,6 @@ Options Name of the creator (organization) of the bill of materials. -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse-supported-licenses.rst b/docs/man/reuse-supported-licenses.rst index 8dbb87596..902d171f3 100644 --- a/docs/man/reuse-supported-licenses.rst +++ b/docs/man/reuse-supported-licenses.rst @@ -25,6 +25,6 @@ full name of the license, and an URL to the license. Options ------- -.. option:: -h, --help +.. option:: --help Display help and exit. diff --git a/docs/man/reuse.rst b/docs/man/reuse.rst index 121b66144..e1b448c21 100644 --- a/docs/man/reuse.rst +++ b/docs/man/reuse.rst @@ -78,18 +78,7 @@ Options current working directory's VCS repository, or to the current working directory. -.. option:: -s, --print-completion SHELL - - Print a static shell completion script for the given shell and exit. You must - place the printed text in a file dictated by your shell before the completions - will function. For Bash, this file is - ``${XDG_DATA_HOME}/bash-completion/reuse``. - - This option depends on ``shtab``, which is an optional dependency of - :program:`reuse`. The supported shells depend on your installed version of - ``shtab``. - -.. option:: -h, --help +.. option:: --help Display help and exit. If no command is provided, this option is implied. @@ -112,6 +101,9 @@ Commands :manpage:`reuse-lint(1)` Verify whether a project is compliant with the REUSE Specification. +:manpage:`reuse-lint-file(1)` + Verify whether individual files are compliant with the REUSE Specification. + :manpage:`reuse-spdx(1)` Generate SPDX bill of materials. diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index f32fc9b31..3ba231ee9 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -121,8 +121,9 @@ def verify_paths_comment_style( "{}\n\n{}".format( _( "The following files do not have a recognised file" - " extension. Please use --style, --force-dot-license," - " --fallback-dot-license, or --skip-unrecognised:" + " extension. Please use '--style'," + " '--force-dot-license', '--fallback-dot-license', or" + " '--skip-unrecognised':" ), "\n".join(str(path) for path in unrecognised_files), ) @@ -153,14 +154,14 @@ def verify_paths_line_handling( raise click.UsageError( _( "'{path}' does not support single-line comments, please" - " do not use --single-line" + " do not use '--single-line'." ).format(path=path) ) if multi_line and not style.can_handle_multi(): raise click.UsageError( _( "'{path}' does not support multi-line comments, please" - " do not use --multi-line" + " do not use '--multi-line'." ).format(path=path) ) @@ -268,7 +269,7 @@ def get_reuse_info( ] _HELP = ( - _("Add copyright and licensing into the header of one or more" " files.") + _("Add copyright and licensing into the headers of files.") + "\n\n" + _( "By using --copyright and --license, you can specify which" @@ -290,9 +291,10 @@ def get_reuse_info( "--copyright", "-c", "copyrights", + metavar=_("COPYRIGHT"), type=str, multiple=True, - help=_("Copyright statement."), + help=_("Copyright statement, repeatable."), ) @click.option( "--license", @@ -301,21 +303,24 @@ def get_reuse_info( metavar=_("SPDX_IDENTIFIER"), type=spdx_identifier, multiple=True, - help=_("SPDX License Identifier."), + help=_("SPDX License Identifier, repeatable."), ) @click.option( "--contributor", "contributors", + metavar=_("CONTRIBUTOR"), type=str, multiple=True, - help=_("File contributor."), + help=_("File contributor, repeatable."), ) @click.option( "--year", "-y", "years", + metavar=_("YEAR"), cls=MutexOption, mutually_exclusive=_YEAR_MUTEX, + # TODO: This multiple behaviour is kind of word. Let's redo it. multiple=True, type=str, help=_("Year of copyright statement."), @@ -342,6 +347,7 @@ def get_reuse_info( "--template", "-t", "template_str", + metavar=_("TEMPLATE"), type=str, help=_("Name of template to use."), ) diff --git a/src/reuse/cli/convert_dep5.py b/src/reuse/cli/convert_dep5.py index f213bc33d..c7bec0263 100644 --- a/src/reuse/cli/convert_dep5.py +++ b/src/reuse/cli/convert_dep5.py @@ -30,7 +30,7 @@ def convert_dep5(obj: ClickObj) -> None: # pylint: disable=missing-function-docstring project = cast(Project, obj.project) if not (project.root / ".reuse/dep5").exists(): - raise click.UsageError(_("no '.reuse/dep5' file")) + raise click.UsageError(_("No '.reuse/dep5' file.")) text = toml_from_dep5( cast(ReuseDep5, project.global_licensing).dep5_copyright diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index a1d57b915..55d3998a9 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -136,7 +136,7 @@ def _successfully_downloaded(destination: StrPath) -> None: type=click.Path(exists=True, readable=True, path_type=Path), help=_( "Source from which to copy custom LicenseRef- licenses, either" - " a directory that contains the file or the file itself" + " a directory that contains the file or the file itself." ), ) @click.argument( diff --git a/src/reuse/cli/lint.py b/src/reuse/cli/lint.py index f4545081f..0509ce0df 100644 --- a/src/reuse/cli/lint.py +++ b/src/reuse/cli/lint.py @@ -14,6 +14,7 @@ import click +from .. import __REUSE_version__ from ..i18n import _ from ..lint import format_json, format_lines, format_plain from ..project import Project @@ -25,11 +26,11 @@ _HELP = ( _( - "Lint the project directory for compliance with" - " version {reuse_version} of the REUSE Specification. You can" - " find the latest version of the specification at" - " ." - ) + "Lint the project directory for REUSE compliance. This version of the" + " tool checks against version {reuse_version} of the REUSE" + " Specification. You can find the latest version of the specification" + " at ." + ).format(reuse_version=__REUSE_version__) + "\n\n" + _("Specifically, the following criteria are checked:") + "\n\n" diff --git a/src/reuse/cli/lint_file.py b/src/reuse/cli/lint_file.py index 7de7d83e1..b6e8bd81a 100644 --- a/src/reuse/cli/lint_file.py +++ b/src/reuse/cli/lint_file.py @@ -23,9 +23,9 @@ _OUTPUT_MUTEX = ["quiet", "lines"] _HELP = _( - "Lint individual files. The specified FILEs are checked for the presence" - " of copyright and licensing information, and whether the found licenses" - " are included in the LICENSES/ directory." + "Lint individual files for REUSE compliance. The specified FILEs are" + " checked for the presence of copyright and licensing information, and" + " whether the found licenses are included in the LICENSES/ directory." ) @@ -63,7 +63,7 @@ def lint_file( for file_ in subset_files: if not file_.resolve().is_relative_to(project.root.resolve()): raise click.UsageError( - _("'{file}' is not inside of '{root}'").format( + _("'{file}' is not inside of '{root}'.").format( file=file_, root=project.root ) ) diff --git a/src/reuse/cli/main.py b/src/reuse/cli/main.py index b2e2a9552..e85248906 100644 --- a/src/reuse/cli/main.py +++ b/src/reuse/cli/main.py @@ -45,6 +45,7 @@ " the Free Software Foundation, either version 3 of the License, or" " (at your option) any later version." ) + + "\n\n" + _( "This program is distributed in the hope that it will be useful," " but WITHOUT ANY WARRANTY; without even the implied warranty of" diff --git a/src/reuse/cli/spdx.py b/src/reuse/cli/spdx.py index 115dd25d9..9c69477bb 100644 --- a/src/reuse/cli/spdx.py +++ b/src/reuse/cli/spdx.py @@ -81,8 +81,8 @@ def spdx( ): raise click.UsageError( _( - "--creator-person=NAME or --creator-organization=NAME" - " required when --add-license-concluded is provided" + "'--creator-person' or '--creator-organization'" + " is required when '--add-license-concluded' is provided." ) ) From f31922e1f1a40ae3a204c2f538b6faf6356608b7 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 15:34:23 +0200 Subject: [PATCH 082/156] Remove shtab Signed-off-by: Carmen Bianca BAKKER --- changelog.d/added/completion.md | 1 + changelog.d/added/shtab.md | 1 - poetry.lock | 20 +------------------- pyproject.toml | 4 ---- 4 files changed, 2 insertions(+), 24 deletions(-) create mode 100644 changelog.d/added/completion.md delete mode 100644 changelog.d/added/shtab.md diff --git a/changelog.d/added/completion.md b/changelog.d/added/completion.md new file mode 100644 index 000000000..3bd05e0d7 --- /dev/null +++ b/changelog.d/added/completion.md @@ -0,0 +1 @@ +- Added shell completion via `click`. (#1084) diff --git a/changelog.d/added/shtab.md b/changelog.d/added/shtab.md deleted file mode 100644 index b3543469a..000000000 --- a/changelog.d/added/shtab.md +++ /dev/null @@ -1 +0,0 @@ -- Added `--print-completion` using a new `shtab` optional dependency. (#1076) diff --git a/poetry.lock b/poetry.lock index 426361d3f..5403c5225 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1421,21 +1421,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "shtab" -version = "1.7.1" -description = "Automagic shell tab completion for Python CLI applications" -category = "main" -optional = true -python-versions = ">=3.7" -files = [ - {file = "shtab-1.7.1-py3-none-any.whl", hash = "sha256:32d3d2ff9022d4c77a62492b6ec875527883891e33c6b479ba4d41a51e259983"}, - {file = "shtab-1.7.1.tar.gz", hash = "sha256:4e4bcb02eeb82ec45920a5d0add92eac9c9b63b2804c9196c1f1fdc2d039243c"}, -] - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] - [[package]] name = "six" version = "1.16.0" @@ -1850,10 +1835,7 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] -[extras] -completion = ["shtab"] - [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a677761c8f89befc5942129ceb8ed4a1b3352834858fd88ee96bfb08e1da074c" +content-hash = "bbda89d5e0d59bc1261b9a4f5076fd97a88757ff80958825302ac8faa8988cef" diff --git a/pyproject.toml b/pyproject.toml index 86c681dd1..dc91d3f95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,10 +63,6 @@ python-debian = ">=0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" tomlkit = ">=0.8" attrs = ">=21.3" click = ">=8.0" -shtab = { version = ">=1.4.0", optional = true } - -[tool.poetry.extras] -completion = ["shtab"] [tool.poetry.group.test.dependencies] pytest = ">=6.0.0" From 8f418ba56b307ce7f0e7bb92d3c7a001fd94708a Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 15:45:13 +0200 Subject: [PATCH 083/156] Fix tests for Windows Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/annotate.py | 4 ++-- tests/test_cli_annotate.py | 3 ++- tests/test_cli_download.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index 3ba231ee9..301593a47 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -155,14 +155,14 @@ def verify_paths_line_handling( _( "'{path}' does not support single-line comments, please" " do not use '--single-line'." - ).format(path=path) + ).format(path=path.as_posix()) ) if multi_line and not style.can_handle_multi(): raise click.UsageError( _( "'{path}' does not support multi-line comments, please" " do not use '--multi-line'." - ).format(path=path) + ).format(path=path.as_posix()) ) diff --git a/tests/test_cli_annotate.py b/tests/test_cli_annotate.py index f7b5f8925..4aecfd85e 100644 --- a/tests/test_cli_annotate.py +++ b/tests/test_cli_annotate.py @@ -12,6 +12,7 @@ import stat from inspect import cleandoc +from pathlib import PurePath import pytest from click.testing import CliRunner @@ -1524,7 +1525,7 @@ def test_exit_if_unrecognised(self, fake_repository, mock_date_today): "The following files do not have a recognised file extension" in result.output ) - assert "baz/bar.unknown" in result.output + assert str(PurePath("baz/bar.unknown")) in result.output assert "foo.py" not in result.output assert "Jane Doe" not in (fake_repository / "baz/foo.py").read_text() diff --git a/tests/test_cli_download.py b/tests/test_cli_download.py index d03cee9b8..d1aa6630c 100644 --- a/tests/test_cli_download.py +++ b/tests/test_cli_download.py @@ -36,7 +36,7 @@ def test_simple(self, empty_directory, mock_put_license_in_file): assert result.exit_code == 0 mock_put_license_in_file.assert_called_with( - "0BSD", Path("LICENSES/0BSD.txt").resolve(), source=None + "0BSD", Path(os.path.realpath("LICENSES/0BSD.txt")), source=None ) def test_all_and_license_mutually_exclusive(self, empty_directory): From d34cca855a94b4c8eb34a242bc7b306c0746a9e7 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 17:07:23 +0200 Subject: [PATCH 084/156] Small fix to if-statement Ran across this while debugging something else. Fixing this en passant. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/download.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/reuse/download.py b/src/reuse/download.py index 0901da70c..06ef1c944 100644 --- a/src/reuse/download.py +++ b/src/reuse/download.py @@ -11,7 +11,7 @@ import shutil import urllib.request from pathlib import Path -from typing import Optional, cast +from typing import Optional from urllib.error import URLError from urllib.parse import urljoin @@ -53,8 +53,10 @@ def download_license(spdx_identifier: str) -> str: def _path_to_license_file(spdx_identifier: str, project: Project) -> Path: root: Optional[Path] = project.root # Hack - if cast(Path, root).name == "LICENSES" and isinstance( - project.vcs_strategy, VCSStrategyNone + if ( + root + and root.name == "LICENSES" + and isinstance(project.vcs_strategy, VCSStrategyNone) ): root = None From 0375fc72e904c6076c8d9ad5b814ffee58520a96 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:09:47 +0200 Subject: [PATCH 085/156] Generate project object on demand This is a lot cleaner, and has better performance benefits. Commands like 'download' do not always require a project object. Now, if the code never touches 'obj.project', the object is never created. Apart from performance benefits, it also means that irrelevant errors spawned from creation of the project object are sidestepped, because the object is never instantiated (in some cases). Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/annotate.py | 5 ++- src/reuse/cli/common.py | 65 ++++++++++++++++++++++++++--------- src/reuse/cli/convert_dep5.py | 6 ++-- src/reuse/cli/download.py | 10 ++---- src/reuse/cli/lint.py | 7 ++-- src/reuse/cli/lint_file.py | 8 ++--- src/reuse/cli/main.py | 33 ++---------------- src/reuse/cli/spdx.py | 8 ++--- 8 files changed, 67 insertions(+), 75 deletions(-) diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index 301593a47..c803e3341 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -44,7 +44,7 @@ ) from ..i18n import _ from ..project import Project -from .common import ClickObj, MutexOption, requires_project, spdx_identifier +from .common import ClickObj, MutexOption, spdx_identifier from .main import main _LOGGER = logging.getLogger(__name__) @@ -285,7 +285,6 @@ def get_reuse_info( ) -@requires_project @main.command(name="annotate", help=_HELP) @click.option( "--copyright", @@ -449,7 +448,7 @@ def annotate( paths: Sequence[Path], ) -> None: # pylint: disable=too-many-arguments,too-many-locals,missing-function-docstring - project = cast(Project, obj.project) + project = obj.project test_mandatory_option_required(copyrights, licenses, contributors) paths = all_paths(paths, recursive, project) diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index 88189bfcf..0e185f274 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -4,34 +4,67 @@ """Utilities that are common to multiple CLI commands.""" -from dataclasses import dataclass -from typing import Any, Callable, Mapping, Optional, TypeVar +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Mapping, Optional import click from boolean.boolean import Expression, ParseError from license_expression import ExpressionError from .._util import _LICENSING +from ..global_licensing import GlobalLicensingParseError from ..i18n import _ -from ..project import Project +from ..project import GlobalLicensingConflict, Project +from ..vcs import find_root -F = TypeVar("F", bound=Callable) - -def requires_project(f: F) -> F: - """A decorator to mark subcommands that require a :class:`Project` object. - Make sure to apply this decorator _first_. - """ - setattr(f, "requires_project", True) - return f - - -@dataclass(frozen=True) +@dataclass() class ClickObj: """A dataclass holding necessary context and options.""" - no_multiprocessing: bool - project: Optional[Project] + root: Optional[Path] = None + include_submodules: bool = False + include_meson_subprojects: bool = False + no_multiprocessing: bool = True + + _project: Optional[Project] = field( + default=None, init=False, repr=False, compare=False + ) + + @property + def project(self) -> Project: + """Generate a project object on demand, and cache it.""" + if self._project: + return self._project + + root = self.root + if root is None: + root = find_root() + if root is None: + root = Path.cwd() + + try: + project = Project.from_directory( + root, + include_submodules=self.include_submodules, + include_meson_subprojects=self.include_meson_subprojects, + ) + # FileNotFoundError and NotADirectoryError don't need to be caught + # because argparse already made sure of these things. + except GlobalLicensingParseError as error: + raise click.UsageError( + _( + "'{path}' could not be parsed. We received the" + " following error message: {message}" + ).format(path=error.source, message=str(error)) + ) from error + + except (GlobalLicensingConflict, OSError) as error: + raise click.UsageError(str(error)) from error + + self._project = project + return project class MutexOption(click.Option): diff --git a/src/reuse/cli/convert_dep5.py b/src/reuse/cli/convert_dep5.py index c7bec0263..a4cb32f7c 100644 --- a/src/reuse/cli/convert_dep5.py +++ b/src/reuse/cli/convert_dep5.py @@ -12,8 +12,7 @@ from ..convert_dep5 import toml_from_dep5 from ..global_licensing import ReuseDep5 from ..i18n import _ -from ..project import Project -from .common import ClickObj, requires_project +from .common import ClickObj from .main import main _HELP = _( @@ -23,12 +22,11 @@ ) -@requires_project @main.command(name="convert-dep5", help=_HELP) @click.pass_obj def convert_dep5(obj: ClickObj) -> None: # pylint: disable=missing-function-docstring - project = cast(Project, obj.project) + project = obj.project if not (project.root / ".reuse/dep5").exists(): raise click.UsageError(_("No '.reuse/dep5' file.")) diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index 55d3998a9..b217eb78b 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -9,7 +9,7 @@ import sys from difflib import SequenceMatcher from pathlib import Path -from typing import IO, Collection, Optional, cast +from typing import IO, Collection, Optional from urllib.error import URLError import click @@ -17,10 +17,9 @@ from .._licenses import ALL_NON_DEPRECATED_MAP from ..download import _path_to_license_file, put_license_in_file from ..i18n import _ -from ..project import Project from ..report import ProjectReport from ..types import StrPath -from .common import ClickObj, MutexOption, requires_project +from .common import ClickObj, MutexOption from .main import main _LOGGER = logging.getLogger(__name__) @@ -113,7 +112,6 @@ def _successfully_downloaded(destination: StrPath) -> None: ) -@requires_project @main.command(name="download", help=_HELP) @click.option( "--all", @@ -166,9 +164,7 @@ def download( if all_: # TODO: This is fairly inefficient, but gets the job done. - report = ProjectReport.generate( - cast(Project, obj.project), do_checksum=False - ) + report = ProjectReport.generate(obj.project, do_checksum=False) licenses = report.missing_licenses.keys() if len(licenses) > 1 and output: diff --git a/src/reuse/cli/lint.py b/src/reuse/cli/lint.py index 0509ce0df..5a5cd3122 100644 --- a/src/reuse/cli/lint.py +++ b/src/reuse/cli/lint.py @@ -10,16 +10,14 @@ """Click code for lint subcommand.""" import sys -from typing import cast import click from .. import __REUSE_version__ from ..i18n import _ from ..lint import format_json, format_lines, format_plain -from ..project import Project from ..report import ProjectReport -from .common import ClickObj, MutexOption, requires_project +from .common import ClickObj, MutexOption from .main import main _OUTPUT_MUTEX = ["quiet", "json", "plain", "lines"] @@ -62,7 +60,6 @@ ) -@requires_project @main.command(name="lint", help=_HELP) @click.option( "--quiet", @@ -102,7 +99,7 @@ def lint( ) -> None: # pylint: disable=missing-function-docstring report = ProjectReport.generate( - cast(Project, obj.project), + obj.project, do_checksum=False, multiprocessing=not obj.no_multiprocessing, ) diff --git a/src/reuse/cli/lint_file.py b/src/reuse/cli/lint_file.py index b6e8bd81a..b87021550 100644 --- a/src/reuse/cli/lint_file.py +++ b/src/reuse/cli/lint_file.py @@ -9,15 +9,14 @@ import sys from pathlib import Path -from typing import Collection, cast +from typing import Collection import click from ..i18n import _ from ..lint import format_lines_subset -from ..project import Project from ..report import ProjectSubsetReport -from .common import ClickObj, MutexOption, requires_project +from .common import ClickObj, MutexOption from .main import main _OUTPUT_MUTEX = ["quiet", "lines"] @@ -29,7 +28,6 @@ ) -@requires_project @main.command(name="lint-file", help=_HELP) @click.option( "--quiet", @@ -58,7 +56,7 @@ def lint_file( obj: ClickObj, quiet: bool, lines: bool, files: Collection[Path] ) -> None: # pylint: disable=missing-function-docstring - project = cast(Project, obj.project) + project = obj.project subset_files = {Path(file_) for file_ in files} for file_ in subset_files: if not file_.resolve().is_relative_to(project.root.resolve()): diff --git a/src/reuse/cli/main.py b/src/reuse/cli/main.py index e85248906..b2cdd72d7 100644 --- a/src/reuse/cli/main.py +++ b/src/reuse/cli/main.py @@ -21,10 +21,7 @@ from .. import __REUSE_version__ from .._util import setup_logging -from ..global_licensing import GlobalLicensingParseError from ..i18n import _ -from ..project import GlobalLicensingConflict, Project -from ..vcs import find_root from .common import ClickObj _PACKAGE_PATH = os.path.dirname(__file__) @@ -146,33 +143,9 @@ def main( if not suppress_deprecation: warnings.filterwarnings("default", module="reuse") - project: Optional[Project] = None - if ctx.invoked_subcommand: - cmd = main.get_command(ctx, ctx.invoked_subcommand) - if getattr(cmd, "requires_project", False): - if root is None: - root = find_root() - if root is None: - root = Path.cwd() - - try: - project = Project.from_directory(root) - # FileNotFoundError and NotADirectoryError don't need to be caught - # because argparse already made sure of these things. - except GlobalLicensingParseError as error: - raise click.UsageError( - _( - "'{path}' could not be parsed. We received the" - " following error message: {message}" - ).format(path=error.source, message=str(error)) - ) from error - - except (GlobalLicensingConflict, OSError) as error: - raise click.UsageError(str(error)) from error - project.include_submodules = include_submodules - project.include_meson_subprojects = include_meson_subprojects - ctx.obj = ClickObj( + root=root, + include_submodules=include_submodules, + include_meson_subprojects=include_meson_subprojects, no_multiprocessing=no_multiprocessing, - project=project, ) diff --git a/src/reuse/cli/spdx.py b/src/reuse/cli/spdx.py index 9c69477bb..11a9933b5 100644 --- a/src/reuse/cli/spdx.py +++ b/src/reuse/cli/spdx.py @@ -8,15 +8,14 @@ import contextlib import logging import sys -from typing import Optional, cast +from typing import Optional import click from .. import _IGNORE_SPDX_PATTERNS from ..i18n import _ -from ..project import Project from ..report import ProjectReport -from .common import ClickObj, requires_project +from .common import ClickObj from .main import main _LOGGER = logging.getLogger(__name__) @@ -24,7 +23,6 @@ _HELP = _("Generate an SPDX bill of materials.") -@requires_project @main.command(name="spdx", help=_HELP) @click.option( "--output", @@ -103,7 +101,7 @@ def spdx( ) report = ProjectReport.generate( - cast(Project, obj.project), + obj.project, multiprocessing=not obj.no_multiprocessing, add_license_concluded=add_license_concluded, ) From 6d9c844349d214e8b23fcc2b5639d150b46fa8eb Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:14:26 +0200 Subject: [PATCH 086/156] Set up Python in gettext workflow Without this, poetry is not available. Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/gettext.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/gettext.yaml b/.github/workflows/gettext.yaml index b2d9c0c0c..6b2af961b 100644 --- a/.github/workflows/gettext.yaml +++ b/.github/workflows/gettext.yaml @@ -23,6 +23,10 @@ jobs: # exception to the branch protection, so we'll use that account's # token to push to the main branch. token: ${{ secrets.FSFE_SYSTEM_TOKEN }} + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: "3.9" - name: Install gettext and wlc run: sudo apt-get install -y gettext wlc # We mostly install reuse to install the click dependency. From 7896bdf51f9fa8c17205dc971da8d07b49f03f17 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:19:28 +0200 Subject: [PATCH 087/156] Attempt to fix gettext workflow Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/gettext.yaml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gettext.yaml b/.github/workflows/gettext.yaml index 6b2af961b..6465e706f 100644 --- a/.github/workflows/gettext.yaml +++ b/.github/workflows/gettext.yaml @@ -14,7 +14,7 @@ on: jobs: create-pot: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v3 with: @@ -23,12 +23,8 @@ jobs: # exception to the branch protection, so we'll use that account's # token to push to the main branch. token: ${{ secrets.FSFE_SYSTEM_TOKEN }} - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: "3.9" - - name: Install gettext and wlc - run: sudo apt-get install -y gettext wlc + - name: Install poetry, gettext, and wlc + run: sudo apt-get install -y python3-poetry gettext wlc # We mostly install reuse to install the click dependency. - name: Install reuse run: poetry install --no-interaction --only main From f24b453edaeceba3dd0dd3463bf0543e4cd7f963 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:24:40 +0200 Subject: [PATCH 088/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/added/comment-flake-envrc.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 changelog.d/added/comment-flake-envrc.md diff --git a/changelog.d/added/comment-flake-envrc.md b/changelog.d/added/comment-flake-envrc.md new file mode 100644 index 000000000..1efc46cbf --- /dev/null +++ b/changelog.d/added/comment-flake-envrc.md @@ -0,0 +1,2 @@ +- Added `.envrc` (Python) and `.flake.lock` (uncommentable) as recognised file + types for comments. (#1061) From 72f69bf4762b62a44fea8eae2beec5ff98b498ac Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 10 Oct 2024 15:57:27 +0000 Subject: [PATCH 089/156] Translated using Weblate (Spanish) Currently translated at 91.8% (170 of 185 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 79 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/po/es.po b/po/es.po index b6a49e8c6..35cdf0be7 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-30 13:59+0000\n" -"PO-Revision-Date: 2024-10-09 17:15+0000\n" +"PO-Revision-Date: 2024-10-10 16:26+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -277,22 +277,29 @@ msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"Añadir copyright y licencias en la cabecera de uno o más archivos.\n" +"\n" +"Usando --copyright y --license, puede especificar qué titulares de derechos " +"de autor y licencias añadir a las cabeceras de los archivos dados.\n" +"\n" +"Usando --contributor, puede especificar las personas o entidades que han " +"contribuido pero no son titulares de los derechos de autor de los archivos " +"dados." #: src/reuse/_main.py:152 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" #: src/reuse/_main.py:154 -#, fuzzy msgid "Download a license and place it in the LICENSES/ directory." -msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" +msgstr "Descargar una licencia y colocarla en el directorio LICENSES/ ." #: src/reuse/_main.py:163 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" #: src/reuse/_main.py:166 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " "the REUSE Specification. You can find the latest version of the " @@ -318,22 +325,30 @@ msgid "" "\n" "- Do all files have valid copyright and licensing information?" msgstr "" -"Examina el directorio del proyecto para comprobar su conformidad con la " -"versión {reuse_version} de la Especificación REUSE. Puedes encontrar la " -"última versión de la especificación en \n" +"Comprueba que el directorio del proyecto cumple con la versión " +"{reuse_version} de la especificación REUSE. Puede encontrar la última " +"versión de la especificación en .\n" "\n" -"Los siguientes criterios son específicamente chequeados:\n" +"En concreto, se comprueban los siguientes criterios\n" "\n" -"- ¿Hay alguna licencia mala (no reconocida, no compatible con SPDX...) en el " -"proyecto?\n" +"- ¿Existen licencias defectuosas (no reconocidas, no conformes con SPDX) en " +"el proyecto?\n" "\n" -"- ¿Se hace referencia a alguna licencia dentro del proyecto, pero esta no se " -"encuentra incluida en el directorio LICENSES/?\n" +"- ¿Hay licencias obsoletas en el proyecto?\n" "\n" -"- ¿Existe alguna licencia, de las incluidas en el directorio LICENSES/, que " -"no esté en uso en el proyecto?\n" +"- ¿Hay algún archivo de licencia en el directorio LICENSES/ sin extensión de " +"archivo?\n" "\n" -"- ¿Tienen todos los ficheros información válida sobre copyright y licencia?" +"- ¿Hay licencias a las que se haga referencia dentro del proyecto, pero que " +"no estén incluidas en el directorio LICENSES/?\n" +"\n" +"- ¿Hay licencias incluidas en el directorio LICENSES/ que no se utilicen en " +"el proyecto?\n" +"\n" +"- ¿Hay errores de lectura?\n" +"\n" +"- ¿Tienen todos los archivos información válida sobre derechos de autor y " +"licencias?" #: src/reuse/_main.py:202 msgid "" @@ -341,15 +356,18 @@ msgid "" "copyright and licensing information, and whether the found licenses are " "included in the LICENSES/ directory." msgstr "" +"Archivos individuales de Lint. Los archivos especificados se comprueban para " +"ver si hay información de copyright y licencias, y si las licencias " +"encontradas están incluidas en el directorio LICENSES/ ." #: src/reuse/_main.py:208 msgid "list non-compliant files from specified list of files" msgstr "" +"enumerar los archivos no compatibles de la lista de archivos especificada" #: src/reuse/_main.py:217 -#, fuzzy msgid "Generate an SPDX bill of materials in RDF format." -msgstr "imprime la lista de materiales del proyecto en formato SPDX" +msgstr "Genere una lista de materiales SPDX en formato RDF." #: src/reuse/_main.py:219 msgid "print the project's bill of materials in SPDX format" @@ -357,7 +375,7 @@ msgstr "imprime la lista de materiales del proyecto en formato SPDX" #: src/reuse/_main.py:228 msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" +msgstr "Enumere todas las licencias SPDX no obsoletas de la lista oficial." #: src/reuse/_main.py:230 msgid "list all supported SPDX licenses" @@ -369,19 +387,21 @@ msgid "" "generated file is semantically identical. The .reuse/dep5 file is " "subsequently deleted." msgstr "" +"Convertir . reuse/dep5 en un archivo REUSE.toml en la raíz del proyecto. El " +"archivo generado es semánticamente idéntico. El . reutilización/dep5 archivo " +"se elimina posteriormente." #: src/reuse/_main.py:246 msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" +msgstr "convertir . reuse/dep5 a REUSE.toml" #: src/reuse/_main.py:311 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -"{dep5}' no pudo ser analizado. Recibimos el siguiente mensaje de error: " -"{message}" +"'{path}' no se pudo analizar. Con el siguiente mensaje de error: {message}" #: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 #, python-brace-format @@ -437,9 +457,8 @@ msgstr "" "Identificadores SPDX de Licencia válidos." #: src/reuse/convert_dep5.py:118 -#, fuzzy msgid "no '.reuse/dep5' file" -msgstr "Creando .reuse/dep5" +msgstr "sin archivo '.reuse/dep5'" #: src/reuse/download.py:130 msgid "SPDX License Identifier of license" @@ -497,6 +516,7 @@ msgstr "no se puede utilizar --output con más de una licencia" msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" +"{attr_name} debe ser un {type_name} (got {value}, que es una {value_class})." #: src/reuse/global_licensing.py:133 #, python-brace-format @@ -504,22 +524,26 @@ msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" +"El elemento en la colección {attr_name} debe ser un {type_name} (obtiene " +"{item_value}, que es un {item_class})." #: src/reuse/global_licensing.py:145 #, python-brace-format msgid "{attr_name} must not be empty." -msgstr "" +msgstr "{attr_name} no debe estar vacío." #: src/reuse/global_licensing.py:169 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." -msgstr "" +msgstr "{name} debe ser un {type} (obtiene {value}, que es un {value_type})." #: src/reuse/global_licensing.py:193 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" +"El valor de 'precedence' debe ser uno de {precedence_vals} (obtiene " +"{received})" #: src/reuse/header.py:99 msgid "generated comment is missing copyright lines or license expressions" @@ -532,9 +556,8 @@ msgid "formats output as JSON" msgstr "formato de salida JSON" #: src/reuse/lint.py:39 -#, fuzzy msgid "formats output as plain text (default)" -msgstr "formatea la salida como un texto plano" +msgstr "Formato de salida como texto sin formato (por defecto)" #: src/reuse/lint.py:45 #, fuzzy From ac9266d133883db953eb331d695206f1d7046dd5 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 10 Oct 2024 16:26:04 +0000 Subject: [PATCH 090/156] Update reuse.pot --- po/cs.po | 1376 +++++++++++++++++++++++++---------------------- po/de.po | 1281 +++++++++++++++++++++++--------------------- po/eo.po | 1256 ++++++++++++++++++++++--------------------- po/es.po | 1440 ++++++++++++++++++++++++++++---------------------- po/fr.po | 1412 +++++++++++++++++++++++++++---------------------- po/gl.po | 1229 +++++++++++++++++++++--------------------- po/it.po | 1243 ++++++++++++++++++++++--------------------- po/nl.po | 1241 ++++++++++++++++++++++--------------------- po/pt.po | 1233 +++++++++++++++++++++--------------------- po/reuse.pot | 813 ++++++++++------------------ po/ru.po | 1421 +++++++++++++++++++++++++++---------------------- po/sv.po | 947 ++++++++++++++------------------- po/tr.po | 1326 +++++++++++++++++++++++++--------------------- po/uk.po | 1385 ++++++++++++++++++++++++++---------------------- 14 files changed, 9055 insertions(+), 8548 deletions(-) diff --git a/po/cs.po b/po/cs.po index aaf87e0ff..35dcae546 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-09-14 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech =2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" -"'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" -"line" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "Přeskočen nerozpoznaný soubor '{path}'" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "'{path}' není rozpoznán; vytváří se '{path}.license'" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Přeskočený soubor '{path}' již obsahuje informace REUSE" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -67,431 +52,31 @@ msgstr "" "Nepodařilo se zapsat novou hlavičku." #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Úspěšně změněna hlavička {path}" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "" -"--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" - -#: src/reuse/_annotate.py:231 -msgid "option --contributor, --copyright or --license is required" -msgstr "je vyžadována možnost --contributor, --copyright nebo --license" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "šablonu {template} se nepodařilo najít" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "nelze zapisovat do '{}'" - -#: src/reuse/_annotate.py:366 -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" -"Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" -"dot-license, --fallback-dot-license nebo --skip-unrecognised:" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "prohlášení o autorských právech, opakovatelné" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "Identifikátor SPDX, opakovatelný" - -#: src/reuse/_annotate.py:395 -msgid "file contributor, repeatable" -msgstr "přispěvatel souboru, opakovatelný" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "rok vydání prohlášení o autorských právech, nepovinné" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "styl komentáře, který se má použít, nepovinné" - -#: src/reuse/_annotate.py:417 -msgid "copyright prefix to use, optional" -msgstr "předpona autorských práv, která se má použít, nepovinné" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "název šablony, která se má použít, nepovinné" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "neuvádět rok v prohlášení" - -#: src/reuse/_annotate.py:440 -msgid "merge copyright lines if copyright statements are identical" -msgstr "" -"sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských právech " -"totožná" - -#: src/reuse/_annotate.py:446 -msgid "force single-line comment style, optional" -msgstr "vynutit jednořádkový styl komentáře, nepovinné" - -#: src/reuse/_annotate.py:451 -msgid "force multi-line comment style, optional" -msgstr "vynutit víceřádkový styl komentáře, nepovinné" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" - -#: src/reuse/_annotate.py:480 -msgid "write a .license file to files with unrecognised comment styles" -msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "přeskočit soubory s nerozpoznanými styly komentářů" - -#: src/reuse/_annotate.py:497 -msgid "skip files that already contain REUSE information" -msgstr "přeskočit soubory, které již obsahují informace REUSE" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "brání výstupu" - -#: src/reuse/_lint_file.py:31 -msgid "formats output as errors per line (default)" -msgstr "formátuje výstup jako chyby na řádek (výchozí)" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "soubory do lint" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "'{file}' není uvnitř '{root}'" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" -"reuse je nástrojem pro dodržování doporučení REUSE. Další informace " -"naleznete na adrese a online dokumentaci na adrese " -"." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Podpořte činnost FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Dary jsou pro naši sílu a nezávislost zásadní. Umožňují nám pokračovat v " -"práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " -"možnost přispět na ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "povolit příkazy pro ladění" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "skrýt varování o zastarání" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "nepřeskakovat submoduly systému Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "nepřeskakovat podprojekty Meson" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "nepoužívat multiprocessing" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "definovat kořen projektu" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "zobrazit číslo verze programu a ukončit jej" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "dílčí příkazy" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "přidání autorských práv a licencí do záhlaví souborů" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" -"Přidání autorských práv a licencí do záhlaví jednoho nebo více souborů.\n" -"\n" -"Pomocí parametrů --copyright a --license můžete určit, kteří držitelé " -"autorských práv a licencí mají být přidáni do záhlaví daných souborů.\n" -"\n" -"Pomocí parametru --contributor můžete určit osoby nebo subjekty, které " -"přispěly, ale nejsou držiteli autorských práv daných souborů." - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "seznam všech nevyhovujících souborů" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Zkontrolujte soulad adresáře projektu s verzí {reuse_version} specifikace " -"REUSE. Nejnovější verzi specifikace najdete na adrese .\n" -"\n" -"Konkrétně se kontrolují následující kritéria:\n" -"\n" -"- Jsou v projektu nějaké špatné (nerozpoznané, nevyhovující SPDX) licence?\n" -"\n" -"- Jsou uvnitř projektu nějaké licence, na které se odkazuje, ale nejsou " -"obsaženy v adresáři LICENSES/?\n" -"\n" -"- Jsou v adresáři LICENSES/ obsaženy licence, které se uvnitř projektu " -"nepoužívají?\n" -"\n" -"- Mají všechny soubory platné informace o autorských právech a licencích?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "seznam nevyhovujících souborů ze zadaného seznamu souborů" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "seznam všech podporovaných licencí SPDX" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "Převeďte .reuse/dep5 do REUSE.toml" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové hlášení: " -"{message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Nepodařilo se analyzovat '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' není soubor" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' není adresář" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "nelze otevřít '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "nelze zapisovat do adresáře '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "nelze číst ani zapisovat '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' není platný výraz SPDX, přeruší se" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' není platný identifikátor licence SPDX." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Měl jste na mysli:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Seznam platných identifikátorů licence SPDX naleznete na adrese ." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "žádný soubor '.reuse/dep5'" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Licence SPDX Identifikátor licence" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "stáhnout všechny chybějící licence zjištěné v projektu" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" -"zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " -"který soubor obsahuje, nebo samotný soubor" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Chyba: {spdx_identifier} již existuje." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Chyba: {path} neexistuje." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Chyba: Nepodařilo se stáhnout licenci." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Funguje vaše internetové připojení?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Úspěšně stažen {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output nemá žádný účinek, pokud se použije společně s --all" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "jsou vyžadovány tyto argumenty: licence" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "nelze použít --output s více než jednou licencí" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -500,17 +85,17 @@ msgstr "" "Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, která " "je {item_class})." -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} nesmí být prázdný." -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} musí být {type} (má {value}, která je {value_type})." -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -523,172 +108,160 @@ msgstr "" "ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " "výrazy" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "formátuje výstup jako JSON" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "formátuje výstup jako prostý text (výchozí)" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "formátuje výstup jako chyby na řádek" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "NEVHODNÉ LICENCE" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' nalezeno v:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "ZASTARALÉ LICENCE" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Následující licence jsou v SPDX zrušeny:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCE BEZ KONCOVKY SOUBORU" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Následující licence nemají příponu souboru:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "CHYBĚJÍCÍ LICENCE" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "NEPOUŽITÉ LICENCE" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Následující licence nejsou používány:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "CHYBY ČTENÍ" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Nelze načíst:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "CHYBĚJÍCÍ INFORMACE O AUTORSKÝCH PRÁVECH A LICENCÍCH" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Následující soubory neobsahují žádné informace o autorských právech a " "licencích:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Následující soubory nemají žádné informace o autorských právech:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Následující soubory neobsahují žádné licenční informace:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "SHRNUTÍ" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Neplatné licence:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Zastaralé licence:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licence bez přípony souboru:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Chybějící licence:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Nepoužité licence:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Použité licence:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Chyby čtení:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 msgid "Files with copyright information:" msgstr "Soubory s informacemi o autorských právech:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 msgid "Files with license information:" msgstr "Soubory s licenčními informacemi:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Gratulujeme! Váš projekt je v souladu s verzí {} specifikace REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "DOPORUČENÍ" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "{path}: chybí licence {lic}\n" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "{path}: chyba čtení\n" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, python-brace-format msgid "{path}: no license identifier\n" msgstr "{path}: žádný identifikátor licence\n" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "{path}: žádné upozornění na autorská práva\n" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: špatná licence {lic}\n" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: zastaralá licence\n" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: licence bez přípony souboru\n" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: nepoužitá licence\n" @@ -768,17 +341,17 @@ msgstr "" "projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný software " "VCS" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Nepodařilo se načíst '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -791,7 +364,7 @@ msgstr "" "Často kladené otázky o vlastních licencích: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -804,7 +377,7 @@ msgstr "" "reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " "nové identifikátory naleznete zde: " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -814,7 +387,7 @@ msgstr "" "adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím způsobem " "přejmenujte." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -829,7 +402,7 @@ msgstr "" "--all' a získat všechny chybějící. Pro vlastní licence (začínající na " "'LicenseRef-') musíte tyto soubory přidat sami." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -843,7 +416,7 @@ msgstr "" "buď správně označili, nebo nepoužitý licenční text odstranili, pokud jste si " "jisti, že žádný soubor nebo kousek kódu není takto licencován." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -853,7 +426,7 @@ msgstr "" "adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v horní " "části výstupu jako součást zaznamenaných chybových hlášení." -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -868,192 +441,759 @@ msgstr "" "jsou vysvětleny další způsoby, jak to provést: " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -"vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " -"zaručit, že pole bude přesné" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "jméno osoby podepisující zprávu SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "název organizace, která podepsala zprávu SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "zobrazit tuto nápovědu a ukončit" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Zastaralé licence:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +#, fuzzy +msgid "Options" +msgstr "možnosti" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "očekávaný jeden argument" +msgstr[1] "očekávaný jeden argument" +msgstr[2] "očekávaný jeden argument" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "dílčí příkazy" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Chybějící licence:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: chyba: %(message)s\n" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "zobrazit tuto nápovědu a ukončit" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "poziční argumenty" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Chybějící licence:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Měl jste na mysli:" +msgstr[1] "Měl jste na mysli:" +msgstr[2] "Měl jste na mysli:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" msgstr "" -"chyba: --creator-person=NAME nebo --creator-organization=NAME je vyžadováno " -"při zadání parametru --add-licence-concluded" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +"Choose from:\n" +"\t{choices}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." msgstr "" -"'{path}' neodpovídá běžnému vzoru souboru SPDX. Navrhované konvence pro " -"pojmenování najdete zde: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "použití: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Chyba: {path} neexistuje." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' není adresář" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" +#~ "line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" + +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "je vyžadována možnost --contributor, --copyright nebo --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "šablonu {template} se nepodařilo najít" + +#~ msgid "can't write to '{}'" +#~ msgstr "nelze zapisovat do '{}'" + +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" +#~ "dot-license, --fallback-dot-license nebo --skip-unrecognised:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "prohlášení o autorských právech, opakovatelné" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identifikátor SPDX, opakovatelný" + +#~ msgid "file contributor, repeatable" +#~ msgstr "přispěvatel souboru, opakovatelný" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "rok vydání prohlášení o autorských právech, nepovinné" + +#~ msgid "comment style to use, optional" +#~ msgstr "styl komentáře, který se má použít, nepovinné" + +#~ msgid "copyright prefix to use, optional" +#~ msgstr "předpona autorských práv, která se má použít, nepovinné" + +#~ msgid "name of template to use, optional" +#~ msgstr "název šablony, která se má použít, nepovinné" + +#~ msgid "do not include year in statement" +#~ msgstr "neuvádět rok v prohlášení" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských " +#~ "právech totožná" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "vynutit jednořádkový styl komentáře, nepovinné" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "vynutit víceřádkový styl komentáře, nepovinné" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" + +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" + +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "přeskočit soubory s nerozpoznanými styly komentářů" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "přeskočit soubory, které již obsahují informace REUSE" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" + +#~ msgid "prevents output" +#~ msgstr "brání výstupu" + +#~ msgid "formats output as errors per line (default)" +#~ msgstr "formátuje výstup jako chyby na řádek (výchozí)" + +#~ msgid "files to lint" +#~ msgstr "soubory do lint" + +#, python-brace-format +#~ msgid "'{file}' is not inside of '{root}'" +#~ msgstr "'{file}' není uvnitř '{root}'" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse je nástrojem pro dodržování doporučení REUSE. Další informace " +#~ "naleznete na adrese a online dokumentaci na " +#~ "adrese ." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Podpořte činnost FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Dary jsou pro naši sílu a nezávislost zásadní. Umožňují nám pokračovat v " +#~ "práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " +#~ "možnost přispět na ." + +#~ msgid "enable debug statements" +#~ msgstr "povolit příkazy pro ladění" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() není definováno" +#~ msgid "hide deprecation warnings" +#~ msgstr "skrýt varování o zastarání" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "nepřeskakovat submoduly systému Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "nepřeskakovat podprojekty Meson" + +#~ msgid "do not use multiprocessing" +#~ msgstr "nepoužívat multiprocessing" + +#~ msgid "define root of project" +#~ msgstr "definovat kořen projektu" + +#~ msgid "show program's version number and exit" +#~ msgstr "zobrazit číslo verze programu a ukončit jej" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "přidání autorských práv a licencí do záhlaví souborů" + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files." +#~ msgstr "" +#~ "Přidání autorských práv a licencí do záhlaví jednoho nebo více souborů.\n" +#~ "\n" +#~ "Pomocí parametrů --copyright a --license můžete určit, kteří držitelé " +#~ "autorských práv a licencí mají být přidáni do záhlaví daných souborů.\n" +#~ "\n" +#~ "Pomocí parametru --contributor můžete určit osoby nebo subjekty, které " +#~ "přispěly, ale nejsou držiteli autorských práv daných souborů." + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" + +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." + +#~ msgid "list all non-compliant files" +#~ msgstr "seznam všech nevyhovujících souborů" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Zkontrolujte soulad adresáře projektu s verzí {reuse_version} specifikace " +#~ "REUSE. Nejnovější verzi specifikace najdete na adrese .\n" +#~ "\n" +#~ "Konkrétně se kontrolují následující kritéria:\n" +#~ "\n" +#~ "- Jsou v projektu nějaké špatné (nerozpoznané, nevyhovující SPDX) " +#~ "licence?\n" +#~ "\n" +#~ "- Jsou uvnitř projektu nějaké licence, na které se odkazuje, ale nejsou " +#~ "obsaženy v adresáři LICENSES/?\n" +#~ "\n" +#~ "- Jsou v adresáři LICENSES/ obsaženy licence, které se uvnitř projektu " +#~ "nepoužívají?\n" +#~ "\n" +#~ "- Mají všechny soubory platné informace o autorských právech a licencích?" + +#~ msgid "list non-compliant files from specified list of files" +#~ msgstr "seznam nevyhovujících souborů ze zadaného seznamu souborů" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "seznam všech podporovaných licencí SPDX" + +#~ msgid "convert .reuse/dep5 to REUSE.toml" +#~ msgstr "Převeďte .reuse/dep5 do REUSE.toml" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové " +#~ "hlášení: {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' není soubor" + +#~ msgid "can't open '{}'" +#~ msgstr "nelze otevřít '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "nelze zapisovat do adresáře '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "nelze číst ani zapisovat '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' není platný výraz SPDX, přeruší se" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' není platný identifikátor licence SPDX." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Seznam platných identifikátorů licence SPDX naleznete na adrese ." + +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "žádný soubor '.reuse/dep5'" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Licence SPDX Identifikátor licence" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "stáhnout všechny chybějící licence zjištěné v projektu" + +#~ msgid "" +#~ "source from which to copy custom LicenseRef- licenses, either a directory " +#~ "that contains the file or the file itself" +#~ msgstr "" +#~ "zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " +#~ "který soubor obsahuje, nebo samotný soubor" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Chyba: {spdx_identifier} již existuje." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Chyba: Nepodařilo se stáhnout licenci." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Funguje vaše internetové připojení?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Úspěšně stažen {spdx_identifier}." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output nemá žádný účinek, pokud se použije společně s --all" + +#~ msgid "the following arguments are required: license" +#~ msgstr "jsou vyžadovány tyto argumenty: licence" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "nelze použít --output s více než jednou licencí" + +#~ msgid "formats output as JSON" +#~ msgstr "formátuje výstup jako JSON" + +#~ msgid "formats output as plain text (default)" +#~ msgstr "formátuje výstup jako prostý text (výchozí)" + +#~ msgid "formats output as errors per line" +#~ msgstr "formátuje výstup jako chyby na řádek" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " +#~ "zaručit, že pole bude přesné" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "jméno osoby podepisující zprávu SPDX" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "název organizace, která podepsala zprávu SPDX" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "chyba: --creator-person=NAME nebo --creator-organization=NAME je " +#~ "vyžadováno při zadání parametru --add-licence-concluded" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "'{path}' neodpovídá běžnému vzoru souboru SPDX. Navrhované konvence pro " +#~ "pojmenování najdete zde: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "použití: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() není definováno" -#: /usr/lib/python3.10/argparse.py:1223 #, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1283 #, python-format -msgid "argument \"-\" with mode %r" -msgstr "argument \"-\" s režimem %r" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argument \"-\" s režimem %r" -#: /usr/lib/python3.10/argparse.py:1292 #, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "nelze otevřít '%(filename)s': %(error)s" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "nelze otevřít '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:1501 #, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "nelze sloučit akce - dvě skupiny se jmenují %r" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "nelze sloučit akce - dvě skupiny se jmenují %r" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' je neplatný argument pro pozicionály" +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' je neplatný argument pro pozicionály" -#: /usr/lib/python3.10/argparse.py:1561 #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "neplatný řetězec %(option)r: musí začínat znakem %(prefix_chars)r" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "neplatný řetězec %(option)r: musí začínat znakem %(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 #, python-format -msgid "dest= is required for options like %r" -msgstr "dest= je vyžadováno pro možnosti jako %r" +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= je vyžadováno pro možnosti jako %r" -#: /usr/lib/python3.10/argparse.py:1596 #, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "neplatná hodnota conflict_resolution: %r" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "neplatná hodnota conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:1614 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "konfliktní volitelný řetězec: %s" -msgstr[1] "konfliktní volitelné řetězce: %s" -msgstr[2] "konfliktních volitelných řetězců: %s" - -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "vzájemně se vylučující argumenty musí být nepovinné" - -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "poziční argumenty" - -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "možnosti" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "konfliktní volitelný řetězec: %s" +#~ msgstr[1] "konfliktní volitelné řetězce: %s" +#~ msgstr[2] "konfliktních volitelných řetězců: %s" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "zobrazit tuto nápovědu a ukončit" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "vzájemně se vylučující argumenty musí být nepovinné" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "nemůže mít více argumentů dílčího parseru" +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "nemůže mít více argumentů dílčího parseru" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "neuznané argumenty: %s" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "neuznané argumenty: %s" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "není povoleno s argumentem %s" +#~ msgid "not allowed with argument %s" +#~ msgstr "není povoleno s argumentem %s" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "ignoroval explicitní argument %r" +#~ msgid "ignored explicit argument %r" +#~ msgstr "ignoroval explicitní argument %r" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "jsou vyžadovány následující argumenty: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "jsou vyžadovány následující argumenty: %s" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "jeden z argumentů %s je povinný" - -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "očekávaný jeden argument" +#~ msgid "one of the arguments %s is required" +#~ msgstr "jeden z argumentů %s je povinný" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "očekává se nejvýše jeden argument" +#~ msgid "expected at most one argument" +#~ msgstr "očekává se nejvýše jeden argument" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "očekává se alespoň jeden argument" +#~ msgid "expected at least one argument" +#~ msgstr "očekává se alespoň jeden argument" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "očekáván %s argument" -msgstr[1] "očekávány %s argumenty" -msgstr[2] "očekáváno %s argumentů" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "očekáván %s argument" +#~ msgstr[1] "očekávány %s argumenty" +#~ msgstr[2] "očekáváno %s argumentů" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "neočekávaný volitelný řetězec: %s" +#~ msgid "unexpected option string: %s" +#~ msgstr "neočekávaný volitelný řetězec: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r nelze volat" +#~ msgid "%r is not callable" +#~ msgstr "%r nelze volat" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "neplatná hodnota %(type)s: %(value)r" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "neplatná hodnota %(type)s: %(value)r" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "neplatná volba: %(value)r (vyberte z %(choices)s)" - -#: /usr/lib/python3.10/argparse.py:2606 -#, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: chyba: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "neplatná volba: %(value)r (vyberte z %(choices)s)" #, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/de.po b/po/de.po index 5726f530d..d9d4289f9 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German for more information, and " -"for the online documentation." -msgstr "" -"reuse ist ein Werkzeug, um die Empfehlungen von REUSE umzusetzen und zu " -"überprüfen. Mehr Informationen finden Sie auf oder " -"in der Online-Dokumentation auf ." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Diese Version von reuse ist kompatibel mit Version {} der REUSE-" -"Spezifikation." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Die Arbeit der FSFE unterstützen:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Spenden sind entscheidend für unsere Leistungsfähigkeit und Autonomie. Sie " -"ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo immer es " -"nötig ist. Bitte erwägen Sie eine Spende unter ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "Debug-Statements aktivieren" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "„Veraltet“-Warnung verbergen" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "Git-Submodules nicht überspringen" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "Meson-Teilprojekte nicht überspringen" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "kein Multiprocessing verwenden" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "Stammverzeichnis des Projekts bestimmen" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "zeige die Versionsnummer des Programms und beende" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "Unterkommandos" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" -"schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "alle nicht-konformen Dateien zeigen" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Überprüfen Sie das Projektverzeichnis auf die Einhaltung der Version " -"{reuse_version} der REUSE-Spezifikation. Die neueste Version der " -"Spezifikation finden Sie unter .\n" -"\n" -"Im Einzelnen werden die folgenden Kriterien geprüft:\n" -"\n" -"- Sind im Projekt schlechte (nicht erkannte, nicht SPDX-konforme) Lizenzen " -"vorhanden?\n" -"\n" -"- Gibt es Lizenzen, auf die innerhalb des Projekts verwiesen wird, die aber " -"nicht im Verzeichnis LICENSES/ enthalten sind?\n" -"\n" -"- Sind Lizenzen im Verzeichnis LICENSES/ enthalten, die nicht innerhalb des " -"Projekts verwendet werden?\n" -"\n" -"- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " -"versehen?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "Komponentenliste im SPDX-Format ausgeben" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "Komponentenliste im SPDX-Format ausgeben" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "Listet alle unterstützten SPDX-Lizenzen auf" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, fuzzy, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{dep5}' konnte nicht geparst werden. Wir erhielten folgende Fehlermeldung: " -"{message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -391,124 +68,30 @@ msgstr "" "'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " "Überspringe Datei" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' ist keine Datei" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' ist kein Verzeichnis" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "kann '{}' nicht öffnen" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "kann nicht in Verzeichnis '{}' schreiben" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "kann '{}' nicht lesen oder schreiben" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Meinten Sie:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Besuchen Sie für eine Liste von gültigen SPDX-" -"Lizenz-Identifikatoren." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr "Erstelle .reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "SPDX-Lizenz-Identifikator der Lizenz" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Fehler: {spdx_identifier} existiert bereits." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Fehler: {path} existiert nicht." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Funktioniert Ihre Internetverbindung?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "{spdx_identifier} erfolgreich heruntergeladen." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "Die folgenden Argumente sind erforderlich: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -519,124 +102,110 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "formatiert Ausgabe als JSON" - -#: src/reuse/lint.py:39 -#, fuzzy -msgid "formats output as plain text (default)" -msgstr "formatiert Ausgabe als rohen Text" - -#: src/reuse/lint.py:45 -#, fuzzy -msgid "formats output as errors per line" -msgstr "formatiert Ausgabe als rohen Text" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "FALSCHE LIZENZEN" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' gefunden in:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "VERALTETE LIZENZEN" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Die folgenden Lizenzen wurden von SPDX als veraltetet gekennzeichnet:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LIZENZEN OHNE DATEIENDUNG" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Die folgenden Lizenzen haben keine Dateiendung:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "FEHLENDE LIZENZEN" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "NICHT VERWENDETE LIZENZEN" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Die folgenden Lizenzen werden nicht benutzt:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "LESEFEHLER" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Unlesbar:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FEHLENDE URHEBERRECHTS- UND LIZENZINFORMATIONEN" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Die folgenden Dateien haben keine Urheberrechts- und Lizenzinformationen:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Die folgenden Dateien haben keine Urheberrechtsinformationen:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Die folgenden Dateien haben keine Lizenzinformationen:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "ZUSAMMENFASSUNG" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Falsche Lizenzen:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Veraltete Lizenzen:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Lizenzen ohne Dateiendung:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Fehlende Lizenzen:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Unbenutzte Lizenzen:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Verwendete Lizenzen:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Lesefehler:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Dateien mit Urheberrechtsinformationen:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Dateien mit Lizenzinformationen:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -644,7 +213,7 @@ msgstr "" "Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" "Spezifikation :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -652,46 +221,46 @@ msgstr "" "Leider ist Ihr Projekt nicht konform mit Version {} der REUSE-" "Spezifikation :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "EMPFEHLUNGEN" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Veraltete Lizenzen:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Lizenzen ohne Dateiendung:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Unbenutzte Lizenzen:" @@ -768,17 +337,17 @@ msgstr "" "Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " "nicht installiert" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -791,7 +360,7 @@ msgstr "" "beginnen nicht mit 'LicenseRef-'. FAQ zu benutzerdefinierten Lizenzen: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -805,7 +374,7 @@ msgstr "" "aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " "hier: " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -815,7 +384,7 @@ msgstr "" "Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-Dateierweiterung. " "Bitte benennen Sie die Datei(en) entsprechend um." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -830,7 +399,7 @@ msgstr "" "fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " "'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -845,14 +414,14 @@ msgstr "" "Lizenztext löschen, wenn Sie sicher sind, dass keine Datei oder Code-" "Schnipsel darunter lizenziert ist." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -866,185 +435,671 @@ msgstr "" "Identifier'-Tags den Dateien hinzugefügt werden. Das Tutorial erklärt " "weitere Wege das zu erreichen: " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "zeige diese Hilfsnachricht und beende" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Veraltete Lizenzen:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "erwartete ein Argument" +msgstr[1] "erwartete ein Argument" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "Unterkommandos" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Fehlende Lizenzen:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "Benutzung: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() nicht definiert" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "Argument \"-\" mit Modus %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: Fehler: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "Kann '%(filename)s' nicht öffnen: %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "zeige diese Hilfsnachricht und beende" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "Kann Aktionen nicht zusammenführen - zwei Gruppen heißen %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' ist ein ungültiges Argument für Positionsangaben" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "Positions-Argumente" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Fehlende Lizenzen:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Meinten Sie:" +msgstr[1] "Meinten Sie:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"Ungültige Option %(option)r: Muss mit einem Buchstaben %(prefix_chars)r " -"beginnen" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= ist erforderlich für Optionen wie %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "Ungültiger Wert für conflict_resolution: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "Widersprüchliche Option: %s" -msgstr[1] "Widersprüchliche Optionen: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "Sich gegenseitig ausschließende Argumente müssen optional sein" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "Positions-Argumente" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "zeige diese Hilfsnachricht und beende" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Fehler: {path} existiert nicht." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' ist kein Verzeichnis" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "mehrere Subparser-Argumente sind nicht möglich" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, fuzzy +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "" +#~ "Die Option --contributor, --copyright oder --license ist erforderlich" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "Vorlage {template} konnte nicht gefunden werden" + +#~ msgid "can't write to '{}'" +#~ msgstr "kann nicht in '{}' schreiben" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "'{path}' hat keine erkannte Dateiendung, bitte verwenden Sie --style oder " +#~ "--explicit-license" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "Urheberrechtsinformation, wiederholbar" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "SPDX-Lizenz-Identifikator, wiederholbar" + +#~ msgid "file contributor, repeatable" +#~ msgstr "Dateimitwirkender, wiederholbar" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "Jahr der Urheberrechtsinformation, optional" + +#~ msgid "comment style to use, optional" +#~ msgstr "zu benutzender Kommentarstil, optional" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "zu benutzender Kommentarstil, optional" + +#~ msgid "name of template to use, optional" +#~ msgstr "Name der zu verwendenden Vorlage, optional" + +#~ msgid "do not include year in statement" +#~ msgstr "füge kein Jahr in Angabe hinzu" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "Jahr der Urheberrechtsinformation, optional" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "zu benutzender Kommentarstil, optional" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "zu benutzender Kommentarstil, optional" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "Dateien mit Lizenzinformationen:" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' ist im Binärformat, benutze daher '{new_path}' für die Kopfzeilen" + +#~ msgid "prevents output" +#~ msgstr "Verhindert Ausgabe" + +#, fuzzy +#~ msgid "formats output as errors per line (default)" +#~ msgstr "formatiert Ausgabe als rohen Text" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse ist ein Werkzeug, um die Empfehlungen von REUSE umzusetzen und zu " +#~ "überprüfen. Mehr Informationen finden Sie auf " +#~ "oder in der Online-Dokumentation auf ." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" +#~ "Spezifikation." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Die Arbeit der FSFE unterstützen:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Spenden sind entscheidend für unsere Leistungsfähigkeit und Autonomie. " +#~ "Sie ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo " +#~ "immer es nötig ist. Bitte erwägen Sie eine Spende unter ." + +#~ msgid "enable debug statements" +#~ msgstr "Debug-Statements aktivieren" + +#~ msgid "hide deprecation warnings" +#~ msgstr "„Veraltet“-Warnung verbergen" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "Git-Submodules nicht überspringen" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "Meson-Teilprojekte nicht überspringen" + +#~ msgid "do not use multiprocessing" +#~ msgstr "kein Multiprocessing verwenden" + +#~ msgid "define root of project" +#~ msgstr "Stammverzeichnis des Projekts bestimmen" + +#~ msgid "show program's version number and exit" +#~ msgstr "zeige die Versionsnummer des Programms und beende" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von " +#~ "Dateien" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" + +#~ msgid "list all non-compliant files" +#~ msgstr "alle nicht-konformen Dateien zeigen" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Überprüfen Sie das Projektverzeichnis auf die Einhaltung der Version " +#~ "{reuse_version} der REUSE-Spezifikation. Die neueste Version der " +#~ "Spezifikation finden Sie unter .\n" +#~ "\n" +#~ "Im Einzelnen werden die folgenden Kriterien geprüft:\n" +#~ "\n" +#~ "- Sind im Projekt schlechte (nicht erkannte, nicht SPDX-konforme) " +#~ "Lizenzen vorhanden?\n" +#~ "\n" +#~ "- Gibt es Lizenzen, auf die innerhalb des Projekts verwiesen wird, die " +#~ "aber nicht im Verzeichnis LICENSES/ enthalten sind?\n" +#~ "\n" +#~ "- Sind Lizenzen im Verzeichnis LICENSES/ enthalten, die nicht innerhalb " +#~ "des Projekts verwendet werden?\n" +#~ "\n" +#~ "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " +#~ "versehen?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "Komponentenliste im SPDX-Format ausgeben" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "Komponentenliste im SPDX-Format ausgeben" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "Listet alle unterstützten SPDX-Lizenzen auf" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{dep5}' konnte nicht geparst werden. Wir erhielten folgende " +#~ "Fehlermeldung: {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' ist keine Datei" + +#~ msgid "can't open '{}'" +#~ msgstr "kann '{}' nicht öffnen" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "kann nicht in Verzeichnis '{}' schreiben" + +#~ msgid "can't read or write '{}'" +#~ msgstr "kann '{}' nicht lesen oder schreiben" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Besuchen Sie für eine Liste von gültigen " +#~ "SPDX-Lizenz-Identifikatoren." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "Erstelle .reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "SPDX-Lizenz-Identifikator der Lizenz" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "" +#~ "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Fehler: {spdx_identifier} existiert bereits." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Funktioniert Ihre Internetverbindung?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "{spdx_identifier} erfolgreich heruntergeladen." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" + +#~ msgid "the following arguments are required: license" +#~ msgstr "Die folgenden Argumente sind erforderlich: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" + +#~ msgid "formats output as JSON" +#~ msgstr "formatiert Ausgabe als JSON" + +#, fuzzy +#~ msgid "formats output as plain text (default)" +#~ msgstr "formatiert Ausgabe als rohen Text" + +#, fuzzy +#~ msgid "formats output as errors per line" +#~ msgstr "formatiert Ausgabe als rohen Text" + +#~ msgid "usage: " +#~ msgstr "Benutzung: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() nicht definiert" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "unbekannte Argumente: %s" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "nicht erlaubt mit Argument %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "Argument \"-\" mit Modus %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "explizites Argument %r ignoriert" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "Kann '%(filename)s' nicht öffnen: %(error)s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "die folgenden Argumente sind erforderlich: %s" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "Kann Aktionen nicht zusammenführen - zwei Gruppen heißen %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' ist ein ungültiges Argument für Positionsangaben" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "eines der Argumente %s ist erforderlich" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "Ungültige Option %(option)r: Muss mit einem Buchstaben %(prefix_chars)r " +#~ "beginnen" + +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= ist erforderlich für Optionen wie %r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "erwartete ein Argument" +#, python-format +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "Ungültiger Wert für conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "erwartete höchstens ein Argument" +#, python-format +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "Widersprüchliche Option: %s" +#~ msgstr[1] "Widersprüchliche Optionen: %s" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "erwartete mindestens ein Argument" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "Sich gegenseitig ausschließende Argumente müssen optional sein" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "mehrere Subparser-Argumente sind nicht möglich" + +#, python-format +#~ msgid "unrecognized arguments: %s" +#~ msgstr "unbekannte Argumente: %s" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "erwartete %s Argument" -msgstr[1] "erwartete %s Argumente" +#~ msgid "not allowed with argument %s" +#~ msgstr "nicht erlaubt mit Argument %s" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "mehrdeutige Option: %(option)s könnte %(matches)s bedeuten" +#~ msgid "ignored explicit argument %r" +#~ msgstr "explizites Argument %r ignoriert" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "unerwarteter Options-String: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "die folgenden Argumente sind erforderlich: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r ist nicht aufrufbar" +#~ msgid "one of the arguments %s is required" +#~ msgstr "eines der Argumente %s ist erforderlich" + +#~ msgid "expected at most one argument" +#~ msgstr "erwartete höchstens ein Argument" + +#~ msgid "expected at least one argument" +#~ msgstr "erwartete mindestens ein Argument" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "ungültiger %(type)s Wert: %(value)r" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "erwartete %s Argument" +#~ msgstr[1] "erwartete %s Argumente" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "mehrdeutige Option: %(option)s könnte %(matches)s bedeuten" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: Fehler: %(message)s\n" +#~ msgid "unexpected option string: %s" +#~ msgstr "unerwarteter Options-String: %s" + +#, python-format +#~ msgid "%r is not callable" +#~ msgstr "%r ist nicht aufrufbar" + +#, python-format +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "ungültiger %(type)s Wert: %(value)r" + +#, python-format +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/eo.po b/po/eo.po index 3ada3bcda..fb81d1274 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for more information, and " -"for the online documentation." -msgstr "" -"reuse estas ilo por konformiĝo al la rekomendoj de REUSE. Vidu por pli da informo, kaj por " -"la reta dokumentado." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Subtenu la laboradon de FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Donacoj estas gravegaj por niaj forto kaj aŭtonomeco. Ili ebligas nin " -"daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " -"pripensi fari donacon ĉe ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "ŝalti sencimigajn ordonojn" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "kaŝi avertojn de evitindaĵoj" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "ne preterpasi Git-submodulojn" - -#: src/reuse/_main.py:99 -#, fuzzy -msgid "do not skip over Meson subprojects" -msgstr "ne preterpasi Meson-subprojektojn" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "ne uzi plurprocesoradon" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "difini radikon de la projekto" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "montri versionumeron de programo kaj eliri" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "subkomandoj" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "listigi ĉiujn nekonformajn dosierojn" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Kontroli la projektdosierujon por konformiĝo je versio {reuse_version} de la " -"REUSE Specifo. Vi povas trovi la lastan version de la specifo ĉe .\n" -"\n" -"Specife, oni kontrolas la sekvajn kriteriojn:\n" -"\n" -"- Ĉu estas malbonaj (nekonitaj, nekonformaj) permesiloj en la projekto?\n" -"\n" -"- Ĉu uziĝas permesiloj en la projekto, kiuj ne estas en la LICENSES/-" -"dosierujo?\n" -"\n" -"- Ĉu estas permesiloj en la LICENSES/-dosierujo, kiuj estas neuzataj?\n" -"\n" -"- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "presi la pecoliston de la projekto en SPDX-formo" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "presi la pecoliston de la projekto en SPDX-formo" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -385,124 +67,30 @@ msgstr "" "'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante la " "dosieron" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' ne estas dosiero" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' ne estas dosierujo" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "ne povas malfermi '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "ne povas skribi al dosierujo '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "ne povas legi aŭ skribi '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' ne estas valida SPDX Permesila Identigilo." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Ĉu vi intencis:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Vidu por listo de validaj SPDX Permesilaj " -"Identigiloj." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr "Krante .reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "SPDX Permesila Identigilo de permesilo" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "elŝuti ĉiujn mankantajn permesilojn kiujn oni eltrovis en la projekto" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Eraro: {spdx_identifier} jam ekzistas." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' ne finiĝas per .spdx" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Eraro: Malsukcesis elŝuti permesilon." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Ĉu via retkonekto funkcias?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Sukceses elŝutis {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output faras nenion kiam --all ankaŭ uziĝas" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "la sekvaj argumentoj nepras: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "ne povas uzi --output kun pli ol unu permesilo" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -512,174 +100,162 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "MALBONAJ PERMESILOJ" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' trovita en:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "ARĤAIKIGITAJ PERMESILOJ" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "La sekvajn permesilojn arĥaikigis SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "PERMESILOJ SEN DOSIERSUFIKSO" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "La sekvaj permesiloj ne havas dosiersufikson:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "MANKANTAJ PERMESILOJ" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "NEUZATAJ PERMESILOJ" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "La sekvajn permesilojn oni ne uzas:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "LEG-ERAROJ" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Ne povis legi:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANKANTAJ KOPIRAJTAJ KAJ PERMESILAJ INFORMOJ" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn kaj permesilajn informojn:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn informojn:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "La sekvaj dosieroj ne havas permesilajn informojn:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Malbonaj permesiloj:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Arĥaikigitaj permesiloj:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Permesiloj sen dosiersufikso:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Mankantaj permesiloj:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Neuzataj permesiloj:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Uzataj permesiloj:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 #, fuzzy msgid "Read errors:" msgstr "Leg-eraroj: {count}" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Dosieroj sen permesilinformo: {count} / {total}" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Gratulon! Via projekto konformas al versio {} de la REUSE Specifo :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Bedaŭrinde, via projekto ne konformas al versio {} de la REUSE Specifo :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' ne estas valida SPDX Permesila Identigilo." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Arĥaikigitaj permesiloj:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Permesiloj sen dosiersufikso:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Neuzataj permesiloj:" @@ -751,17 +327,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -769,7 +345,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -778,14 +354,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -794,7 +370,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -803,14 +379,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -819,185 +395,653 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "montri ĉi tiun helpmesaĝon kaj eliri" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Arĥaikigitaj permesiloj:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "anticipis unu argumenton" +msgstr[1] "anticipis unu argumenton" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "subkomandoj" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Mankantaj permesiloj:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "uzo: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() ne difiniĝas" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "nekonata analizilo %(parser_name)r (elektoj: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "argumento \"-\" kun moduso %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: eraro: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "ne povas malfermi '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "montri ĉi tiun helpmesaĝon kaj eliri" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "ne povas kunigi agojn - du grupoj nomiĝas %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' estas nevalida argumento por poziciaj" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "poziciaj argumentoj" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Mankantaj permesiloj:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Ĉu vi intencis:" +msgstr[1] "Ĉu vi intencis:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"nevalida elektebla ĉeno %(option)r: devas komenciĝi per signo " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= nepras por elektebloj kiel %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "nevalida valoro de conflict_resolution: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "konfliktanta elektebla ĉeno: %s" -msgstr[1] "konfliktantaj elekteblaj ĉenoj: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "reciproke ekskluzivaj argumentoj devas esti malnepraj" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "poziciaj argumentoj" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "montri ĉi tiun helpmesaĝon kaj eliri" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' ne finiĝas per .spdx" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' ne estas dosierujo" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' ne subtenas unuopliniajn komentojn, bonvolu ne uzi --single-line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' ne subtenas plurliniajn komentojn, bonvolu ne uzi --multi-line" + +#, fuzzy +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--output faras nenion kiam --all ankaŭ uziĝas" + +#, fuzzy +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "opcio --copyright aŭ --license necesas" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "ŝablono {template} netroveblas" + +#~ msgid "can't write to '{}'" +#~ msgstr "ne povas skribi al '{}'" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "La sekvaj dosieroj ne havas konatan dosiersufikson. Bonvolu uzi --style, " +#~ "--force-dot-license aŭ --skip-unrecognised:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "kopirajtlinio, ripetabla" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "SPDX Identigilo, ripetabla" + +#, fuzzy +#~ msgid "file contributor, repeatable" +#~ msgstr "SPDX Identigilo, ripetabla" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "jaro de kopirajtlinio, malnepra" + +#~ msgid "comment style to use, optional" +#~ msgstr "uzenda komentstilo, malnepra" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "ne povas havi plurajn subanalizilajn argumentojn" +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "uzenda komentstilo, malnepra" + +#~ msgid "name of template to use, optional" +#~ msgstr "nomo de uzenda ŝablono, malnepra" + +#~ msgid "do not include year in statement" +#~ msgstr "ne inkluzivi jaron en kopirajtlinio" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "jaro de kopirajtlinio, malnepra" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "uzenda komentstilo, malnepra" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "uzenda komentstilo, malnepra" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "Preterpasis dosieron '{path}' kiu jam enhavas REUSE-informojn" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "'{path}' estas duuma, tiel uzante '{new_path}' por la kapo" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse estas ilo por konformiĝo al la rekomendoj de REUSE. Vidu por pli da informo, kaj " +#~ "por la reta dokumentado." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Subtenu la laboradon de FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Donacoj estas gravegaj por niaj forto kaj aŭtonomeco. Ili ebligas nin " +#~ "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " +#~ "pripensi fari donacon ĉe ." + +#~ msgid "enable debug statements" +#~ msgstr "ŝalti sencimigajn ordonojn" + +#~ msgid "hide deprecation warnings" +#~ msgstr "kaŝi avertojn de evitindaĵoj" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "ne preterpasi Git-submodulojn" + +#, fuzzy +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "ne preterpasi Meson-subprojektojn" + +#~ msgid "do not use multiprocessing" +#~ msgstr "ne uzi plurprocesoradon" + +#~ msgid "define root of project" +#~ msgstr "difini radikon de la projekto" + +#~ msgid "show program's version number and exit" +#~ msgstr "montri versionumeron de programo kaj eliri" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" + +#~ msgid "list all non-compliant files" +#~ msgstr "listigi ĉiujn nekonformajn dosierojn" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Kontroli la projektdosierujon por konformiĝo je versio {reuse_version} de " +#~ "la REUSE Specifo. Vi povas trovi la lastan version de la specifo ĉe " +#~ ".\n" +#~ "\n" +#~ "Specife, oni kontrolas la sekvajn kriteriojn:\n" +#~ "\n" +#~ "- Ĉu estas malbonaj (nekonitaj, nekonformaj) permesiloj en la projekto?\n" +#~ "\n" +#~ "- Ĉu uziĝas permesiloj en la projekto, kiuj ne estas en la LICENSES/-" +#~ "dosierujo?\n" +#~ "\n" +#~ "- Ĉu estas permesiloj en la LICENSES/-dosierujo, kiuj estas neuzataj?\n" +#~ "\n" +#~ "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "presi la pecoliston de la projekto en SPDX-formo" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "presi la pecoliston de la projekto en SPDX-formo" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' ne estas dosiero" + +#~ msgid "can't open '{}'" +#~ msgstr "ne povas malfermi '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "ne povas skribi al dosierujo '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "ne povas legi aŭ skribi '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' ne estas valida SPDX Permesila Identigilo." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Vidu por listo de validaj SPDX Permesilaj " +#~ "Identigiloj." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "Krante .reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "SPDX Permesila Identigilo de permesilo" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "" +#~ "elŝuti ĉiujn mankantajn permesilojn kiujn oni eltrovis en la projekto" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Eraro: {spdx_identifier} jam ekzistas." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Eraro: Malsukcesis elŝuti permesilon." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Ĉu via retkonekto funkcias?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Sukceses elŝutis {spdx_identifier}." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output faras nenion kiam --all ankaŭ uziĝas" + +#~ msgid "the following arguments are required: license" +#~ msgstr "la sekvaj argumentoj nepras: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "ne povas uzi --output kun pli ol unu permesilo" + +#~ msgid "usage: " +#~ msgstr "uzo: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() ne difiniĝas" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "nekonataj argumentoj: %s" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "nekonata analizilo %(parser_name)r (elektoj: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "ne permesita kun argumento: %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argumento \"-\" kun moduso %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "malatentis malimplicitan argumenton %r" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "ne povas malfermi '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "la sekvaj argumentoj nepras: %s" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "ne povas kunigi agojn - du grupoj nomiĝas %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' estas nevalida argumento por poziciaj" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "unu el la argumentoj %s nepras" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "nevalida elektebla ĉeno %(option)r: devas komenciĝi per signo " +#~ "%(prefix_chars)r" + +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= nepras por elektebloj kiel %r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "anticipis unu argumenton" +#, python-format +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "nevalida valoro de conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "anticipis maksimume unu argumenton" +#, python-format +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "konfliktanta elektebla ĉeno: %s" +#~ msgstr[1] "konfliktantaj elekteblaj ĉenoj: %s" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "anticipis minimume unu argumenton" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "reciproke ekskluzivaj argumentoj devas esti malnepraj" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "ne povas havi plurajn subanalizilajn argumentojn" + +#, python-format +#~ msgid "unrecognized arguments: %s" +#~ msgstr "nekonataj argumentoj: %s" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "anticipis %s argumenton" -msgstr[1] "anticipis %s argumentojn" +#~ msgid "not allowed with argument %s" +#~ msgstr "ne permesita kun argumento: %s" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "dubsenca elekteblo: %(option)s povus egali al %(matches)s" +#~ msgid "ignored explicit argument %r" +#~ msgstr "malatentis malimplicitan argumenton %r" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "neanticipita elektebla ĉeno: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "la sekvaj argumentoj nepras: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r ne alvokeblas" +#~ msgid "one of the arguments %s is required" +#~ msgstr "unu el la argumentoj %s nepras" + +#~ msgid "expected at most one argument" +#~ msgstr "anticipis maksimume unu argumenton" + +#~ msgid "expected at least one argument" +#~ msgstr "anticipis minimume unu argumenton" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "nevalida %(type)s-valoro: %(value)r" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "anticipis %s argumenton" +#~ msgstr[1] "anticipis %s argumentojn" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "dubsenca elekteblo: %(option)s povus egali al %(matches)s" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: eraro: %(message)s\n" +#~ msgid "unexpected option string: %s" +#~ msgstr "neanticipita elektebla ĉeno: %s" + +#, python-format +#~ msgid "%r is not callable" +#~ msgstr "%r ne alvokeblas" + +#, python-format +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "nevalida %(type)s-valoro: %(value)r" + +#, python-format +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/es.po b/po/es.po index 35cdf0be7..a7a2c34bb 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-10-10 16:26+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish for more information, and " -"for the online documentation." -msgstr "" -"reuse es una herramienta para cumplir con las recomendaciones de la " -"iniciativa REUSE. Visita para obtener más " -"información, y para acceder a la " -"documentación en línea." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Esta versión de reuse es compatible con la versión {} de la Especificación " -"REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Apoya el trabajo de la FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Las donaciones son esenciales para nuestra fortaleza y autonomía. Estas nos " -"permiten continuar trabajando por el Software Libre allá donde sea " -"necesario. Por favor, considera el hacer una donación en ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "habilita instrucciones de depuración" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "ocultar las advertencias de que está obsoleto" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "no omitas los submódulos de Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "no te saltes los subproyectos de Meson" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "no utilices multiproceso" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "define el origen del proyecto" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "muestra la versión del programa y sale" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "subcomandos" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" -"Añadir copyright y licencias en la cabecera de uno o más archivos.\n" -"\n" -"Usando --copyright y --license, puede especificar qué titulares de derechos " -"de autor y licencias añadir a las cabeceras de los archivos dados.\n" -"\n" -"Usando --contributor, puede especificar las personas o entidades que han " -"contribuido pero no son titulares de los derechos de autor de los archivos " -"dados." - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Descargar una licencia y colocarla en el directorio LICENSES/ ." - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "lista todos los ficheros no compatibles" - -#: src/reuse/_main.py:166 -#, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Comprueba que el directorio del proyecto cumple con la versión " -"{reuse_version} de la especificación REUSE. Puede encontrar la última " -"versión de la especificación en .\n" -"\n" -"En concreto, se comprueban los siguientes criterios\n" -"\n" -"- ¿Existen licencias defectuosas (no reconocidas, no conformes con SPDX) en " -"el proyecto?\n" -"\n" -"- ¿Hay licencias obsoletas en el proyecto?\n" -"\n" -"- ¿Hay algún archivo de licencia en el directorio LICENSES/ sin extensión de " -"archivo?\n" -"\n" -"- ¿Hay licencias a las que se haga referencia dentro del proyecto, pero que " -"no estén incluidas en el directorio LICENSES/?\n" -"\n" -"- ¿Hay licencias incluidas en el directorio LICENSES/ que no se utilicen en " -"el proyecto?\n" -"\n" -"- ¿Hay errores de lectura?\n" -"\n" -"- ¿Tienen todos los archivos información válida sobre derechos de autor y " -"licencias?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" -"Archivos individuales de Lint. Los archivos especificados se comprueban para " -"ver si hay información de copyright y licencias, y si las licencias " -"encontradas están incluidas en el directorio LICENSES/ ." - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" -"enumerar los archivos no compatibles de la lista de archivos especificada" - -#: src/reuse/_main.py:217 -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "Genere una lista de materiales SPDX en formato RDF." - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "imprime la lista de materiales del proyecto en formato SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "Enumere todas las licencias SPDX no obsoletas de la lista oficial." - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "Lista de todas las licencias SPDX compatibles" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" -"Convertir . reuse/dep5 en un archivo REUSE.toml en la raíz del proyecto. El " -"archivo generado es semánticamente idéntico. El . reutilización/dep5 archivo " -"se elimina posteriormente." - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "convertir . reuse/dep5 a REUSE.toml" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{path}' no se pudo analizar. Con el siguiente mensaje de error: {message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -416,109 +69,14 @@ msgstr "" "'{path}' posee una expresión SPDX que no puede ser procesada; omitiendo el " "archivo" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' no es un fichero" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' no es un directorio" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "no se puede abrir '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "no se pude escribir en el directorio '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "no se puede leer o escribir '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' no es una expresión SPDX válida; abortando" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' no es un Identificador SPDX de Licencia válido." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Querías decir:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Consulta para obtener un listado de los " -"Identificadores SPDX de Licencia válidos." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "sin archivo '.reuse/dep5'" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Identificador SPDX de la licencia" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" -"fuente desde la que copiar las licencias LicenseRef- personalizadas, ya sea " -"un directorio que contenga el archivo o el propio archivo" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Error: {spdx_identifier} ya existe." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Error: {path} no existe." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Error: Fallo al descargar la licencia." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "¿Está funcionando tu conexión a Internet?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "{spdx_identifier} descargado con éxito." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output no tiene efecto cuando se utiliza junto con --all" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "se requieren los siguientes parámetros: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "no se puede utilizar --output con más de una licencia" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} debe ser un {type_name} (got {value}, que es una {value_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -527,17 +85,17 @@ msgstr "" "El elemento en la colección {attr_name} debe ser un {type_name} (obtiene " "{item_value}, que es un {item_class})." -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} no debe estar vacío." -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} debe ser un {type} (obtiene {value}, que es un {value_type})." -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -551,123 +109,110 @@ msgstr "" "el comentario generado carece del mensaje de copyright o de las frases de " "licencia" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "formato de salida JSON" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "Formato de salida como texto sin formato (por defecto)" - -#: src/reuse/lint.py:45 -#, fuzzy -msgid "formats output as errors per line" -msgstr "formatea la salida como un texto plano" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "LICENCIAS MALAS" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' encontrado en:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "LICENCIAS OBSOLETAS" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Las siguientes licencias han quedado obsoletas según SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCIAS SIN EXTENSIÓN DE FICHERO" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Las siguientes licencias no tienen extensión de fichero:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "LICENCIAS NO ENCONTRADAS" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "LICENCIAS NO UTILIZADAS" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Las siguientes licencias no son utilizadas:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ERRORES DE LECTURA" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "No se pudo leer:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FALTA INFORMACIÓN SOBRE COPYRIGHT Y LICENCIA" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Los siguientes archivos carecen de información de copyright y licencia:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Los siguientes ficheros carecen de información de copyright:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Los siguientes ficheros carecen de información de licencia:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RESUMEN" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Licencias malas:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Licencias obsoletas:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licencias sin extensión de fichero:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Licencias no encontradas:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Licencias no utilizadas:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Licencias utilizadas:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Errores de lectura:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "archivos con información sobre los derechos de autor:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "con información sobre las licencias:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -675,7 +220,7 @@ msgstr "" "¡Enhorabuena! Tu proyecto es compatible con la versión {} de la " "Especificación REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -683,46 +228,46 @@ msgstr "" "Desafortunadamente, tu proyecto no es compatible con la versión {} de la " "Especificación REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "RECOMENDACIONES" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' no es un Identificador SPDX de Licencia válido." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licencias obsoletas:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licencias sin extensión de fichero:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licencias no utilizadas:" @@ -799,17 +344,17 @@ msgstr "" "el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " "está instalado" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -822,7 +367,7 @@ msgstr "" "'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -836,7 +381,7 @@ msgstr "" "los nuevos identificadores recomendados se encuentran aquí: " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -846,7 +391,7 @@ msgstr "" "con la licencia en el directorio 'LICENCIAS' no tiene una extensión '.txt'. " "Cambie el nombre de los archivos en consecuencia." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -862,7 +407,7 @@ msgstr "" "En el caso de las licencias personalizadas (que empiezan por 'LicenseRef-'), " "deberá añadir estos archivos usted mismo." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -877,7 +422,7 @@ msgstr "" "elimine el texto de la licencia no utilizado si está seguro de que ningún " "archivo o fragmento de código tiene una licencia como tal." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -888,7 +433,7 @@ msgstr "" "archivos. Encontrará los archivos afectados en la parte superior como parte " "de los mensajes de los errores registrados." -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -902,193 +447,796 @@ msgstr "" "License-Identifer' a cada archivo. El tutorial explica otras formas de " "hacerlo: " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -"rellenar el campo LicenseConcluded; ten en cuenta que la reutilización no " -"puede garantizar que el campo sea exacto" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "nombre de la persona que firma el informe SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "nombre de la organización que firma el informe SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "mostrar este mensaje de ayuda y salir" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Licencias obsoletas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +#, fuzzy +msgid "Options" +msgstr "opciones" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "se espera un parámetro" +msgstr[1] "se espera un parámetro" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." msgstr "" -"error: se requiere --creator-person=NAME o --creator-organization=NAME " -"cuando se proporciona --add-license-concluded" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "subcomandos" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Licencias no encontradas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -"'{path}' no coincide con un patrón del archivo SPDX común. Encontrarás las " -"convenciones de la nomenclatura sugeridas aquí: https://spdx.github.io/spdx-" -"spec/conformance/#44-standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "uso: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() no definido" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" msgstr "" -"analizador sintáctico desconocido: %(parser_name)r (alternativas: " -"%(choices)s)" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "parámetro \"-\" con modo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: error: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "no se puede abrir '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "mostrar este mensaje de ayuda y salir" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "no se pueden fusionar las acciones: dos grupos se llaman %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' es un argumento posicional inválido" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "parámetros posicionales" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Licencias no encontradas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Querías decir:" +msgstr[1] "Querías decir:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"Opción no válida %(option)r: Debe comenzar con una letra %(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "se requiere dest= para opciones como %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Error: {path} no existe." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' no es un directorio" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' no admite comentarios de una sola línea, no utilices --single-" +#~ "line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "'{path}' no admite comentarios multilínea, no utilices --multi-line" + +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised no tiene efecto cuando se utiliza junto con --style" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "se requiere la opción --contributor, --copyright o --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "no pudo encontrarse la plantilla {template}" + +#~ msgid "can't write to '{}'" +#~ msgstr "no se puede escribir en '{}'" + +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Los siguientes archivos no tienen una extensión de archivo reconocida. " +#~ "Por favor use --style, -force-dot-license, -fallback-dot-license o -skip-" +#~ "unrecognized:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "declaración de los derechos de autor, repetible" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identificador SPDX, repetible" + +#~ msgid "file contributor, repeatable" +#~ msgstr "colaborador de archivos, repetible" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "año de la declaración de copyright; opcional" + +#~ msgid "comment style to use, optional" +#~ msgstr "estilo de comentario a utilizar; opcional" + +#~ msgid "copyright prefix to use, optional" +#~ msgstr "prefijo de copyright para usar, opcional" + +#~ msgid "name of template to use, optional" +#~ msgstr "nombre de la plantilla a utilizar; opcional" + +#~ msgid "do not include year in statement" +#~ msgstr "no incluir el año en la declaración" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "fusionar las líneas del copyright si las declaraciones del copyright son " +#~ "idénticas" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "forzar el estilo del comentario de una sola línea, opcional" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "forzar el estilo del comentario multilínea, opcional" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "" +#~ "añadir las cabeceras a todos los archivos de los directorios " +#~ "especificados de forma recursiva" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" + +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "" +#~ "escribir siempre un archivo .license en lugar de una cabecera dentro del " +#~ "archivo" + +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "" +#~ "escribir un archivo .license en archivos con estilos de comentario no " +#~ "reconocidos" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "omitir los archivos con estilos de comentario no reconocidos" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "omitir los archivos que ya contienen la información REUSE" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' es un fichero binario: en consecuencia, se utiliza '{new_path}' " +#~ "para la cabecera" + +#~ msgid "prevents output" +#~ msgstr "impide la producción" + +#~ msgid "formats output as errors per line (default)" +#~ msgstr "Formatea la salida como errores por línea (por defecto)" + +#~ msgid "files to lint" +#~ msgstr "archivos para limpiar" + +#, python-brace-format +#~ msgid "'{file}' is not inside of '{root}'" +#~ msgstr "'{file}' no está dentro de '{root}'" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse es una herramienta para cumplir con las recomendaciones de la " +#~ "iniciativa REUSE. Visita para obtener más " +#~ "información, y para acceder a la " +#~ "documentación en línea." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Esta versión de reuse es compatible con la versión {} de la " +#~ "Especificación REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Apoya el trabajo de la FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Las donaciones son esenciales para nuestra fortaleza y autonomía. Estas " +#~ "nos permiten continuar trabajando por el Software Libre allá donde sea " +#~ "necesario. Por favor, considera el hacer una donación en ." + +#~ msgid "enable debug statements" +#~ msgstr "habilita instrucciones de depuración" + +#~ msgid "hide deprecation warnings" +#~ msgstr "ocultar las advertencias de que está obsoleto" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "no omitas los submódulos de Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "no te saltes los subproyectos de Meson" + +#~ msgid "do not use multiprocessing" +#~ msgstr "no utilices multiproceso" + +#~ msgid "define root of project" +#~ msgstr "define el origen del proyecto" + +#~ msgid "show program's version number and exit" +#~ msgstr "muestra la versión del programa y sale" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files." +#~ msgstr "" +#~ "Añadir copyright y licencias en la cabecera de uno o más archivos.\n" +#~ "\n" +#~ "Usando --copyright y --license, puede especificar qué titulares de " +#~ "derechos de autor y licencias añadir a las cabeceras de los archivos " +#~ "dados.\n" +#~ "\n" +#~ "Usando --contributor, puede especificar las personas o entidades que han " +#~ "contribuido pero no son titulares de los derechos de autor de los " +#~ "archivos dados." + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" + +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Descargar una licencia y colocarla en el directorio LICENSES/ ." + +#~ msgid "list all non-compliant files" +#~ msgstr "lista todos los ficheros no compatibles" + +#, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Comprueba que el directorio del proyecto cumple con la versión " +#~ "{reuse_version} de la especificación REUSE. Puede encontrar la última " +#~ "versión de la especificación en .\n" +#~ "\n" +#~ "En concreto, se comprueban los siguientes criterios\n" +#~ "\n" +#~ "- ¿Existen licencias defectuosas (no reconocidas, no conformes con SPDX) " +#~ "en el proyecto?\n" +#~ "\n" +#~ "- ¿Hay licencias obsoletas en el proyecto?\n" +#~ "\n" +#~ "- ¿Hay algún archivo de licencia en el directorio LICENSES/ sin extensión " +#~ "de archivo?\n" +#~ "\n" +#~ "- ¿Hay licencias a las que se haga referencia dentro del proyecto, pero " +#~ "que no estén incluidas en el directorio LICENSES/?\n" +#~ "\n" +#~ "- ¿Hay licencias incluidas en el directorio LICENSES/ que no se utilicen " +#~ "en el proyecto?\n" +#~ "\n" +#~ "- ¿Hay errores de lectura?\n" +#~ "\n" +#~ "- ¿Tienen todos los archivos información válida sobre derechos de autor y " +#~ "licencias?" + +#~ msgid "" +#~ "Lint individual files. The specified files are checked for the presence " +#~ "of copyright and licensing information, and whether the found licenses " +#~ "are included in the LICENSES/ directory." +#~ msgstr "" +#~ "Archivos individuales de Lint. Los archivos especificados se comprueban " +#~ "para ver si hay información de copyright y licencias, y si las licencias " +#~ "encontradas están incluidas en el directorio LICENSES/ ." + +#~ msgid "list non-compliant files from specified list of files" +#~ msgstr "" +#~ "enumerar los archivos no compatibles de la lista de archivos especificada" + +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "Genere una lista de materiales SPDX en formato RDF." + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "imprime la lista de materiales del proyecto en formato SPDX" + +#~ msgid "List all non-deprecated SPDX licenses from the official list." +#~ msgstr "Enumere todas las licencias SPDX no obsoletas de la lista oficial." + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "Lista de todas las licencias SPDX compatibles" + +#~ msgid "" +#~ "Convert .reuse/dep5 into a REUSE.toml file in your project root. The " +#~ "generated file is semantically identical. The .reuse/dep5 file is " +#~ "subsequently deleted." +#~ msgstr "" +#~ "Convertir . reuse/dep5 en un archivo REUSE.toml en la raíz del proyecto. " +#~ "El archivo generado es semánticamente idéntico. El . reutilización/dep5 " +#~ "archivo se elimina posteriormente." + +#~ msgid "convert .reuse/dep5 to REUSE.toml" +#~ msgstr "convertir . reuse/dep5 a REUSE.toml" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{path}' no se pudo analizar. Con el siguiente mensaje de error: {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' no es un fichero" + +#~ msgid "can't open '{}'" +#~ msgstr "no se puede abrir '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "no se pude escribir en el directorio '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "no se puede leer o escribir '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' no es una expresión SPDX válida; abortando" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' no es un Identificador SPDX de Licencia válido." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Consulta para obtener un listado de los " +#~ "Identificadores SPDX de Licencia válidos." + +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "sin archivo '.reuse/dep5'" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Identificador SPDX de la licencia" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "" +#~ "descargar todas las licencias no disponibles detectadas en el proyecto" + +#~ msgid "" +#~ "source from which to copy custom LicenseRef- licenses, either a directory " +#~ "that contains the file or the file itself" +#~ msgstr "" +#~ "fuente desde la que copiar las licencias LicenseRef- personalizadas, ya " +#~ "sea un directorio que contenga el archivo o el propio archivo" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Error: {spdx_identifier} ya existe." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Error: Fallo al descargar la licencia." + +#~ msgid "Is your internet connection working?" +#~ msgstr "¿Está funcionando tu conexión a Internet?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "{spdx_identifier} descargado con éxito." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output no tiene efecto cuando se utiliza junto con --all" + +#~ msgid "the following arguments are required: license" +#~ msgstr "se requieren los siguientes parámetros: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "no se puede utilizar --output con más de una licencia" + +#~ msgid "formats output as JSON" +#~ msgstr "formato de salida JSON" + +#~ msgid "formats output as plain text (default)" +#~ msgstr "Formato de salida como texto sin formato (por defecto)" + +#, fuzzy +#~ msgid "formats output as errors per line" +#~ msgstr "formatea la salida como un texto plano" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "rellenar el campo LicenseConcluded; ten en cuenta que la reutilización no " +#~ "puede garantizar que el campo sea exacto" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "nombre de la persona que firma el informe SPDX" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "nombre de la organización que firma el informe SPDX" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "error: se requiere --creator-person=NAME o --creator-organization=NAME " +#~ "cuando se proporciona --add-license-concluded" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "'{path}' no coincide con un patrón del archivo SPDX común. Encontrarás " +#~ "las convenciones de la nomenclatura sugeridas aquí: https://spdx.github." +#~ "io/spdx-spec/conformance/#44-standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "uso: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() no definido" -#: /usr/lib/python3.10/argparse.py:1596 #, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "valor no válido de conflict_resolution: %r" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "" +#~ "analizador sintáctico desconocido: %(parser_name)r (alternativas: " +#~ "%(choices)s)" -#: /usr/lib/python3.10/argparse.py:1614 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "cadena de opción conflictiva: %s" -msgstr[1] "cadenas de opción conflictivas: %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "parámetro \"-\" con modo %r" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "los parámetros mutuamente excluyentes deben ser opcionales" +#, python-format +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "no se puede abrir '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "parámetros posicionales" +#, python-format +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "no se pueden fusionar las acciones: dos grupos se llaman %r" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "opciones" +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' es un argumento posicional inválido" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "mostrar este mensaje de ayuda y salir" +#, python-format +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "Opción no válida %(option)r: Debe comenzar con una letra %(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "no puede contener múltiples parámetros del subanalizador sintáctico" +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "se requiere dest= para opciones como %r" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "parámetros no reconocidos: %s" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "valor no válido de conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "no permitido con el parámetro %s" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "cadena de opción conflictiva: %s" +#~ msgstr[1] "cadenas de opción conflictivas: %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "los parámetros mutuamente excluyentes deben ser opcionales" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "no puede contener múltiples parámetros del subanalizador sintáctico" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "parámetro explícito ignorado: %r" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "parámetros no reconocidos: %s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "los siguientes parámetros son obligatorios: %s" +#~ msgid "not allowed with argument %s" +#~ msgstr "no permitido con el parámetro %s" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "se requiere uno de los parámetros %s" +#~ msgid "ignored explicit argument %r" +#~ msgstr "parámetro explícito ignorado: %r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "se espera un parámetro" +#, python-format +#~ msgid "the following arguments are required: %s" +#~ msgstr "los siguientes parámetros son obligatorios: %s" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "se espera un parámetro, como máximo" +#, python-format +#~ msgid "one of the arguments %s is required" +#~ msgstr "se requiere uno de los parámetros %s" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "se espera un parámetro, como mínimo" +#~ msgid "expected at most one argument" +#~ msgstr "se espera un parámetro, como máximo" -#: /usr/lib/python3.10/argparse.py:2183 -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "se espera el parámetro %s" -msgstr[1] "se esperan los parámetros %s" +#~ msgid "expected at least one argument" +#~ msgstr "se espera un parámetro, como mínimo" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "opción ambigua: %(option)s podría coincidir con %(matches)s" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "se espera el parámetro %s" +#~ msgstr[1] "se esperan los parámetros %s" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "cadena de opción inesperada: %s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "opción ambigua: %(option)s podría coincidir con %(matches)s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r no se puede invocar" +#~ msgid "unexpected option string: %s" +#~ msgstr "cadena de opción inesperada: %s" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "valor no válido de %(type)s: %(value)r" +#~ msgid "%r is not callable" +#~ msgstr "%r no se puede invocar" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "opción inválida: %(value)r (opciones: %(choices)s)" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "valor no válido de %(type)s: %(value)r" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: error: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "opción inválida: %(value)r (opciones: %(choices)s)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/fr.po b/po/fr.po index c182875c0..affc6459b 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French 1;\n" "X-Generator: Weblate 5.7-dev\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" -"{path} ne supporte pas les commentaires mono-lignes. Merci de ne pas " -"utiliser --single-line" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "" -"{path} ne supporte pas les commentaires multi-lignes. Merci de ne pas " -"utiliser --multi-line" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, fuzzy, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "Le fichier {path} non reconnu a été ignoré" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "'{path}' non reconnu, création de '{path}.license'" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Le fichier ignoré {path} contenait déjà les données REUSE" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -67,342 +50,17 @@ msgstr "" "probablement incorrect. Nouvel en-tête non écrit." #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "En-tête de {path} modifié avec succès" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "" -"--skip-unrecognised est sans effet quand il est utilisé en même temps que --" -"style" - -#: src/reuse/_annotate.py:231 -msgid "option --contributor, --copyright or --license is required" -msgstr "une des options --contributor, --copyright ou --license est nécessaire" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "le modèle {template} est introuvable" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "écriture impossible dans '{}'" - -#: src/reuse/_annotate.py:366 -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" -"Les fichiers suivants n'ont pas une extension reconnue. Merci d'utiliser --" -"style, --force-dot-license, --fallback-dot-license ou --skip-unrecognised :" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "déclaration de droits d'auteur, répétable" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "Identifiant SPDX, répétable" - -#: src/reuse/_annotate.py:395 -msgid "file contributor, repeatable" -msgstr "contributeur au fichier, répétable" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "année de déclaration de droits d'auteur, facultatif" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "style de commentaire à utiliser, facultatif" - -#: src/reuse/_annotate.py:417 -msgid "copyright prefix to use, optional" -msgstr "préfixe de droits d'auteur à utiliser, facultatif" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "nom de modèle à utiliser, facultatif" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "ne pas inclure d'année dans la déclaration" - -#: src/reuse/_annotate.py:440 -msgid "merge copyright lines if copyright statements are identical" -msgstr "" -"fusionner les lignes de droits d'auteur si les déclarations de droits " -"d'auteur sont identiques" - -#: src/reuse/_annotate.py:446 -msgid "force single-line comment style, optional" -msgstr "forcer le style de commentaire monoligne, facultatif" - -#: src/reuse/_annotate.py:451 -msgid "force multi-line comment style, optional" -msgstr "forcer le style de commentaire multiligne, facultatif" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "" -"ajouter récursivement les en-têtes dans tous les fichiers des répertoires " -"spécifiés" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "" -"ne pas remplacer le premier en-tête dans le fichier, mais simplement en " -"ajouter un" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "" -"toujours écrire un fichier .license au lieu d'une entête dans le fichier" - -#: src/reuse/_annotate.py:480 -#, fuzzy -msgid "write a .license file to files with unrecognised comment styles" -msgstr "" -"écrire un fichier .license pour les fichiers au style de commentaire inconnu" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "" -"ignorer les fichiers comportant des styles de commentaires non reconnus" - -#: src/reuse/_annotate.py:497 -msgid "skip files that already contain REUSE information" -msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "" -"'{path}' est un fichier binaire, par conséquent le fichier '{new_path}' est " -"utilisé pour l'en-tête" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "empêche la sortie" - -#: src/reuse/_lint_file.py:31 -#, fuzzy -msgid "formats output as errors per line (default)" -msgstr "génère une ligne par erreur" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" -"reuse est un outil pour la conformité aux recommandations de l'initiative " -"REUSE. Voir pour plus d'informations, et pour la documentation en ligne." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Cette version de reuse est compatible avec la version {} de la spécification " -"REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Soutenir le travail de la FSFE :" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Les dons sont cruciaux pour notre force et notre autonomie. Ils nous " -"permettent de continuer à travailler pour le Logiciel Libre partout où c'est " -"nécessaire. Merci d'envisager de faire un don ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "activer les instructions de débogage" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "masquer les avertissements d'obsolescence" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "ne pas omettre les sous-modules Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "ne pas omettre les sous-projets Meson" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "ne pas utiliser le multiprocessing" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "définition de la racine (root) du projet" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "voir la version du programme et quitter" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "sous-commandes" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" -"ajoute les informations de droits d'auteur et de licence dans les en-têtes " -"des fichiers" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" -"Ajoute un copyright et une licence dans l'entête d'un ou plusieurs " -"fichiers.\n" -"\n" -"En utilisant --copyright et --license, vous pouvez spécifier les détenteurs " -"de copyrights et les licences à ajouter dans les entêtes des fichiers " -"spécifiés.\n" -"\n" -"En utilisant --contributor, vous pouvez spécifier les personnes ou entités " -"ayant contribué aux fichiers spécifiés sans être détenteurs de copyright." - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "télécharge une licence et la placer dans le répertoire LICENSES" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Télécharge une licence dans le répertoire LICENSES." - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "liste tous les fichiers non-conformes" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Vérifie le répertoire projet pour assurer la conformité à la version " -"{reuse_version} de la spécification REUSE. Vous pouvez trouver la dernière " -"version de la spécification à l'adresse .\n" -"\n" -"En particulier, les critères suivants sont vérifiés :\n" -"\n" -"- Une mauvaise licence (non reconnue, non conforme à SPDX) se trouve-t-elle " -"dans le projet ?\n" -"\n" -"- Des licences référencées dans le projet sont-elles absentes du répertoire " -"LICENSES/ ?\n" -"\n" -"- Y a-t-il des licences dans le répertoire LICENSES/ qui sont inutilisées " -"dans le projet ?\n" -"\n" -"- Tous les fichiers disposent-ils de données de droits d'auteur et de " -"licence valides ?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "imprime la nomenclature du projet au format SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "imprime la nomenclature du projet au format SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "liste toutes les licences SPDX acceptées" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "convertit .reuse/dep5 en REUSE.toml" - -#: src/reuse/_main.py:311 -#, fuzzy, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " -"suivant : {message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -410,103 +68,7 @@ msgstr "" "'{path}' contient une expression SPDX qui ne peut pas être analysée : le " "fichier est ignoré" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' n'est pas un fichier" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' n'est pas un répertoire" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "'{}' ne peut être ouvert" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "écriture impossible dans le répertoire '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "lecture ou écriture impossible pour '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' n'est pas une expression SPDX valide, abandon" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' n'est pas un identifiant de licence SPDX valide." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Vouliez-vous dire :" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Consultez pour une liste des identifiants de " -"licence SPDX valides." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "aucun fichier '.reuse/dep5'" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Identification de la licence SPDX" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "télécharger toutes les licences manquantes détectées dans le projet" - -#: src/reuse/download.py:145 -#, fuzzy -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" -"source pour la copie des licences personnalisées LicenseRef-, au choix un " -"dossier contenant les fichiers ou bien directement un fichier" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Erreur : {spdx_identifier} existe déjà." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Erreur : '{path}' n'existe pas." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Erreur : échec du téléchargement de licence." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Votre connexion internet fonctionne-t-elle ?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Téléchargement de {spdx_identifier} terminé." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output n'a pas d'effet s'il est utilisé en même temps que --all" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "les arguments suivants sont nécessaires : licence" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "--output ne peut pas être utilisé avec plus d'une licence" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, fuzzy, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -514,7 +76,7 @@ msgstr "" "{attr_name} doit être un(e) {type_name} (obtenu {value} qui est un(e) " "{value_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, fuzzy, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -523,18 +85,18 @@ msgstr "" "Les éléments de la collection {attr_name} doivent être des {type_name} " "(obtenu {item_value} qui et un(e) {item_class})." -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} ne doit pas être vide." -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, fuzzy, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} doit être un(e) {type} (obtenu {value} qui est un {value_type})." -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, fuzzy, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -548,126 +110,112 @@ msgstr "" "les commentaires générés ne contiennent pas de ligne ou d'expression de " "droits d'auteur ou de licence" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "applique le format JSON à la sortie" - -#: src/reuse/lint.py:39 -#, fuzzy -msgid "formats output as plain text (default)" -msgstr "applique le format texte brut pour la sortie" - -#: src/reuse/lint.py:45 -#, fuzzy -msgid "formats output as errors per line" -msgstr "génère une ligne par erreur" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "MAUVAISES LICENCES" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' trouvé dans :" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "LICENCES OBSOLÈTES" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCES SANS EXTENSION DE FICHIER" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Les licences suivantes n'ont pas d'extension de fichier :" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "LICENCES MANQUANTES" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "LICENCES INUTILISÉES" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Les licences suivantes ne sont pas utilisées :" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ERREURS DE LECTURE" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Illisibles :" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Les fichiers suivants ne contiennent pas de données de droits d'auteur et de " "licence :" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "" "Les fichiers suivants ne contiennent pas de données de droits d'auteur :" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Les fichiers suivants ne contiennent pas de données de licence :" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RÉSUMÉ" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Mauvaises licences :" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Licences obsolètes :" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licences sans extension de fichier :" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Licences manquantes :" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Licences inutilisées :" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Licences utilisées :" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Erreurs de lecture :" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Fichiers contenant des droits d'auteur :" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Fichiers contenant des licences :" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -675,7 +223,7 @@ msgstr "" "Félicitations ! Votre projet est conforme à la version {} de la " "spécification REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -683,46 +231,46 @@ msgstr "" "Malheureusement, votre projet n'est pas conforme à la version {} de la " "spécification REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "RECOMMANDATIONS" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, fuzzy, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "{path} : la licence {lic} est manquante\n" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "{path} : erreur de lecture\n" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "{path}  : pas d'identifiant de licence\n" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, fuzzy, python-brace-format msgid "{path}: no copyright notice\n" msgstr "{path} : pas de copyright\n" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path} : mauvaise licence {lic}\n" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path} : licence dépréciée\n" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path} : licence sans extension de fichier\n" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path} : licence inutilisée\n" @@ -806,17 +354,17 @@ msgstr "" "le projet '{}' n'est pas un dépôt VCS ou le logiciel VCS requis n'est pas " "installé" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -829,7 +377,7 @@ msgstr "" "identifiants personnalisés ne commencent pas par 'LicenseRef-'. FAQ à propos " "des licences personnalisées : https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -843,7 +391,7 @@ msgstr "" "leur nouvel identifiant recommandé peut être trouvé ici : " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 #, fuzzy msgid "" "Fix licenses without file extension: At least one license text file in the " @@ -854,7 +402,7 @@ msgstr "" "licence dans le dossier 'LICENSES' n'a pas l'extension de fichier '.txt'. " "Veuillez renommes ce(s) fichier(s)." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -869,7 +417,7 @@ msgstr "" "fichiers licence manquants. Pour les licences personnalisées (commençant par " "'LicenseRef-'), vous devez ajouter ces fichiers vous-même." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 #, fuzzy msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " @@ -885,7 +433,7 @@ msgstr "" "de licence inutiles si vous êtes sûr qu'aucun document n'est concerné par " "ces licences." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 #, fuzzy msgid "" "Fix read errors: At least one of the files in your directory cannot be read " @@ -896,7 +444,7 @@ msgstr "" "peut pas être lu par l'outil. Vérifiez ces permissions. Vous trouverez les " "fichiers concernés en tête de la sortie, avec les messages d'erreur." -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -910,192 +458,770 @@ msgstr "" "Identifier' dans chaque fichier. Le tutoriel donne d'autres moyens de les " "ajouter : " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -"compléter le champ LicenseConcluded ; notez que la réutilisation ne garantit " -"pas que le champ soit correct" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "nom de la personne signataire du rapport SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "nom de l'organisation signataire du rapport SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "afficher ce message d'aide et quitter" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Licences obsolètes :" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +#, fuzzy +msgid "Options" +msgstr "options" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "un argument est attendu" +msgstr[1] "un argument est attendu" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "sous-commandes" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Licences manquantes :" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -"erreur : spécifier --creator-person=NOM ou --creator-organization=NOM est " -"nécessaire quand --add-license-concluded est fourni" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -"{path} ne correspond pas à un motif de fichier SPDX commun. Vérifiez les " -"conventions de nommage conseillées à l'adresse https://spdx.github.io/spdx-" -"spec/conformance/#44-standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "usage : " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() est indéfini" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "analyseur %(parser_name)r inconnu (choix : %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "argument \"-\" avec le mode %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s : erreur : %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "'%(filename)s' ne peut pas être ouvert : %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "afficher ce message d'aide et quitter" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' est un argument invalide pour les positionnels" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "arguments positionnels" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Licences manquantes :" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Vouliez-vous dire :" +msgstr[1] "Vouliez-vous dire :" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"option de chaîne %(option)r invalide : doit débuter par un caractère " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= est nécessaire pour les options comme %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Erreur : '{path}' n'existe pas." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' n'est pas un répertoire" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "{path} ne supporte pas les commentaires mono-lignes. Merci de ne pas " +#~ "utiliser --single-line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "{path} ne supporte pas les commentaires multi-lignes. Merci de ne pas " +#~ "utiliser --multi-line" + +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised est sans effet quand il est utilisé en même temps que " +#~ "--style" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "" +#~ "une des options --contributor, --copyright ou --license est nécessaire" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "le modèle {template} est introuvable" + +#~ msgid "can't write to '{}'" +#~ msgstr "écriture impossible dans '{}'" + +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Les fichiers suivants n'ont pas une extension reconnue. Merci d'utiliser " +#~ "--style, --force-dot-license, --fallback-dot-license ou --skip-" +#~ "unrecognised :" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "déclaration de droits d'auteur, répétable" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identifiant SPDX, répétable" + +#~ msgid "file contributor, repeatable" +#~ msgstr "contributeur au fichier, répétable" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "année de déclaration de droits d'auteur, facultatif" + +#~ msgid "comment style to use, optional" +#~ msgstr "style de commentaire à utiliser, facultatif" + +#~ msgid "copyright prefix to use, optional" +#~ msgstr "préfixe de droits d'auteur à utiliser, facultatif" + +#~ msgid "name of template to use, optional" +#~ msgstr "nom de modèle à utiliser, facultatif" + +#~ msgid "do not include year in statement" +#~ msgstr "ne pas inclure d'année dans la déclaration" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "fusionner les lignes de droits d'auteur si les déclarations de droits " +#~ "d'auteur sont identiques" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "forcer le style de commentaire monoligne, facultatif" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "forcer le style de commentaire multiligne, facultatif" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "" +#~ "ajouter récursivement les en-têtes dans tous les fichiers des répertoires " +#~ "spécifiés" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "" +#~ "ne pas remplacer le premier en-tête dans le fichier, mais simplement en " +#~ "ajouter un" + +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "" +#~ "toujours écrire un fichier .license au lieu d'une entête dans le fichier" + +#, fuzzy +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "" +#~ "écrire un fichier .license pour les fichiers au style de commentaire " +#~ "inconnu" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "" +#~ "ignorer les fichiers comportant des styles de commentaires non reconnus" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' est un fichier binaire, par conséquent le fichier '{new_path}' " +#~ "est utilisé pour l'en-tête" + +#~ msgid "prevents output" +#~ msgstr "empêche la sortie" + +#, fuzzy +#~ msgid "formats output as errors per line (default)" +#~ msgstr "génère une ligne par erreur" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse est un outil pour la conformité aux recommandations de l'initiative " +#~ "REUSE. Voir pour plus d'informations, et " +#~ " pour la documentation en ligne." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Cette version de reuse est compatible avec la version {} de la " +#~ "spécification REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Soutenir le travail de la FSFE :" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Les dons sont cruciaux pour notre force et notre autonomie. Ils nous " +#~ "permettent de continuer à travailler pour le Logiciel Libre partout où " +#~ "c'est nécessaire. Merci d'envisager de faire un don ." + +#~ msgid "enable debug statements" +#~ msgstr "activer les instructions de débogage" + +#~ msgid "hide deprecation warnings" +#~ msgstr "masquer les avertissements d'obsolescence" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "ne pas omettre les sous-modules Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "ne pas omettre les sous-projets Meson" + +#~ msgid "do not use multiprocessing" +#~ msgstr "ne pas utiliser le multiprocessing" + +#~ msgid "define root of project" +#~ msgstr "définition de la racine (root) du projet" + +#~ msgid "show program's version number and exit" +#~ msgstr "voir la version du programme et quitter" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "ajoute les informations de droits d'auteur et de licence dans les en-" +#~ "têtes des fichiers" + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files." +#~ msgstr "" +#~ "Ajoute un copyright et une licence dans l'entête d'un ou plusieurs " +#~ "fichiers.\n" +#~ "\n" +#~ "En utilisant --copyright et --license, vous pouvez spécifier les " +#~ "détenteurs de copyrights et les licences à ajouter dans les entêtes des " +#~ "fichiers spécifiés.\n" +#~ "\n" +#~ "En utilisant --contributor, vous pouvez spécifier les personnes ou " +#~ "entités ayant contribué aux fichiers spécifiés sans être détenteurs de " +#~ "copyright." + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "télécharge une licence et la placer dans le répertoire LICENSES" + +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Télécharge une licence dans le répertoire LICENSES." + +#~ msgid "list all non-compliant files" +#~ msgstr "liste tous les fichiers non-conformes" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Vérifie le répertoire projet pour assurer la conformité à la version " +#~ "{reuse_version} de la spécification REUSE. Vous pouvez trouver la " +#~ "dernière version de la spécification à l'adresse .\n" +#~ "\n" +#~ "En particulier, les critères suivants sont vérifiés :\n" +#~ "\n" +#~ "- Une mauvaise licence (non reconnue, non conforme à SPDX) se trouve-t-" +#~ "elle dans le projet ?\n" +#~ "\n" +#~ "- Des licences référencées dans le projet sont-elles absentes du " +#~ "répertoire LICENSES/ ?\n" +#~ "\n" +#~ "- Y a-t-il des licences dans le répertoire LICENSES/ qui sont inutilisées " +#~ "dans le projet ?\n" +#~ "\n" +#~ "- Tous les fichiers disposent-ils de données de droits d'auteur et de " +#~ "licence valides ?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "imprime la nomenclature du projet au format SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "imprime la nomenclature du projet au format SPDX" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "liste toutes les licences SPDX acceptées" + +#~ msgid "convert .reuse/dep5 to REUSE.toml" +#~ msgstr "convertit .reuse/dep5 en REUSE.toml" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " +#~ "suivant : {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' n'est pas un fichier" + +#~ msgid "can't open '{}'" +#~ msgstr "'{}' ne peut être ouvert" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "écriture impossible dans le répertoire '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "lecture ou écriture impossible pour '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' n'est pas une expression SPDX valide, abandon" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' n'est pas un identifiant de licence SPDX valide." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Consultez pour une liste des identifiants de " +#~ "licence SPDX valides." + +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "aucun fichier '.reuse/dep5'" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Identification de la licence SPDX" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "télécharger toutes les licences manquantes détectées dans le projet" + +#, fuzzy +#~ msgid "" +#~ "source from which to copy custom LicenseRef- licenses, either a directory " +#~ "that contains the file or the file itself" +#~ msgstr "" +#~ "source pour la copie des licences personnalisées LicenseRef-, au choix un " +#~ "dossier contenant les fichiers ou bien directement un fichier" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Erreur : {spdx_identifier} existe déjà." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Erreur : échec du téléchargement de licence." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Votre connexion internet fonctionne-t-elle ?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Téléchargement de {spdx_identifier} terminé." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output n'a pas d'effet s'il est utilisé en même temps que --all" + +#~ msgid "the following arguments are required: license" +#~ msgstr "les arguments suivants sont nécessaires : licence" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "--output ne peut pas être utilisé avec plus d'une licence" + +#~ msgid "formats output as JSON" +#~ msgstr "applique le format JSON à la sortie" + +#, fuzzy +#~ msgid "formats output as plain text (default)" +#~ msgstr "applique le format texte brut pour la sortie" + +#, fuzzy +#~ msgid "formats output as errors per line" +#~ msgstr "génère une ligne par erreur" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "compléter le champ LicenseConcluded ; notez que la réutilisation ne " +#~ "garantit pas que le champ soit correct" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "nom de la personne signataire du rapport SPDX" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "nom de l'organisation signataire du rapport SPDX" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "erreur : spécifier --creator-person=NOM ou --creator-organization=NOM est " +#~ "nécessaire quand --add-license-concluded est fourni" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "{path} ne correspond pas à un motif de fichier SPDX commun. Vérifiez les " +#~ "conventions de nommage conseillées à l'adresse https://spdx.github.io/" +#~ "spdx-spec/conformance/#44-standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "usage : " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() est indéfini" -#: /usr/lib/python3.10/argparse.py:1596 #, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "valeur de résolution de conflit invalide : %r" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "analyseur %(parser_name)r inconnu (choix : %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1614 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "chaîne d'options contradictoire : %s" -msgstr[1] "chaînes d'options contradictoires : %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argument \"-\" avec le mode %r" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "les arguments mutuellement exclusifs doivent être facultatifs" +#, python-format +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "'%(filename)s' ne peut pas être ouvert : %(error)s" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "arguments positionnels" +#, python-format +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "options" +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' est un argument invalide pour les positionnels" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "afficher ce message d'aide et quitter" +#, python-format +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "option de chaîne %(option)r invalide : doit débuter par un caractère " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "impossible de considérer des arguments de sous-analyse multiples" +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= est nécessaire pour les options comme %r" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "arguments non reconnus : %s" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "valeur de résolution de conflit invalide : %r" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "non autorisé avec l'argument %s" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "chaîne d'options contradictoire : %s" +#~ msgstr[1] "chaînes d'options contradictoires : %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "les arguments mutuellement exclusifs doivent être facultatifs" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "impossible de considérer des arguments de sous-analyse multiples" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "l'argument explicite %r est ignoré" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "arguments non reconnus : %s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "les arguments suivants sont nécessaires : %s" +#~ msgid "not allowed with argument %s" +#~ msgstr "non autorisé avec l'argument %s" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "un des arguments %s est nécessaire" +#~ msgid "ignored explicit argument %r" +#~ msgstr "l'argument explicite %r est ignoré" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "un argument est attendu" +#, python-format +#~ msgid "the following arguments are required: %s" +#~ msgstr "les arguments suivants sont nécessaires : %s" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "un argument au plus est attendu" +#, python-format +#~ msgid "one of the arguments %s is required" +#~ msgstr "un des arguments %s est nécessaire" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "un argument au moins est attendu" +#~ msgid "expected at most one argument" +#~ msgstr "un argument au plus est attendu" -#: /usr/lib/python3.10/argparse.py:2183 -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "l'argument %s est attendu" -msgstr[1] "les arguments %s sont attendus" +#~ msgid "expected at least one argument" +#~ msgstr "un argument au moins est attendu" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "option ambigüe : %(option)s ne correspond pas à %(matches)s" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "l'argument %s est attendu" +#~ msgstr[1] "les arguments %s sont attendus" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "option inattendue : %s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "option ambigüe : %(option)s ne correspond pas à %(matches)s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r ne peut être appelé" +#~ msgid "unexpected option string: %s" +#~ msgstr "option inattendue : %s" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "valeur %(type)s invalide : %(value)r" +#~ msgid "%r is not callable" +#~ msgstr "%r ne peut être appelé" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "valeur %(type)s invalide : %(value)r" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s : erreur : %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/gl.po b/po/gl.po index 562994171..b243cc45d 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for more information, and " -"for the online documentation." -msgstr "" -"reuse é unha ferramenta para o cumprimento das recomendacións REUSE. Ver " -" para máis información e para a documentación en liña." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Esta versión de reuse é compatible coa versión {} da especificación REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Apoie o traballo da FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"As doazóns son críticas para a nosa forza e autonomía. Permítennos seguir " -"traballando polo software libre onde sexa necesario. Considere facer unha " -"doazón a ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "habilitar sentencias de depuración" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "non salte os submódulos de Git" - -#: src/reuse/_main.py:99 -#, fuzzy -msgid "do not skip over Meson subprojects" -msgstr "non salte os submódulos de Git" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "non empregue multiprocesamento" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "definir a raíz do proxecto" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "mostrar o número de versión do programa e saír" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "subcomandos" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "engadir copyright e licenza na cabeceira dos arquivos" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "listar todos os arquivos que non cumplen os criterios" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Verificar que a carpeta do proxecto cumple coa versión {reuse_version} da " -"especificación REUSE. Pode atopar a última versión da especificación en " -".\n" -"\n" -"Comprobase específicamente os seguintes criterios:\n" -"\n" -"- Existen licenzas inapropiadas (non recoñecidas ou que incumplen o SPDX) no " -"proxecto?\n" -"\n" -"- Hai algunha licenza mencionada no proxecto que non está incluida na " -"carpeta LICENSES/?\n" -"\n" -"- A carpeta LICENSES/ contén licenzas non usadas no proxecto?\n" -"\n" -"- Todos os arquivos teñen información correcta de copyright e licenza?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "imprimir a lista de materiales do proxecto en formato SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "imprimir a lista de materiales do proxecto en formato SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -384,124 +67,30 @@ msgstr "" "'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " "arquivo" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' non é un arquivo" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' non é un directorio" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "non se pode abrir '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "non se pode escribir no directorio '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "non se pode ler ou escribir en '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' non é unha expresión SPDX válida, cancelando" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' non é un Identificador de Licenza SPDX válido." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Consulte unha lista de Identificadores de Licenza SPDX válidos en ." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr "Creando .reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Identificador de Licenza SPDX da licenza" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "descargar todas as licenzas detectadas mais non atopadas no proxecto" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Erro: {spdx_identifier} xa existe." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' non remata en .spdx" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Erro: Fallo descargando a licenza." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Está a funcionar a súa conexión a internet?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Descargouse correctamente o {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "requirense os seguintes argumentos: licenza" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "non se pode usar --output con máis dunha licenza" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -512,123 +101,111 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "o comentario xerado non ten liñas de copyright ou expresións de licenza" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "LICENZAS DEFECTUOSAS" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' atopado en:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "LICENZAS OBSOLETAS" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenzas son obsoletas para SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZAS SEN EXTENSIÓN DE ARQUIVO" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "As seguintes licenzas non teñen extesión de arquivo:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "LICENZAS NON ATOPADAS" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "LICENZAS SEN USO" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "As seguintes licenzas non se usan:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ERROS DE LECTURA" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Non se pode ler:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "NON SE ATOPA INFORMACIÓN DE LICENZA OU COPYRIGHT" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Os seguintes arquivos non teñen información de licenza nen de copyright:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Os seguintes arquivos non teñen información de copyright:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Os seguintes arquivos non teñen información de licenza:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Licenzas defectuosas:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Licenzas obsoletas:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licenzas sen extensión de arquivo:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Licenzas non atopadas:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Licenzas non usadas:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Licenzas usadas:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 #, fuzzy msgid "Read errors:" msgstr "Erros de lectura: {count}" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Arquivos con información de copyright: {count} / {total}" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Arquivos con información de licenza: {count} / {total}" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -636,7 +213,7 @@ msgstr "" "Congratulacións! O seu proxecto cumple coa versión {} da especificación " "REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -644,46 +221,46 @@ msgstr "" "Desgraciadamente o seu proxecto non cumple coa versión {} da especificación " "REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' non é un Identificador de Licenza SPDX válido." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenzas obsoletas:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenzas sen extensión de arquivo:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenzas non usadas:" @@ -756,17 +333,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -774,7 +351,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -783,14 +360,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -799,7 +376,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -808,14 +385,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -824,185 +401,627 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "mostrar esta mensaxe de axuda e sair" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Licenzas obsoletas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "espérase un argumento" +msgstr[1] "espérase un argumento" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "subcomandos" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Licenzas non atopadas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "uso: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() non definido" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "analizador descoñecido %(parser_name)r (alternativas: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "argumento \"-\" con modo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: erro: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "non se pode abrir '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "mostrar esta mensaxe de axuda e sair" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "non se poden misturar as accións - dous grupos teñen o nome %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' non é un argumento valido para os posicionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "argumentos posicionais" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Licenzas non atopadas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"cadea de opción non válida %(option)r: precisa comenzar cun carácter " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "requírese dest= para opcións do tipo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "valor non válido para conflict_resolution: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "cadea de opción conflictiva: %s" -msgstr[1] "cadeas de opción conflictivas: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "os argumentos mutuamente exclusivos deben ser opcionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "argumentos posicionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "mostrar esta mensaxe de axuda e sair" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' non remata en .spdx" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' non é un directorio" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, fuzzy +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "precisase a opción --copyright ou --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "no se atopa o modelo {template}" + +#~ msgid "can't write to '{}'" +#~ msgstr "non se pode escribir en '{}'" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "'{path}' non ten unha extensión de arquivo recoñecida, precisa usar --" +#~ "style ou --explicit-license" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "declaración de copyright, repetibel" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identificador SPDX, repetibel" + +#, fuzzy +#~ msgid "file contributor, repeatable" +#~ msgstr "Identificador SPDX, repetibel" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "ano da declaración de copyright, opcional" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "non pode haber múltiples argumentos para o subanalizador" +#~ msgid "comment style to use, optional" +#~ msgstr "estilo de comentario a usar, opcional" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "estilo de comentario a usar, opcional" + +#~ msgid "name of template to use, optional" +#~ msgstr "nome do modelo a usar, opcional" + +#~ msgid "do not include year in statement" +#~ msgstr "non incluir ano na declaración" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "ano da declaración de copyright, opcional" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "estilo de comentario a usar, opcional" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "estilo de comentario a usar, opcional" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "Arquivos con información de licenza: {count} / {total}" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "'{path}' é binario, logo úsase '{new_path}' para a cabeceira" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse é unha ferramenta para o cumprimento das recomendacións REUSE. Ver " +#~ " para máis información e para a documentación en liña." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Esta versión de reuse é compatible coa versión {} da especificación REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Apoie o traballo da FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "As doazóns son críticas para a nosa forza e autonomía. Permítennos seguir " +#~ "traballando polo software libre onde sexa necesario. Considere facer unha " +#~ "doazón a ." + +#~ msgid "enable debug statements" +#~ msgstr "habilitar sentencias de depuración" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "non salte os submódulos de Git" + +#, fuzzy +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "non salte os submódulos de Git" + +#~ msgid "do not use multiprocessing" +#~ msgstr "non empregue multiprocesamento" + +#~ msgid "define root of project" +#~ msgstr "definir a raíz do proxecto" + +#~ msgid "show program's version number and exit" +#~ msgstr "mostrar o número de versión do programa e saír" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "engadir copyright e licenza na cabeceira dos arquivos" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" + +#~ msgid "list all non-compliant files" +#~ msgstr "listar todos os arquivos que non cumplen os criterios" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Verificar que a carpeta do proxecto cumple coa versión {reuse_version} da " +#~ "especificación REUSE. Pode atopar a última versión da especificación en " +#~ ".\n" +#~ "\n" +#~ "Comprobase específicamente os seguintes criterios:\n" +#~ "\n" +#~ "- Existen licenzas inapropiadas (non recoñecidas ou que incumplen o SPDX) " +#~ "no proxecto?\n" +#~ "\n" +#~ "- Hai algunha licenza mencionada no proxecto que non está incluida na " +#~ "carpeta LICENSES/?\n" +#~ "\n" +#~ "- A carpeta LICENSES/ contén licenzas non usadas no proxecto?\n" +#~ "\n" +#~ "- Todos os arquivos teñen información correcta de copyright e licenza?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "imprimir a lista de materiales do proxecto en formato SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "imprimir a lista de materiales do proxecto en formato SPDX" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' non é un arquivo" + +#~ msgid "can't open '{}'" +#~ msgstr "non se pode abrir '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "non se pode escribir no directorio '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "non se pode ler ou escribir en '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' non é unha expresión SPDX válida, cancelando" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' non é un Identificador de Licenza SPDX válido." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Consulte unha lista de Identificadores de Licenza SPDX válidos en " +#~ "." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "Creando .reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Identificador de Licenza SPDX da licenza" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "" +#~ "descargar todas as licenzas detectadas mais non atopadas no proxecto" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Erro: {spdx_identifier} xa existe." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Erro: Fallo descargando a licenza." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Está a funcionar a súa conexión a internet?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Descargouse correctamente o {spdx_identifier}." + +#~ msgid "the following arguments are required: license" +#~ msgstr "requirense os seguintes argumentos: licenza" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "non se pode usar --output con máis dunha licenza" + +#~ msgid "usage: " +#~ msgstr "uso: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() non definido" + +#, python-format +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "analizador descoñecido %(parser_name)r (alternativas: %(choices)s)" + +#, python-format +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argumento \"-\" con modo %r" + +#, python-format +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "non se pode abrir '%(filename)s': %(error)s" + +#, python-format +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "non se poden misturar as accións - dous grupos teñen o nome %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' non é un argumento valido para os posicionais" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "argumentos non recoñecidos: %s" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "cadea de opción non válida %(option)r: precisa comenzar cun carácter " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "non se permite co argumento %s" +#~ msgid "dest= is required for options like %r" +#~ msgstr "requírese dest= para opcións do tipo %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "argumento explicito %r ignorado" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "valor non válido para conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "precísanse os seguintes argumentos: %s" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "cadea de opción conflictiva: %s" +#~ msgstr[1] "cadeas de opción conflictivas: %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "os argumentos mutuamente exclusivos deben ser opcionais" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "non pode haber múltiples argumentos para o subanalizador" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "precísase un dos argumentos %s" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "argumentos non recoñecidos: %s" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "espérase un argumento" +#, python-format +#~ msgid "not allowed with argument %s" +#~ msgstr "non se permite co argumento %s" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "espérase un argumento como máximo" +#, python-format +#~ msgid "ignored explicit argument %r" +#~ msgstr "argumento explicito %r ignorado" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "espérase un argumento como mínimo" +#, python-format +#~ msgid "the following arguments are required: %s" +#~ msgstr "precísanse os seguintes argumentos: %s" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "espérase %s argumento" -msgstr[1] "espéranse %s argumentos" +#~ msgid "one of the arguments %s is required" +#~ msgstr "precísase un dos argumentos %s" + +#~ msgid "expected at most one argument" +#~ msgstr "espérase un argumento como máximo" + +#~ msgid "expected at least one argument" +#~ msgstr "espérase un argumento como mínimo" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "opción ambigua: %(option)s pode encaixar con %(matches)s" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "espérase %s argumento" +#~ msgstr[1] "espéranse %s argumentos" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "opción de cadea non esperada: %s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "opción ambigua: %(option)s pode encaixar con %(matches)s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r non se pode chamar" +#~ msgid "unexpected option string: %s" +#~ msgstr "opción de cadea non esperada: %s" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "valor non válido %(type)s: %(value)r" +#~ msgid "%r is not callable" +#~ msgstr "%r non se pode chamar" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "alternativa non válida: %(value)r (elixir entre %(choices)s)" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "valor non válido %(type)s: %(value)r" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: erro: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "alternativa non válida: %(value)r (elixir entre %(choices)s)" #~ msgid "initialize REUSE project" #~ msgstr "iniciar un proxecto REUSE" diff --git a/po/it.po b/po/it.po index 470e513e4..ed2ef8bda 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for more information, and " -"for the online documentation." -msgstr "" -"reuse è uno strumento per la conformità alle raccomandazioni REUSE. Visita " -" per maggiori informazioni, e per accedere alla documentazione in linea." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Questa versione di reuse è compatibile con la versione {} della Specifica " -"REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Sostieni il lavoro della FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Le donazioni sono fondamentali per la nostra forza e la nostra autonomia. Ci " -"permettono di continuare a lavorare per il Software Libero ovunque sia " -"necessario. Prendi in considerazione di fare una donazione su ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "abilita le istruzioni di debug" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "non omettere i sottomoduli Git" - -#: src/reuse/_main.py:99 -#, fuzzy -msgid "do not skip over Meson subprojects" -msgstr "non omettere i sottomoduli Git" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "non utilizzare il multiprocessing" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "impostare la directory principale del progetto" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "mostra la versione del programma ed esce" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "sottocomandi" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" -"aggiunge le informazioni sul copyright e sulla licenza nell'intestazione dei " -"file" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "scarica una licenza e salvala nella directory LICENSES/" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "scarica una licenza e salvala nella directory LICENSES/" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "lista dei file non conformi" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Controlla che la directory del progetto sia conforme con la versione " -"{reuse_version} della Specifica REUSE. Puoi trovare l'ultima versione della " -"specifica su \n" -"\n" -"In particolare, vengono eseguiti i seguenti controlli:\n" -"\n" -"- Nel progetto c'è qualche licenza non valida (non riconosciuta, non " -"conforme con SPDX)?\n" -"\n" -"- C'è qualche licenza utilizzata all'interno del progetto, ma non inclusa " -"nella directory LICENSES/?\n" -"\n" -"- C'è qualche licenza inclusa della directory LICENSES/ ma non utilizzata " -"nel progetto?\n" -"\n" -"- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -390,124 +67,30 @@ msgstr "" "'{path}' contiene un'espressione SPDX che non può essere parsificata, il " "file viene saltato" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' non è un file" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' non è una directory" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "non è possibile aprire '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "non è possibile scrivere nella directory '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "non è possibile leggere o scrivere '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' non è una espressione valida SPDX, interruzione" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' non è un valido Identificativo di Licenza SPDX." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Consulta per la lista degli Identificativi di " -"Licenza SPDX validi." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr "Creazione di .reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Identificativo di Licenza SPDX" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "scarica tutte le licenze mancanti ma usate nel progetto" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Errore: {spdx_identifier} esiste già." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' non ha estensione .spdx" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Errore: Fallito lo scaricamento della licenza." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "La tua connessione Internet funziona?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Scaricamento completato di {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "sono richiesti i seguenti parametri: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "non puoi usare --output con più di una licenza" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -519,122 +102,110 @@ msgstr "" "nel commento generato mancano le linee sul copyright o le espressioni di " "licenza" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "LICENZE NON VALIDA" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' trovato in:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "LICENZE OBSOLETE" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Le seguenti licenze sono obsolete secondo SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZE SENZA ESTENSIONE DEL FILE" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Le seguenti licenze non hanno l'estensione del file:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "LICENZE MANCANTI" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "LICENZE NON UTILIZZATE" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Le seguenti licenze non sono utilizzate:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ERRORI DI LETTURA" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Non è possibile leggere:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANCANO LE INFORMAZIONI SU COPYRIGHT E LICENZA" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "I seguenti file non hanno informazioni sul copyright e sulla licenza:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "I seguenti file non hanno informazioni sul copyright:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "I seguenti file non hanno informazioni sulla licenza:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RAPPORTO" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Licenze non valide:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Licenze obsolete:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licenze senza estensione del file:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Licenze mancanti:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Licenze non utilizzate:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Licenze usate:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 #, fuzzy msgid "Read errors:" msgstr "Errori di lettura: {count}" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "File con informazioni sul copyright: {count} / {total}" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "File con informazioni sulla licenza: {count} / {total}" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -642,7 +213,7 @@ msgstr "" "Congratulazioni! Il tuo progetto è conforme con la versione {} della " "Specifica REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -650,46 +221,46 @@ msgstr "" "Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " "Specifica REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' non è un valido Identificativo di Licenza SPDX." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenze obsolete:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenze senza estensione del file:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenze non utilizzate:" @@ -762,17 +333,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -780,7 +351,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -789,14 +360,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -805,7 +376,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -814,14 +385,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -830,185 +401,635 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "mostra questo messaggio ed esci" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Licenze obsolete:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "richiesto un parametro" +msgstr[1] "richiesto un parametro" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "sottocomandi" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Licenze mancanti:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "uso: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() non definita" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "parsificatore sconosciuto: %(parser_name)r (alternative: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "parametro \"-\" con modo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: errore: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "non è possibile aprire '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "mostra questo messaggio ed esci" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "non è possibile unire le azioni - due gruppi hanno lo stesso nome %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' non è un parametro posizionale valido" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "parametri posizionali" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Licenze mancanti:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"nome opzione non valida %(option)r: deve iniziare con un carattere " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= è richiesto per opzioni come %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "valore per conflict_resolution non valido: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "nome opzione in conflitto: %s" -msgstr[1] "nomi opzioni in conflitto: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "i parametri mutualmente esclusivi devono essere opzionali" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "parametri posizionali" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "mostra questo messaggio ed esci" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' non ha estensione .spdx" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' non è una directory" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, fuzzy +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "è necessario specificare il parametro --copyright o --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "il modello {template} non è stato trovato" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "non è possibile avere più di un parametro con sotto-parsificatore" +#~ msgid "can't write to '{}'" +#~ msgstr "non è possibile scrivere su '{}'" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "'{path}' non ha una estensione conosciuta, usa --style o --explicit-" +#~ "license" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "dichiarazione del copyright, ripetibile" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identificativo SPDX, ripetibile" + +#, fuzzy +#~ msgid "file contributor, repeatable" +#~ msgstr "Identificativo SPDX, ripetibile" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "anno della dichiaraione del copyright, opzionale" + +#~ msgid "comment style to use, optional" +#~ msgstr "stile dei commenti da usare, opzionale" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "stile dei commenti da usare, opzionale" + +#~ msgid "name of template to use, optional" +#~ msgstr "nome del template da usare, opzionale" + +#~ msgid "do not include year in statement" +#~ msgstr "non include l'anno nella dichiarazione" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "anno della dichiaraione del copyright, opzionale" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "stile dei commenti da usare, opzionale" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "stile dei commenti da usare, opzionale" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "File con informazioni sulla licenza: {count} / {total}" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' è un file binario, occorre utilizzare '{new_path}' per " +#~ "l'intestazione" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse è uno strumento per la conformità alle raccomandazioni REUSE. " +#~ "Visita per maggiori informazioni, e per accedere alla documentazione in linea." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Questa versione di reuse è compatibile con la versione {} della Specifica " +#~ "REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Sostieni il lavoro della FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Le donazioni sono fondamentali per la nostra forza e la nostra autonomia. " +#~ "Ci permettono di continuare a lavorare per il Software Libero ovunque sia " +#~ "necessario. Prendi in considerazione di fare una donazione su ." + +#~ msgid "enable debug statements" +#~ msgstr "abilita le istruzioni di debug" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "non omettere i sottomoduli Git" + +#, fuzzy +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "non omettere i sottomoduli Git" + +#~ msgid "do not use multiprocessing" +#~ msgstr "non utilizzare il multiprocessing" + +#~ msgid "define root of project" +#~ msgstr "impostare la directory principale del progetto" + +#~ msgid "show program's version number and exit" +#~ msgstr "mostra la versione del programma ed esce" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "aggiunge le informazioni sul copyright e sulla licenza nell'intestazione " +#~ "dei file" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "scarica una licenza e salvala nella directory LICENSES/" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "scarica una licenza e salvala nella directory LICENSES/" + +#~ msgid "list all non-compliant files" +#~ msgstr "lista dei file non conformi" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Controlla che la directory del progetto sia conforme con la versione " +#~ "{reuse_version} della Specifica REUSE. Puoi trovare l'ultima versione " +#~ "della specifica su \n" +#~ "\n" +#~ "In particolare, vengono eseguiti i seguenti controlli:\n" +#~ "\n" +#~ "- Nel progetto c'è qualche licenza non valida (non riconosciuta, non " +#~ "conforme con SPDX)?\n" +#~ "\n" +#~ "- C'è qualche licenza utilizzata all'interno del progetto, ma non inclusa " +#~ "nella directory LICENSES/?\n" +#~ "\n" +#~ "- C'è qualche licenza inclusa della directory LICENSES/ ma non utilizzata " +#~ "nel progetto?\n" +#~ "\n" +#~ "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' non è un file" + +#~ msgid "can't open '{}'" +#~ msgstr "non è possibile aprire '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "non è possibile scrivere nella directory '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "non è possibile leggere o scrivere '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' non è una espressione valida SPDX, interruzione" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' non è un valido Identificativo di Licenza SPDX." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Consulta per la lista degli Identificativi " +#~ "di Licenza SPDX validi." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "Creazione di .reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Identificativo di Licenza SPDX" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "scarica tutte le licenze mancanti ma usate nel progetto" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Errore: {spdx_identifier} esiste già." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Errore: Fallito lo scaricamento della licenza." + +#~ msgid "Is your internet connection working?" +#~ msgstr "La tua connessione Internet funziona?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Scaricamento completato di {spdx_identifier}." + +#~ msgid "the following arguments are required: license" +#~ msgstr "sono richiesti i seguenti parametri: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "non puoi usare --output con più di una licenza" + +#~ msgid "usage: " +#~ msgstr "uso: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() non definita" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "parametro sconosciuto: %s" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "" +#~ "parsificatore sconosciuto: %(parser_name)r (alternative: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "non permesso con parametro %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "parametro \"-\" con modo %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "parametro esplicito ignorato %r" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "non è possibile aprire '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "i seguenti parametri sono obbligatori: %s" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "" +#~ "non è possibile unire le azioni - due gruppi hanno lo stesso nome %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' non è un parametro posizionale valido" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "uno dei parametri %s è richiesto" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "nome opzione non valida %(option)r: deve iniziare con un carattere " +#~ "%(prefix_chars)r" + +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= è richiesto per opzioni come %r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "richiesto un parametro" +#, python-format +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "valore per conflict_resolution non valido: %r" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "al massimo un parametro aspettato" +#, python-format +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "nome opzione in conflitto: %s" +#~ msgstr[1] "nomi opzioni in conflitto: %s" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "richiesto almeno un parametro" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "i parametri mutualmente esclusivi devono essere opzionali" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "non è possibile avere più di un parametro con sotto-parsificatore" + +#, python-format +#~ msgid "unrecognized arguments: %s" +#~ msgstr "parametro sconosciuto: %s" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "richiesto il parametro %s" -msgstr[1] "richiesti i parametri %s" +#~ msgid "not allowed with argument %s" +#~ msgstr "non permesso con parametro %s" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "opzione ambigua: %(option)s può essere %(matches)s" +#~ msgid "ignored explicit argument %r" +#~ msgstr "parametro esplicito ignorato %r" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "nome opzione inaspettato: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "i seguenti parametri sono obbligatori: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r non è richiamabile" +#~ msgid "one of the arguments %s is required" +#~ msgstr "uno dei parametri %s è richiesto" + +#~ msgid "expected at most one argument" +#~ msgstr "al massimo un parametro aspettato" + +#~ msgid "expected at least one argument" +#~ msgstr "richiesto almeno un parametro" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "valore %(type)s non valido: %(value)r" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "richiesto il parametro %s" +#~ msgstr[1] "richiesti i parametri %s" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "scelta non valida: %(value)r (opzioni valide: %(choices)s)" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "opzione ambigua: %(option)s può essere %(matches)s" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: errore: %(message)s\n" +#~ msgid "unexpected option string: %s" +#~ msgstr "nome opzione inaspettato: %s" + +#, python-format +#~ msgid "%r is not callable" +#~ msgstr "%r non è richiamabile" + +#, python-format +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "valore %(type)s non valido: %(value)r" + +#, python-format +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "scelta non valida: %(value)r (opzioni valide: %(choices)s)" #~ msgid "initialize REUSE project" #~ msgstr "inizializza il progetto REUSE" diff --git a/po/nl.po b/po/nl.po index baf064f71..f85668fec 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for more information, and " -"for the online documentation." -msgstr "" -"reuse is een tool voor naleving van de REUSE Initiatief aanbevelingen. Zie " -" voor meer informatie en voor de online documentatie." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Deze versie van reuse is compatibel met versie {} van de REUSE Specificatie." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Ondersteun het werk van de FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Donaties zijn belangrijk voor onze sterkte en autonomie. Ze staan ons toe om " -"verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " -"donatie te maken bij ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "zet debug statements aan" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "sla Git-submodules niet over" - -#: src/reuse/_main.py:99 -#, fuzzy -msgid "do not skip over Meson subprojects" -msgstr "sla Git-submodules niet over" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "gebruik geen multiprocessing" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "bepaal de root van het project" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "versienummer van het programma laten zien en verlaten" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "subcommando's" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" -"voeg auteursrechts- en licentie-informatie toe aan de headers van bestanden" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "download een licentie en plaats het in de LICENSES/-map" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "download een licentie en plaats het in de LICENSES/-map" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "lijst maken van alle bestanden die tekortschieten" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Voer een statische controle op de naleving van versie {reuse_version} van de " -"REUSE-specificatie uit. U kunt de laatste versie van de specificatie vinden " -"op .\n" -"\n" -"De volgende criteria worden in het bijzonder gecontroleerd:\n" -"\n" -"- Bevat het project slechte (niet-herkende, niet met SPDX in overeenstemming " -"zijnde) licenties?\n" -"\n" -"- Bevat het project gerefereerde licenties die zich niet in de LICENSES/ map " -"bevinden?\n" -"\n" -"- Bevat de map LICENSES/ licenties die binnen het project niet worden " -"gebruikt?\n" -"\n" -"- Bevatten alle bestanden geldige informatie over auteursricht en licenties?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "print de materiaallijst van het project in SPDX-formaat" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "print de materiaallijst van het project in SPDX-formaat" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -388,125 +68,30 @@ msgstr "" "'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " "bestand over" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' is geen bestand" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' is geen map" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "kan '{}' niet openen" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "kan niet schrijven naar map '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "kan '{}' niet lezen of schrijven" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' is geen geldige SPDX Licentie Identificatie." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Zie voor een lijst met geldige SPDX Licentie " -"Identificaties." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr ".reuse/dep5 aan het creëren" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "SPDX Licentie Identificatie of licentie" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "" -"download alle ontbrekende licenties die in het project zijn gedetecteerd" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Fout: {spdx_identifier} bestaat al." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' eindigt niet met .spdx" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Fout: downloaden van licentie mislukt." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Werkt uw internetverbinding?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "{spdx_identifier} met succes gedowload." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "de volgende argumenten zijn verplicht: licentie" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "kan --output niet met meer dan een licentie gebruiken" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -517,176 +102,164 @@ msgid "generated comment is missing copyright lines or license expressions" msgstr "" "gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "SLECHTE LICENTIES" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' gevonden in:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "VEROUDERDE LICENTIES" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "De volgende licenties zijn verouderd door SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENTIES ZONDER BESTANDSEXTENSIE" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "De volgende licenties hebben geen bestandsextensie:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "ONTBREKENDE LICENTIES" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "ONGEBRUIKTE LICENTIES" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "De volgende licenties zijn niet gebruikt:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "LEES FOUTEN" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Kon niet lezen:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "AUTEURSRECHT- EN LICENTIE-INFORMATIE ONTBREEKT" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "De volgende bestanden bevatten geen auteursrecht- en licentie-informatie:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "De volgende bestanden hebben geen auteursrechtinformatie:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "De volgende bestanden bevatten geen licentie-informatie:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "SAMENVATTING" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Slechte licenties:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Verouderde licenties:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licenties zonder bestandsextensie:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Ontbrekende licenties:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Ongebruikte licenties:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Gebruikte licenties:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 #, fuzzy msgid "Read errors:" msgstr "Lees fouten: {count}" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Bestanden met licentie-informatie: {count} / {total}" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Gefeliciteerd! Uw project leeft nu versie {} van de REUSE-specificatie na :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Helaas leeft uw project versie {} van de REUSE-specificatie niet na :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' is geen geldige SPDX Licentie Identificatie." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Verouderde licenties:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenties zonder bestandsextensie:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Ongebruikte licenties:" @@ -760,17 +333,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -778,7 +351,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -787,14 +360,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -803,7 +376,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -812,14 +385,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -828,186 +401,634 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "dit helpbericht laten zien en verlaten" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Verouderde licenties:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "verwachtte één argument" +msgstr[1] "verwachtte één argument" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "subcommando's" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Ontbrekende licenties:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "gebruik: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() is niet gedefinieerd" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "onbekende parser %(parser_name)r (keuzes: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "argument \"-\" met mode %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: fout: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "kan '%(filename)s' niet openen: %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "dit helpbericht laten zien en verlaten" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "kan acties niet samenvoegen - twee groepen delen de naam %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' is een ongeldig argument voor positionele argumenten" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "positionele argumenten" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Ontbrekende licenties:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"ongeldige optiestring %(option)r: moet beginnen met een karakter " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= is benodigd voor opties zoals %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "ongeldige conflictresolutiewaarde: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "tegenstrijdige optiestring: %s" -msgstr[1] "tegenstrijdige optiestrings: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "argumenten die elkaar uitsluiten moeten optioneel zijn" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "positionele argumenten" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "dit helpbericht laten zien en verlaten" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' eindigt niet met .spdx" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' is geen map" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, fuzzy +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "de optie --copyright of --license is vereist" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "sjabloon {template} kon niet worden gevonden" + +#~ msgid "can't write to '{}'" +#~ msgstr "kan niet schrijven naar '{}'" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "'{path}' heeft geen erkende bestandsextensie; gebruik alstublieft --style " +#~ "of --explicit-license" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "auteursrechtverklaring (herhaalbaar)" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "SPDX Identificatie (herhaalbaar)" + +#, fuzzy +#~ msgid "file contributor, repeatable" +#~ msgstr "SPDX Identificatie (herhaalbaar)" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "jaar van auteursrechtverklaring (optie)" + +#~ msgid "comment style to use, optional" +#~ msgstr "te gebruiken commentaarstijl (optie)" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "te gebruiken commentaarstijl (optie)" + +#~ msgid "name of template to use, optional" +#~ msgstr "naam van het te gebruiken sjabloon (optie)" + +#~ msgid "do not include year in statement" +#~ msgstr "voeg geen jaar toe aan verklaring" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "jaar van auteursrechtverklaring (optie)" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "te gebruiken commentaarstijl (optie)" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "te gebruiken commentaarstijl (optie)" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "Bestanden met licentie-informatie: {count} / {total}" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' is een binary; daarom wordt '{new_path}' gebruikt voor de header" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse is een tool voor naleving van de REUSE Initiatief aanbevelingen. " +#~ "Zie voor meer informatie en voor de online documentatie." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Deze versie van reuse is compatibel met versie {} van de REUSE " +#~ "Specificatie." -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "kan niet meerdere subparser-argumenten hebben" +#~ msgid "Support the FSFE's work:" +#~ msgstr "Ondersteun het werk van de FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Donaties zijn belangrijk voor onze sterkte en autonomie. Ze staan ons toe " +#~ "om verder te werken voor vrije software waar nodig. Overweeg alstublieft " +#~ "om een donatie te maken bij ." + +#~ msgid "enable debug statements" +#~ msgstr "zet debug statements aan" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "sla Git-submodules niet over" + +#, fuzzy +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "sla Git-submodules niet over" + +#~ msgid "do not use multiprocessing" +#~ msgstr "gebruik geen multiprocessing" + +#~ msgid "define root of project" +#~ msgstr "bepaal de root van het project" + +#~ msgid "show program's version number and exit" +#~ msgstr "versienummer van het programma laten zien en verlaten" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "voeg auteursrechts- en licentie-informatie toe aan de headers van " +#~ "bestanden" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "download een licentie en plaats het in de LICENSES/-map" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "download een licentie en plaats het in de LICENSES/-map" + +#~ msgid "list all non-compliant files" +#~ msgstr "lijst maken van alle bestanden die tekortschieten" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Voer een statische controle op de naleving van versie {reuse_version} van " +#~ "de REUSE-specificatie uit. U kunt de laatste versie van de specificatie " +#~ "vinden op .\n" +#~ "\n" +#~ "De volgende criteria worden in het bijzonder gecontroleerd:\n" +#~ "\n" +#~ "- Bevat het project slechte (niet-herkende, niet met SPDX in " +#~ "overeenstemming zijnde) licenties?\n" +#~ "\n" +#~ "- Bevat het project gerefereerde licenties die zich niet in de LICENSES/ " +#~ "map bevinden?\n" +#~ "\n" +#~ "- Bevat de map LICENSES/ licenties die binnen het project niet worden " +#~ "gebruikt?\n" +#~ "\n" +#~ "- Bevatten alle bestanden geldige informatie over auteursricht en " +#~ "licenties?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "print de materiaallijst van het project in SPDX-formaat" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "print de materiaallijst van het project in SPDX-formaat" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' is geen bestand" + +#~ msgid "can't open '{}'" +#~ msgstr "kan '{}' niet openen" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "kan niet schrijven naar map '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "kan '{}' niet lezen of schrijven" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' is geen geldige SPDX Licentie Identificatie." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Zie voor een lijst met geldige SPDX Licentie " +#~ "Identificaties." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr ".reuse/dep5 aan het creëren" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "SPDX Licentie Identificatie of licentie" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "" +#~ "download alle ontbrekende licenties die in het project zijn gedetecteerd" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Fout: {spdx_identifier} bestaat al." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Fout: downloaden van licentie mislukt." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Werkt uw internetverbinding?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "{spdx_identifier} met succes gedowload." + +#~ msgid "the following arguments are required: license" +#~ msgstr "de volgende argumenten zijn verplicht: licentie" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "kan --output niet met meer dan een licentie gebruiken" + +#~ msgid "usage: " +#~ msgstr "gebruik: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() is niet gedefinieerd" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "niet erkende argumenten: %s" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "onbekende parser %(parser_name)r (keuzes: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "niet toegestaan met argument %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argument \"-\" met mode %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "expliciet argument %r genegeerd" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "kan '%(filename)s' niet openen: %(error)s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "de volgende argumenten zijn verplicht: %s" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "kan acties niet samenvoegen - twee groepen delen de naam %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' is een ongeldig argument voor positionele argumenten" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "één van de argumenten %s is benodigd" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "ongeldige optiestring %(option)r: moet beginnen met een karakter " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "verwachtte één argument" +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= is benodigd voor opties zoals %r" + +#, python-format +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "ongeldige conflictresolutiewaarde: %r" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "verwachtte maximaal één argument" +#, python-format +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "tegenstrijdige optiestring: %s" +#~ msgstr[1] "tegenstrijdige optiestrings: %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "argumenten die elkaar uitsluiten moeten optioneel zijn" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "verwachtte minimaal één argument" +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "kan niet meerdere subparser-argumenten hebben" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "verwachtte %s argument" -msgstr[1] "verwachtte %s argumenten" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "niet erkende argumenten: %s" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" -"dubbelzinnige optie: %(option)s zou ook gelijk kunnen zijn aan %(matches)s" +#~ msgid "not allowed with argument %s" +#~ msgstr "niet toegestaan met argument %s" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "onverwachtte optiestring: %s" +#~ msgid "ignored explicit argument %r" +#~ msgstr "expliciet argument %r genegeerd" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r is niet callable" +#~ msgid "the following arguments are required: %s" +#~ msgstr "de volgende argumenten zijn verplicht: %s" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "ongeldige %(type)s waarde: %(value)r" +#~ msgid "one of the arguments %s is required" +#~ msgstr "één van de argumenten %s is benodigd" + +#~ msgid "expected at most one argument" +#~ msgstr "verwachtte maximaal één argument" + +#~ msgid "expected at least one argument" +#~ msgstr "verwachtte minimaal één argument" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "verwachtte %s argument" +#~ msgstr[1] "verwachtte %s argumenten" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: fout: %(message)s\n" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "" +#~ "dubbelzinnige optie: %(option)s zou ook gelijk kunnen zijn aan %(matches)s" + +#, python-format +#~ msgid "unexpected option string: %s" +#~ msgstr "onverwachtte optiestring: %s" + +#, python-format +#~ msgid "%r is not callable" +#~ msgstr "%r is niet callable" + +#, python-format +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "ongeldige %(type)s waarde: %(value)r" + +#, python-format +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/pt.po b/po/pt.po index bf8fb7c70..d35819a9e 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese 1;\n" "X-Generator: Weblate 4.18.1\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erro: Não foi possível criar um comentário para '{path}'" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -62,323 +49,17 @@ msgstr "" "está correcto. Não foi escrito nenhum novo cabeçalho." #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "O cabeçalho de {path} foi alterado com êxito" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "" - -#: src/reuse/_annotate.py:231 -#, fuzzy -msgid "option --contributor, --copyright or --license is required" -msgstr "é requerida uma das opções --copyright ou --license" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "o modelo {template} não foi encontrado" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "não é possível escrever em '{}'" - -#: src/reuse/_annotate.py:366 -#, fuzzy -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" -"'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" -"explicit-license" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "declaração de direitos de autor (repetível)" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "Identificador SPDX (repetível)" - -#: src/reuse/_annotate.py:395 -#, fuzzy -msgid "file contributor, repeatable" -msgstr "Identificador SPDX (repetível)" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "ano da declaração de direitos de autor (opcional)" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "estilo de comentário a usar (opcional)" - -#: src/reuse/_annotate.py:417 -#, fuzzy -msgid "copyright prefix to use, optional" -msgstr "estilo de comentário a usar (opcional)" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "nome do modelo a usar (opcional)" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "não incluir o ano na declaração" - -#: src/reuse/_annotate.py:440 -#, fuzzy -msgid "merge copyright lines if copyright statements are identical" -msgstr "ano da declaração de direitos de autor (opcional)" - -#: src/reuse/_annotate.py:446 -#, fuzzy -msgid "force single-line comment style, optional" -msgstr "estilo de comentário a usar (opcional)" - -#: src/reuse/_annotate.py:451 -#, fuzzy -msgid "force multi-line comment style, optional" -msgstr "estilo de comentário a usar (opcional)" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "" - -#: src/reuse/_annotate.py:480 -msgid "write a .license file to files with unrecognised comment styles" -msgstr "" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "" - -#: src/reuse/_annotate.py:497 -#, fuzzy -msgid "skip files that already contain REUSE information" -msgstr "Ficheiros com informação de licenciamento: {count} / {total}" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - -#: src/reuse/_lint_file.py:31 -msgid "formats output as errors per line (default)" -msgstr "" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" -"O reuse é uma ferramenta para observância das recomendações REUSE. Ver " -" para mais informação e para documentação em linha." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Esta versão do reuse é compatível com a versão {} da especificação REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Apoiar o trabalho da FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Os donativos são cruciais para a nossa força e autonomia. Permitem-nos " -"continuar a trabalhar em prol do Sotware Livre sempre que necessário. " -"Considere fazer um donativo em ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "activar expressões de depuração" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "não ignorar sub-módulos do Git" - -#: src/reuse/_main.py:99 -#, fuzzy -msgid "do not skip over Meson subprojects" -msgstr "não ignorar sub-módulos do Git" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "não usar multi-processamento" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "definir a raíz do projecto" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "mostrar o número de versão do programa e sair" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "sub-comandos" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "listar todos os ficheiros não conformes" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Analisar (lint) a pasta do projecto para verificar a conformidade com a " -"versão {reuse_version} da especificação REUSE. A última versão da " -"especificação encontra-se em .\n" -"\n" -"Em concreto, são verificados os seguintes critérios:\n" -"\n" -"- Há no projecto licenças irregulares (não reconhecidas ou não conformes com " -"o SPDX)?\n" -"\n" -"- Há alguma licença mencionada no projecto que não esteja incluída na pasta " -"LICENSES/?\n" -"\n" -"- Há alguma licença incluída na pasta LICENSES/ que não seja usada no " -"projecto?\n" -"\n" -"- Todos os ficheiros têm informação válida de direitos de autor e de " -"licenciamento?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "imprimir a lista de materiais do projecto em formato SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "imprimir a lista de materiais do projecto em formato SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -386,124 +67,30 @@ msgstr "" "'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " "ficheiro ignorado" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' não é um ficheiro" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' não é uma pasta" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "não é possível abrir '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "não é possível escrever no directório '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "não é possível ler ou escrever em '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' não é uma expressão SPDX válida; a abortar" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' não é um Identificador de Licença SPDX válido." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Consultar uma lista de Identificadores de Licença SPDX válidos em ." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr "A criar .reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Identificador de Licença SPDX da licença" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "descarregar todas as licenças detectadas como em falta no projecto" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Erro: {spdx_identifier} já existe." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' não termina em .spdx" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Erro: Falha ao descarregar a licença." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "A ligação à Internet está a funcionar?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "{spdx_identifier} transferido com êxito." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "são requeridos os seguintes argumentos: licença" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "não se pode usar --output com mais do que uma licença" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -515,131 +102,119 @@ msgstr "" "o comentário gerado não tem linhas de direitos de autor ou expressões de " "licenciamento" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "LICENÇAS IRREGULARES" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' encontrado em:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "LICENÇAS DESCONTINUADAS" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "As seguintes licenças não têm extensão de ficheiro:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "LICENÇAS EM FALTA" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "LICENÇAS NÃO USADAS" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "As seguintes licenças não estão a ser usadas:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ERROS DE LEITURA" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Não foi possível ler:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Os seguintes ficheiros não contêm informação de direitos de autor nem de " "licenciamento:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Os seguintes ficheiros não contêm informação de direitos de autor:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Licenças irregulares:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Licenças descontinuadas:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Licenças sem extensão de ficheiro:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Licenças em falta:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Licenças não usadas:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Licenças usadas:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 #, fuzzy msgid "Read errors:" msgstr "Erros de leitura: {count}" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Ficheiros com informação de licenciamento: {count} / {total}" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Parabéns! O projecto está conforme com a versão {} da especificação REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -647,46 +222,46 @@ msgstr "" "Infelizmente, o projecto não está conforme com a versão {} da especificação " "REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' não é um Identificador de Licença SPDX válido." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Licenças descontinuadas:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Licenças sem extensão de ficheiro:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Licenças não usadas:" @@ -758,17 +333,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -776,7 +351,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -785,14 +360,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -801,7 +376,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -810,14 +385,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -826,185 +401,629 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "mostrar esta mensagem de ajuda e sair" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Licenças descontinuadas:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "é esperado um argumento" +msgstr[1] "é esperado um argumento" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "sub-comandos" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Licenças em falta:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "uso: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() não definido" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "analisador desconhecido %(parser_name)r (alternativas: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "argumento \"-\" com modo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: erro: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "não é possível abrir '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "mostrar esta mensagem de ajuda e sair" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "não é possível combinar as acções - há dois grupos com o nome %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' não é um argumento válido para posicionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "argumentos posicionais" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Licenças em falta:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"linha de opções %(option)r inválida: tem que começar com um carácter " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "é requerido dest= para opções do tipo %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "valor de conflict_resolution inválido: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "linha de opções conflituante: %s" -msgstr[1] "linhas de opções conflituantes: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "argumentos mutuamente exclusivos têm que ser opcionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "argumentos posicionais" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "mostrar esta mensagem de ajuda e sair" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' não termina em .spdx" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' não é uma pasta" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, fuzzy +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "é requerida uma das opções --copyright ou --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "o modelo {template} não foi encontrado" + +#~ msgid "can't write to '{}'" +#~ msgstr "não é possível escrever em '{}'" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" +#~ "explicit-license" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "declaração de direitos de autor (repetível)" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Identificador SPDX (repetível)" + +#, fuzzy +#~ msgid "file contributor, repeatable" +#~ msgstr "Identificador SPDX (repetível)" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "ano da declaração de direitos de autor (opcional)" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "não pode haver argumentos múltiplos de sub-análise (subparser)" +#~ msgid "comment style to use, optional" +#~ msgstr "estilo de comentário a usar (opcional)" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "estilo de comentário a usar (opcional)" + +#~ msgid "name of template to use, optional" +#~ msgstr "nome do modelo a usar (opcional)" + +#~ msgid "do not include year in statement" +#~ msgstr "não incluir o ano na declaração" + +#, fuzzy +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "ano da declaração de direitos de autor (opcional)" + +#, fuzzy +#~ msgid "force single-line comment style, optional" +#~ msgstr "estilo de comentário a usar (opcional)" + +#, fuzzy +#~ msgid "force multi-line comment style, optional" +#~ msgstr "estilo de comentário a usar (opcional)" + +#, fuzzy +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "Ficheiros com informação de licenciamento: {count} / {total}" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "O reuse é uma ferramenta para observância das recomendações REUSE. Ver " +#~ " para mais informação e para documentação em linha." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Esta versão do reuse é compatível com a versão {} da especificação REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Apoiar o trabalho da FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Os donativos são cruciais para a nossa força e autonomia. Permitem-nos " +#~ "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " +#~ "Considere fazer um donativo em ." + +#~ msgid "enable debug statements" +#~ msgstr "activar expressões de depuração" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "não ignorar sub-módulos do Git" + +#, fuzzy +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "não ignorar sub-módulos do Git" + +#~ msgid "do not use multiprocessing" +#~ msgstr "não usar multi-processamento" + +#~ msgid "define root of project" +#~ msgstr "definir a raíz do projecto" + +#~ msgid "show program's version number and exit" +#~ msgstr "mostrar o número de versão do programa e sair" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" + +#~ msgid "list all non-compliant files" +#~ msgstr "listar todos os ficheiros não conformes" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Analisar (lint) a pasta do projecto para verificar a conformidade com a " +#~ "versão {reuse_version} da especificação REUSE. A última versão da " +#~ "especificação encontra-se em .\n" +#~ "\n" +#~ "Em concreto, são verificados os seguintes critérios:\n" +#~ "\n" +#~ "- Há no projecto licenças irregulares (não reconhecidas ou não conformes " +#~ "com o SPDX)?\n" +#~ "\n" +#~ "- Há alguma licença mencionada no projecto que não esteja incluída na " +#~ "pasta LICENSES/?\n" +#~ "\n" +#~ "- Há alguma licença incluída na pasta LICENSES/ que não seja usada no " +#~ "projecto?\n" +#~ "\n" +#~ "- Todos os ficheiros têm informação válida de direitos de autor e de " +#~ "licenciamento?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "imprimir a lista de materiais do projecto em formato SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "imprimir a lista de materiais do projecto em formato SPDX" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' não é um ficheiro" + +#~ msgid "can't open '{}'" +#~ msgstr "não é possível abrir '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "não é possível escrever no directório '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "não é possível ler ou escrever em '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' não é uma expressão SPDX válida; a abortar" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' não é um Identificador de Licença SPDX válido." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Consultar uma lista de Identificadores de Licença SPDX válidos em " +#~ "." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "A criar .reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Identificador de Licença SPDX da licença" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "descarregar todas as licenças detectadas como em falta no projecto" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Erro: {spdx_identifier} já existe." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Erro: Falha ao descarregar a licença." + +#~ msgid "Is your internet connection working?" +#~ msgstr "A ligação à Internet está a funcionar?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "{spdx_identifier} transferido com êxito." + +#~ msgid "the following arguments are required: license" +#~ msgstr "são requeridos os seguintes argumentos: licença" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "não se pode usar --output com mais do que uma licença" + +#~ msgid "usage: " +#~ msgstr "uso: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() não definido" + +#, python-format +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "analisador desconhecido %(parser_name)r (alternativas: %(choices)s)" + +#, python-format +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "argumento \"-\" com modo %r" + +#, python-format +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "não é possível abrir '%(filename)s': %(error)s" + +#, python-format +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "não é possível combinar as acções - há dois grupos com o nome %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' não é um argumento válido para posicionais" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "argumentos não reconhecidos: %s" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "linha de opções %(option)r inválida: tem que começar com um carácter " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "não permitido com o argumento %s" +#~ msgid "dest= is required for options like %r" +#~ msgstr "é requerido dest= para opções do tipo %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "argumento explícito %r ignorado" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "valor de conflict_resolution inválido: %r" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "são requeridos os seguintes argumentos: %s" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "linha de opções conflituante: %s" +#~ msgstr[1] "linhas de opções conflituantes: %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "argumentos mutuamente exclusivos têm que ser opcionais" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "não pode haver argumentos múltiplos de sub-análise (subparser)" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "é requerido um dos argumentos %s" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "argumentos não reconhecidos: %s" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "é esperado um argumento" +#, python-format +#~ msgid "not allowed with argument %s" +#~ msgstr "não permitido com o argumento %s" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "é esperado um argumento, no máximo" +#, python-format +#~ msgid "ignored explicit argument %r" +#~ msgstr "argumento explícito %r ignorado" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "é esperado um argumento, no mínimo" +#, python-format +#~ msgid "the following arguments are required: %s" +#~ msgstr "são requeridos os seguintes argumentos: %s" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "é esperado %s argumento" -msgstr[1] "são esperados %s argumentos" +#~ msgid "one of the arguments %s is required" +#~ msgstr "é requerido um dos argumentos %s" + +#~ msgid "expected at most one argument" +#~ msgstr "é esperado um argumento, no máximo" + +#~ msgid "expected at least one argument" +#~ msgstr "é esperado um argumento, no mínimo" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "opção ambígua: %(option)s pode ser igual a %(matches)s" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "é esperado %s argumento" +#~ msgstr[1] "são esperados %s argumentos" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "linha de opções não esperada: %s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "opção ambígua: %(option)s pode ser igual a %(matches)s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r não é invocável" +#~ msgid "unexpected option string: %s" +#~ msgstr "linha de opções não esperada: %s" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "valor %(type)s inválido: %(value)r" +#~ msgid "%r is not callable" +#~ msgstr "%r não é invocável" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "alternativa inválida: %(value)r (escolher de %(choices)s)" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "valor %(type)s inválido: %(value)r" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: erro: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "alternativa inválida: %(value)r (escolher de %(choices)s)" #~ msgid "initialize REUSE project" #~ msgstr "iniciar um projecto REUSE" diff --git a/po/reuse.pot b/po/reuse.pot index 6a9be1c81..4aa0a0566 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,10 +17,10 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -"#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,40 +30,27 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -72,406 +59,46 @@ msgid "" msgstr "" #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "" - -#: src/reuse/_annotate.py:231 -msgid "option --contributor, --copyright or --license is required" -msgstr "" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "" - -#: src/reuse/_annotate.py:366 -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "" - -#: src/reuse/_annotate.py:395 -msgid "file contributor, repeatable" -msgstr "" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "" - -#: src/reuse/_annotate.py:417 -msgid "copyright prefix to use, optional" -msgstr "" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "" - -#: src/reuse/_annotate.py:440 -msgid "merge copyright lines if copyright statements are identical" -msgstr "" - -#: src/reuse/_annotate.py:446 -msgid "force single-line comment style, optional" -msgstr "" - -#: src/reuse/_annotate.py:451 -msgid "force multi-line comment style, optional" -msgstr "" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "" - -#: src/reuse/_annotate.py:480 -msgid "write a .license file to files with unrecognised comment styles" -msgstr "" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "" - -#: src/reuse/_annotate.py:497 -msgid "skip files that already contain REUSE information" -msgstr "" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "" - -#: src/reuse/_lint_file.py:31 -msgid "formats output as errors per line (default)" -msgstr "" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "" - -#: src/reuse/_main.py:166 -#, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "" - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "" - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "" - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "" - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -481,170 +108,158 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 msgid "Files with copyright information:" msgstr "" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 msgid "Files with license information:" msgstr "" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, python-brace-format msgid "{path}: no license identifier\n" msgstr "" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "" @@ -711,17 +326,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -729,7 +344,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -738,14 +353,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -754,7 +369,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -763,14 +378,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -779,180 +394,282 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +msgid "Show this message and exit." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "(Deprecated) {text}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +msgid "Commands" msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +msgid "Missing command." msgstr "" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" msgstr "" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" msgstr "" -#: /usr/lib/python3.10/argparse.py:1614 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" +msgid "%(prog)s, version %(version)s" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +msgid "Show the version and exit." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +msgid "Missing argument" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +msgid "Missing option" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." msgstr "" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." msgstr "" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 -#, python-format -msgid "unrecognized arguments: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." msgstr "" -#: /usr/lib/python3.10/argparse.py:1948 -#, python-format -msgid "not allowed with argument %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" msgstr "" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 -#, python-format -msgid "ignored explicit argument %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." msgstr "" -#: /usr/lib/python3.10/argparse.py:2119 -#, python-format -msgid "the following arguments are required: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2134 -#, python-format -msgid "one of the arguments %s is required" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." msgstr "" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" msgstr "" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." msgstr "" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format +msgid "" +"Choose from:\n" +"\t{choices}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2183 -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:2241 -#, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." msgstr "" -#: /usr/lib/python3.10/argparse.py:2305 -#, python-format -msgid "unexpected option string: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." msgstr "" -#: /usr/lib/python3.10/argparse.py:2502 -#, python-format -msgid "%r is not callable" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." msgstr "" -#: /usr/lib/python3.10/argparse.py:2519 -#, python-format -msgid "invalid %(type)s value: %(value)r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." msgstr "" -#: /usr/lib/python3.10/argparse.py:2530 -#, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" msgstr "" -#: /usr/lib/python3.10/argparse.py:2606 -#, python-format -msgid "%(prog)s: error: %(message)s\n" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +msgid "{name} {filename!r} does not exist." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" diff --git a/po/ru.po b/po/ru.po index a3aee112b..0dbc01dad 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.7.1-dev\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" -"'{path}' не поддерживает однострочные комментарии, пожалуйста, не " -"используйте --single-line" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "" -"'{path}' не поддерживает многострочные комментарии, пожалуйста, не " -"используйте --multi-line" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "Пропущен нераспознанный файл '{path}'" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "'{path}' не распознан; создаем '{path}. лицензия'" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Пропущенный файл '{path}' уже содержит информацию о REUSE" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Ошибка: Не удалось создать комментарий для '{path}'" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -69,333 +52,17 @@ msgstr "" "удалось написать новый заголовок." #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Успешно изменен заголовок {path}" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "" -"--skip-unrecognised не имеет эффекта, если используется вместе с --style" - -#: src/reuse/_annotate.py:231 -msgid "option --contributor, --copyright or --license is required" -msgstr "Требуется опция --создатель, - авторское право или --лицензия" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "Шаблон {template} не найден" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "Невозможно записать в '{}'" - -#: src/reuse/_annotate.py:366 -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" -"Следующие файлы не имеют распознанного расширения. Пожалуйста, используйте --" -"style, --force-dot-license, --fallback-dot-license или --skip-unrecognised:" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "заявление об авторских правах, повторяемое" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "Идентификатор SPDX, повторяемый" - -#: src/reuse/_annotate.py:395 -msgid "file contributor, repeatable" -msgstr "вкладчик файлов, повторяемость" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "год утверждения авторского права, необязательно" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "стиль комментария, который следует использовать, необязательно" - -#: src/reuse/_annotate.py:417 -msgid "copyright prefix to use, optional" -msgstr "используемый префикс авторского права, необязательно" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "имя шаблона, который будет использоваться, необязательно" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "не указывайте год в отчете" - -#: src/reuse/_annotate.py:440 -msgid "merge copyright lines if copyright statements are identical" -msgstr "" -"объединить строки с авторскими правами, если заявления об авторских правах " -"идентичны" - -#: src/reuse/_annotate.py:446 -msgid "force single-line comment style, optional" -msgstr "стиль однострочных комментариев, необязательно" - -#: src/reuse/_annotate.py:451 -msgid "force multi-line comment style, optional" -msgstr "установить стиль многострочного комментария, необязательно" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "всегда записывайте файл .license вместо заголовка внутри файла" - -#: src/reuse/_annotate.py:480 -msgid "write a .license file to files with unrecognised comment styles" -msgstr "" -"записывать файл .license в файлы с нераспознанными стилями комментариев" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "пропускать файлы с нераспознанными стилями комментариев" - -#: src/reuse/_annotate.py:497 -msgid "skip files that already contain REUSE information" -msgstr "пропускать файлы, которые уже содержат информацию о REUSE" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "" -"'{path}' - двоичный файл, поэтому для заголовка используется '{new_path}'" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "предотвращает выход" - -#: src/reuse/_lint_file.py:31 -#, fuzzy -msgid "formats output as errors per line (default)" -msgstr "Форматирует вывод в виде ошибок на строку" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" -"reuse - это инструмент для соблюдения рекомендаций REUSE. Дополнительную " -"информацию см. на сайте , а онлайн-документацию - " -"на сайте ." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Эта версия повторного использования совместима с версией {} спецификации " -"REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Поддержите работу ФСПО:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Пожертвования имеют решающее значение для нашей силы и самостоятельности. " -"Они позволяют нам продолжать работать во имя свободного программного " -"обеспечения везде, где это необходимо. Пожалуйста, рассмотрите возможность " -"сделать пожертвование по адресу ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "включить отладочные операторы" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "скрыть предупреждения об устаревании" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "не пропускайте подмодули Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "не пропускайте мезонные подпроекты" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "не используйте многопроцессорную обработку" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "определить корень проекта" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "показать номер версии программы и выйти" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "подкоманды" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" -"добавьте в заголовок файлов информацию об авторских правах и лицензировании" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" -"Добавление авторских прав и лицензий в заголовок одного или нескольких " -"файлов.\n" -"\n" -"Используя команды --copyright и --license, вы можете указать, какие " -"авторские права и лицензии следует добавить в заголовки заданных файлов.\n" -"\n" -"Используя команду --contributor, вы можете указать людей или организации, " -"которые внесли свой вклад, но не являются владельцами авторских прав на " -"данные файлы." - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "список всех файлов, не соответствующих требованиям" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Проверьте каталог проекта на соответствие версии {reuse_version} " -"спецификации REUSE. Последнюю версию спецификации можно найти по адресу " -".\n" -"\n" -"В частности, проверяются следующие критерии:\n" -"\n" -"- Есть ли в проекте плохие (нераспознанные, не совместимые с SPDX) " -"лицензии?\n" -"\n" -"- Есть ли лицензии, на которые ссылаются внутри проекта, но которые не " -"включены в каталог LICENSES/?\n" -"\n" -"- Включены ли в каталог LICENSES/ какие-либо лицензии, которые не " -"используются в проекте?\n" -"\n" -"- Все ли файлы содержат достоверную информацию об авторских правах и " -"лицензировании?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "распечатать ведомость материалов проекта в формате SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "распечатать ведомость материалов проекта в формате SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "список всех поддерживаемых лицензий SPDX" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "Преобразование .reuse/dep5 в REUSE.toml" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{path}' не может быть разобран. Мы получили следующее сообщение об ошибке: " -"{message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не удалось разобрать '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" @@ -403,102 +70,7 @@ msgstr "" "'{path}' содержит выражение SPDX, которое не может быть разобрано, что " "приводит к пропуску файла" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' не является файлом" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' не является каталогом" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "Невозможно открыть '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "Невозможно записать в каталог '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "Невозможно прочитать или записать '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' не является правильным выражением SPDX, прерывается" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' не является действительным идентификатором лицензии SPDX." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Вы имели в виду:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Список допустимых идентификаторов лицензий SPDX см. в ." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "Нет файла '.reuse/dep5'" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Лицензия SPDX Идентификатор лицензии" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" -"источник, из которого копируются пользовательские лицензии LicenseRef-, либо " -"каталог, содержащий файл, либо сам файл" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Ошибка: {spdx_identifier} уже существует." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Ошибка: {path} не существует." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Ошибка: Не удалось загрузить лицензию." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Работает ли ваше интернет-соединение?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Успешно загружен {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output не имеет эффекта, если используется вместе с --all" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "необходимы следующие аргументы: лицензия" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "Невозможно использовать --output с более чем одной лицензией" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." @@ -506,7 +78,7 @@ msgstr "" "{attr_name} должно быть {type_name} (получено {value}, которое является " "{value_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -515,18 +87,18 @@ msgstr "" "Элемент в коллекции {attr_name} должен быть {type_name} (получил " "{item_value}, который является {item_class})." -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не должно быть пустым." -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" "{name} должно быть {type} (получено {value}, которое является {value_type})." -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -540,173 +112,160 @@ msgstr "" "В сгенерированном комментарии отсутствуют строки об авторских правах или " "выражениях лицензии" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "форматирует вывод в формате JSON" - -#: src/reuse/lint.py:39 -#, fuzzy -msgid "formats output as plain text (default)" -msgstr "Форматирует вывод в виде обычного текста" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "Форматирует вывод в виде ошибок на строку" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "ПЛОХАЯ ЛИЦЕНЗИЯ" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' найдено в:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "УСТАРЕВШИЕ ЛИЦЕНЗИИ" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Следующие лицензии устарели в SPDX:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "ЛИЦЕНЗИИ БЕЗ РАСШИРЕНИЯ ФАЙЛА" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Следующие лицензии не имеют расширения файла:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "ОТСУТСТВУЮЩИЕ ЛИЦЕНЗИИ" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "НЕИСПОЛЬЗОВАННЫЕ ЛИЦЕНЗИИ" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Следующие лицензии не используются:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ОШИБКИ ЧТЕНИЯ" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Не удалось прочитать:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "ОТСУТСТВИЕ ИНФОРМАЦИИ ОБ АВТОРСКИХ ПРАВАХ И ЛИЦЕНЗИРОВАНИИ" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" "Следующие файлы не содержат информации об авторских правах и лицензировании:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Следующие файлы не содержат информации об авторских правах:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Следующие файлы не содержат информации о лицензировании:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "РЕЗЮМЕ" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Плохие лицензии:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Утраченные лицензии:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Лицензии без расширения файла:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Отсутствующие лицензии:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Неиспользованные лицензии:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Используемые лицензии:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Читайте ошибки:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 msgid "Files with copyright information:" msgstr "Файлы с информацией об авторских правах:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 msgid "Files with license information:" msgstr "Файлы с информацией о лицензии:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Поздравляем! Ваш проект соответствует версии {} спецификации REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "К сожалению, ваш проект не соответствует версии {} спецификации REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "РЕКОМЕНДАЦИИ" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "{path}: отсутствует лицензия {lic}\n" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "{path}: ошибка чтения\n" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, python-brace-format msgid "{path}: no license identifier\n" msgstr "{path}: нет идентификатора лицензии\n" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "{path}: нет уведомления об авторских правах\n" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: плохая лицензия {lic}\n" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: устаревшая лицензия\n" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: лицензия без расширения файла\n" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: неиспользуемая лицензия\n" @@ -787,17 +346,17 @@ msgstr "" "Проект '{}' не является репозиторием VCS или в нем не установлено " "необходимое программное обеспечение VCS" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не удалось прочитать '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "При разборе '{path}' произошла непредвиденная ошибка" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -811,7 +370,7 @@ msgstr "" "задаваемые вопросы о пользовательских лицензиях: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -824,7 +383,7 @@ msgstr "" "reuse/dep5', была устаревшей в SPDX. Текущий список и рекомендуемые новые " "идентификаторы можно найти здесь: " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -834,7 +393,7 @@ msgstr "" "лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. Пожалуйста, " "переименуйте файл(ы) соответствующим образом." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -850,7 +409,7 @@ msgstr "" "лицензий (начинающихся с 'LicenseRef-') вам нужно добавить эти файлы " "самостоятельно." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -865,7 +424,7 @@ msgstr "" "неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " "фрагмент кода не лицензируется как таковой." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -876,7 +435,7 @@ msgstr "" "Затронутые файлы вы найдете в верхней части вывода в виде сообщений об " "ошибках." -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -891,208 +450,780 @@ msgstr "" "учебнике описаны дополнительные способы решения этой задачи: " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -"заполните поле LicenseConcluded; обратите внимание, что повторное " -"использование не может гарантировать точность поля" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "имя лица, подписавшего отчет SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "название организации, подписавшей отчет SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "покажите это справочное сообщение и выйдите" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Утраченные лицензии:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +#, fuzzy +msgid "Options" +msgstr "варианты" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "ожидается один аргумент" +msgstr[1] "ожидается один аргумент" +msgstr[2] "ожидается один аргумент" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "подкоманды" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Отсутствующие лицензии:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -"ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= ИМЯ, " -"если указано --добавить- лицензию- заключенную" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -"'{path}' не соответствует распространенному шаблону файлов SPDX. " -"Предлагаемые соглашения об именовании можно найти здесь: https://spdx.github." -"io/spdx-spec/conformance/#44-standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "использование: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() не определено" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" msgstr "" -"неизвестный синтаксический анализатор %(parser_name)r (варианты: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "аргумент \"-\" с режимом %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: ошибка: %(message)s\n" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "Невозможно открыть '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "покажите это справочное сообщение и выйдите" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "Невозможно объединить действия - две группы названы %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'\"Обязательный\" - недопустимый аргумент для позиционирования" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "позиционные аргументы" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Отсутствующие лицензии:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Вы имели в виду:" +msgstr[1] "Вы имели в виду:" +msgstr[2] "Вы имели в виду:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +"Choose from:\n" +"\t{choices}" msgstr "" -"Недопустимая строка опций %(option)r: должна начинаться с символа " -"%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" -msgstr "dest= требуется для опций типа %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "Недопустимое значение конфликтного_разрешения: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: /usr/lib/python3.10/argparse.py:1614 -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Ошибка: {path} не существует." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' не является каталогом" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" -"одна,двадцать одна,тридцать одна,сорок одна,пятьдесят одна,шестьдесят одна," -"семьдесят одна,восемдесят одна,девяносто одна, сто одна противоречащая " -"строка опций: %s" msgstr[1] "" -"две,три,четыре,двадцать две,двадцать три,двадцать четыре,тридцать две," -"тридцать три,тридцать четыре,сорок две конфликтующих строк опций: %s" msgstr[2] "" -"ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать,тринадцать " -"конфликтующих строк опций: %s" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "взаимоисключающие аргументы должны быть необязательными" +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' не поддерживает однострочные комментарии, пожалуйста, не " +#~ "используйте --single-line" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "позиционные аргументы" +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' не поддерживает многострочные комментарии, пожалуйста, не " +#~ "используйте --multi-line" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "варианты" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised не имеет эффекта, если используется вместе с --style" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "покажите это справочное сообщение и выйдите" +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "Требуется опция --создатель, - авторское право или --лицензия" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "Шаблон {template} не найден" + +#~ msgid "can't write to '{}'" +#~ msgstr "Невозможно записать в '{}'" + +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Следующие файлы не имеют распознанного расширения. Пожалуйста, " +#~ "используйте --style, --force-dot-license, --fallback-dot-license или --" +#~ "skip-unrecognised:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "заявление об авторских правах, повторяемое" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Идентификатор SPDX, повторяемый" + +#~ msgid "file contributor, repeatable" +#~ msgstr "вкладчик файлов, повторяемость" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "год утверждения авторского права, необязательно" + +#~ msgid "comment style to use, optional" +#~ msgstr "стиль комментария, который следует использовать, необязательно" + +#~ msgid "copyright prefix to use, optional" +#~ msgstr "используемый префикс авторского права, необязательно" + +#~ msgid "name of template to use, optional" +#~ msgstr "имя шаблона, который будет использоваться, необязательно" + +#~ msgid "do not include year in statement" +#~ msgstr "не указывайте год в отчете" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "объединить строки с авторскими правами, если заявления об авторских " +#~ "правах идентичны" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "стиль однострочных комментариев, необязательно" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "установить стиль многострочного комментария, необязательно" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" + +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "всегда записывайте файл .license вместо заголовка внутри файла" + +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "" +#~ "записывать файл .license в файлы с нераспознанными стилями комментариев" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "пропускать файлы с нераспознанными стилями комментариев" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "пропускать файлы, которые уже содержат информацию о REUSE" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' - двоичный файл, поэтому для заголовка используется '{new_path}'" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "не может иметь несколько аргументов подпарсера" +#~ msgid "prevents output" +#~ msgstr "предотвращает выход" + +#, fuzzy +#~ msgid "formats output as errors per line (default)" +#~ msgstr "Форматирует вывод в виде ошибок на строку" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse - это инструмент для соблюдения рекомендаций REUSE. Дополнительную " +#~ "информацию см. на сайте , а онлайн-документацию " +#~ "- на сайте ." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Эта версия повторного использования совместима с версией {} спецификации " +#~ "REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Поддержите работу ФСПО:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Пожертвования имеют решающее значение для нашей силы и самостоятельности. " +#~ "Они позволяют нам продолжать работать во имя свободного программного " +#~ "обеспечения везде, где это необходимо. Пожалуйста, рассмотрите " +#~ "возможность сделать пожертвование по адресу ." + +#~ msgid "enable debug statements" +#~ msgstr "включить отладочные операторы" + +#~ msgid "hide deprecation warnings" +#~ msgstr "скрыть предупреждения об устаревании" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "не пропускайте подмодули Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "не пропускайте мезонные подпроекты" + +#~ msgid "do not use multiprocessing" +#~ msgstr "не используйте многопроцессорную обработку" + +#~ msgid "define root of project" +#~ msgstr "определить корень проекта" + +#~ msgid "show program's version number and exit" +#~ msgstr "показать номер версии программы и выйти" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "" +#~ "добавьте в заголовок файлов информацию об авторских правах и " +#~ "лицензировании" + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files." +#~ msgstr "" +#~ "Добавление авторских прав и лицензий в заголовок одного или нескольких " +#~ "файлов.\n" +#~ "\n" +#~ "Используя команды --copyright и --license, вы можете указать, какие " +#~ "авторские права и лицензии следует добавить в заголовки заданных файлов.\n" +#~ "\n" +#~ "Используя команду --contributor, вы можете указать людей или организации, " +#~ "которые внесли свой вклад, но не являются владельцами авторских прав на " +#~ "данные файлы." + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" + +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." + +#~ msgid "list all non-compliant files" +#~ msgstr "список всех файлов, не соответствующих требованиям" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Проверьте каталог проекта на соответствие версии {reuse_version} " +#~ "спецификации REUSE. Последнюю версию спецификации можно найти по адресу " +#~ ".\n" +#~ "\n" +#~ "В частности, проверяются следующие критерии:\n" +#~ "\n" +#~ "- Есть ли в проекте плохие (нераспознанные, не совместимые с SPDX) " +#~ "лицензии?\n" +#~ "\n" +#~ "- Есть ли лицензии, на которые ссылаются внутри проекта, но которые не " +#~ "включены в каталог LICENSES/?\n" +#~ "\n" +#~ "- Включены ли в каталог LICENSES/ какие-либо лицензии, которые не " +#~ "используются в проекте?\n" +#~ "\n" +#~ "- Все ли файлы содержат достоверную информацию об авторских правах и " +#~ "лицензировании?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "распечатать ведомость материалов проекта в формате SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "распечатать ведомость материалов проекта в формате SPDX" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "список всех поддерживаемых лицензий SPDX" + +#~ msgid "convert .reuse/dep5 to REUSE.toml" +#~ msgstr "Преобразование .reuse/dep5 в REUSE.toml" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{path}' не может быть разобран. Мы получили следующее сообщение об " +#~ "ошибке: {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' не является файлом" + +#~ msgid "can't open '{}'" +#~ msgstr "Невозможно открыть '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "Невозможно записать в каталог '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "Невозможно прочитать или записать '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' не является правильным выражением SPDX, прерывается" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' не является действительным идентификатором лицензии SPDX." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Список допустимых идентификаторов лицензий SPDX см. в ." + +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "Нет файла '.reuse/dep5'" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Лицензия SPDX Идентификатор лицензии" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" + +#~ msgid "" +#~ "source from which to copy custom LicenseRef- licenses, either a directory " +#~ "that contains the file or the file itself" +#~ msgstr "" +#~ "источник, из которого копируются пользовательские лицензии LicenseRef-, " +#~ "либо каталог, содержащий файл, либо сам файл" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Ошибка: {spdx_identifier} уже существует." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Ошибка: Не удалось загрузить лицензию." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Работает ли ваше интернет-соединение?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Успешно загружен {spdx_identifier}." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output не имеет эффекта, если используется вместе с --all" + +#~ msgid "the following arguments are required: license" +#~ msgstr "необходимы следующие аргументы: лицензия" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "Невозможно использовать --output с более чем одной лицензией" + +#~ msgid "formats output as JSON" +#~ msgstr "форматирует вывод в формате JSON" + +#, fuzzy +#~ msgid "formats output as plain text (default)" +#~ msgstr "Форматирует вывод в виде обычного текста" + +#~ msgid "formats output as errors per line" +#~ msgstr "Форматирует вывод в виде ошибок на строку" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "заполните поле LicenseConcluded; обратите внимание, что повторное " +#~ "использование не может гарантировать точность поля" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "имя лица, подписавшего отчет SPDX" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "название организации, подписавшей отчет SPDX" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= " +#~ "ИМЯ, если указано --добавить- лицензию- заключенную" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "'{path}' не соответствует распространенному шаблону файлов SPDX. " +#~ "Предлагаемые соглашения об именовании можно найти здесь: https://spdx." +#~ "github.io/spdx-spec/conformance/#44-standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "использование: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() не определено" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "нераспознанные аргументы: %s" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "" +#~ "неизвестный синтаксический анализатор %(parser_name)r (варианты: " +#~ "%(choices)s)" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "не разрешено с аргументом %s" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "аргумент \"-\" с режимом %r" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "проигнорирован явный аргумент %r" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "Невозможно открыть '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "требуются следующие аргументы: %s" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "Невозможно объединить действия - две группы названы %r" + +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'\"Обязательный\" - недопустимый аргумент для позиционирования" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "требуется один из аргументов %s" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "Недопустимая строка опций %(option)r: должна начинаться с символа " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "ожидается один аргумент" +#, python-format +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= требуется для опций типа %r" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "ожидается не более одного аргумента" +#, python-format +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "Недопустимое значение конфликтного_разрешения: %r" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "ожидал по крайней мере один аргумент" +#, python-format +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "" +#~ "одна,двадцать одна,тридцать одна,сорок одна,пятьдесят одна,шестьдесят " +#~ "одна,семьдесят одна,восемдесят одна,девяносто одна, сто одна " +#~ "противоречащая строка опций: %s" +#~ msgstr[1] "" +#~ "две,три,четыре,двадцать две,двадцать три,двадцать четыре,тридцать две," +#~ "тридцать три,тридцать четыре,сорок две конфликтующих строк опций: %s" +#~ msgstr[2] "" +#~ "ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать," +#~ "тринадцать конфликтующих строк опций: %s" + +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "взаимоисключающие аргументы должны быть необязательными" + +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "не может иметь несколько аргументов подпарсера" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "" -"один,двадцать один,тридцать один,сорок один,пятьдесят один,шестьдесят один," -"семдесят один,восемдесят один,девяносто один,сто один ожидаемый аргумент %s" -msgstr[1] "" -"два,три,четыре,двадцать два,двадцать три,двадцать четыре,тридцать два," -"тридцать три,тридцать четыре,сорок два ожидаемых %s аргументов" -msgstr[2] "" -"ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать,тринадцать " -"ожидаемых %s аргументов" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "нераспознанные аргументы: %s" + +#, python-format +#~ msgid "not allowed with argument %s" +#~ msgstr "не разрешено с аргументом %s" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "Неоднозначная опция: %(option)s может соответствовать %(matches)s" +#~ msgid "ignored explicit argument %r" +#~ msgstr "проигнорирован явный аргумент %r" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "Неожиданная строка опции: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "требуются следующие аргументы: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r не является вызываемым" +#~ msgid "one of the arguments %s is required" +#~ msgstr "требуется один из аргументов %s" + +#~ msgid "expected at most one argument" +#~ msgstr "ожидается не более одного аргумента" + +#~ msgid "expected at least one argument" +#~ msgstr "ожидал по крайней мере один аргумент" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "Недопустимое значение %(type)s: %(value)r" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "" +#~ "один,двадцать один,тридцать один,сорок один,пятьдесят один,шестьдесят " +#~ "один,семдесят один,восемдесят один,девяносто один,сто один ожидаемый " +#~ "аргумент %s" +#~ msgstr[1] "" +#~ "два,три,четыре,двадцать два,двадцать три,двадцать четыре,тридцать два," +#~ "тридцать три,тридцать четыре,сорок два ожидаемых %s аргументов" +#~ msgstr[2] "" +#~ "ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать," +#~ "тринадцать ожидаемых %s аргументов" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "Неверный выбор: %(value)r (выберите из %(choices)s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "Неоднозначная опция: %(option)s может соответствовать %(matches)s" -#: /usr/lib/python3.10/argparse.py:2606 #, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: ошибка: %(message)s\n" +#~ msgid "unexpected option string: %s" +#~ msgstr "Неожиданная строка опции: %s" + +#, python-format +#~ msgid "%r is not callable" +#~ msgstr "%r не является вызываемым" + +#, python-format +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "Недопустимое значение %(type)s: %(value)r" + +#, python-format +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "Неверный выбор: %(value)r (выберите из %(choices)s" #, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/sv.po b/po/sv.po index 0d7cd8cdc..e4c214751 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-09-19 13:40+0000\n" "Last-Translator: Simon \n" "Language-Team: Swedish for more information, and " -"for the online documentation." -msgstr "" -"reuse är ett verktyg för att följa REUSE-rekommendationerna. Se för mer information och för " -"den web-baserade dokumentationen." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "" -"Den här versionen av reuse är kompatibel med version {} av REUSE-" -"specifikationen." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Stötta FSFE's arbete:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Donationer är avgörande för vår styrka och självständighet. De gör det " -"möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. Vänligen " -"överväg att göra en donation till ." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "hoppa inte över undermoduler för Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "hoppa inte över underprojekt för Meson" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "definiera roten av projektet" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "visa programmets versionsnummer och avsluta" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "hämta en licens och placera den i mappen LICENSES/" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "hämta en licens och placera den i mappen LICENSES/" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "lista alla filer som inte uppfyller kraven" - -#: src/reuse/_main.py:166 -#, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "lista alla SPDX-licenser som stöds" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, fuzzy, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kunde inte tolka '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' är inte en fil" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' är inte en katalog" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "kan inte öppna '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "kan inte skriva till katalogen '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "kan inte läsa eller skriva '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' är inte ett giltigt SPDX-uttryck, avbryter" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "" - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Menade du:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Se för en lista över giltiga SPDX-" -"licensidentifierare." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "ladda ner alla saknade licenser som upptäckts i projektet" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Fel: {spdx_identifier} existerar redan." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Fel: {path} existerar inte." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Fel: Hämtningen av licensen misslyckades." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Fungerar din internet-anslutning?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Hämtningen av {spdx_identifier} lyckades." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "följande argument behövs: licens" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "kan inte använda --output med mer än en licens" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -483,170 +97,158 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 msgid "Files with copyright information:" msgstr "" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 msgid "Files with license information:" msgstr "" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, python-brace-format msgid "{path}: no license identifier\n" msgstr "" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "" @@ -713,17 +315,17 @@ msgid "" "installed" msgstr "" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -731,7 +333,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -740,14 +342,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -756,7 +358,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -765,14 +367,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -781,184 +383,407 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +msgid "Show this message and exit." msgstr "" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 #, python-brace-format -msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +msgid "(Deprecated) {text}" msgstr "" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" msgstr "" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." msgstr "" -#: /usr/lib/python3.10/argparse.py:1223 -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +msgid "Commands" msgstr "" -#: /usr/lib/python3.10/argparse.py:1283 -#, python-format -msgid "argument \"-\" with mode %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +msgid "Missing command." msgstr "" -#: /usr/lib/python3.10/argparse.py:1292 -#, python-format -msgid "can't open '%(filename)s': %(error)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." msgstr "" -#: /usr/lib/python3.10/argparse.py:1501 -#, python-format -msgid "cannot merge actions - two groups are named %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." msgstr "" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1561 -#, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" msgstr "" -#: /usr/lib/python3.10/argparse.py:1579 -#, python-format -msgid "dest= is required for options like %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1596 -#, python-format -msgid "invalid conflict_resolution value: %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" msgstr "" -#: /usr/lib/python3.10/argparse.py:1614 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgid "%(prog)s, version %(version)s" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "visa programmets versionsnummer och avsluta" -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." msgstr "" -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +msgid "Missing argument" msgstr "" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 -#, python-format -msgid "unrecognized arguments: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +msgid "Missing option" msgstr "" -#: /usr/lib/python3.10/argparse.py:1948 -#, python-format -msgid "not allowed with argument %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" msgstr "" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 -#, python-format -msgid "ignored explicit argument %r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2119 -#, python-format -msgid "the following arguments are required: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2134 -#, python-format -msgid "one of the arguments %s is required" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Menade du:" +msgstr[1] "Menade du:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" msgstr "" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." msgstr "" -#: /usr/lib/python3.10/argparse.py:2183 -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.10/argparse.py:2241 -#, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." msgstr "" -#: /usr/lib/python3.10/argparse.py:2305 -#, python-format -msgid "unexpected option string: %s" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." msgstr "" -#: /usr/lib/python3.10/argparse.py:2502 -#, python-format -msgid "%r is not callable" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" msgstr "" -#: /usr/lib/python3.10/argparse.py:2519 -#, python-format -msgid "invalid %(type)s value: %(value)r" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." msgstr "" -#: /usr/lib/python3.10/argparse.py:2530 -#, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" msgstr "" -#: /usr/lib/python3.10/argparse.py:2606 -#, python-format -msgid "%(prog)s: error: %(message)s\n" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 +#, python-brace-format +msgid "" +"Choose from:\n" +"\t{choices}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" msgstr "" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Fel: {path} existerar inte." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' är inte en katalog" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' stöjder inte kommentarer på en rad, använd inte --single-line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' stöjder inte kommentarer på flera rader, använd inte --multi-line" + +#~ msgid "can't write to '{}'" +#~ msgstr "kan inte skriva till '{}'" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse är ett verktyg för att följa REUSE-rekommendationerna. Se för mer information och " +#~ "för den web-baserade dokumentationen." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "" +#~ "Den här versionen av reuse är kompatibel med version {} av REUSE-" +#~ "specifikationen." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Stötta FSFE's arbete:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Donationer är avgörande för vår styrka och självständighet. De gör det " +#~ "möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. " +#~ "Vänligen överväg att göra en donation till ." + +#~ msgid "do not skip over Git submodules" +#~ msgstr "hoppa inte över undermoduler för Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "hoppa inte över underprojekt för Meson" + +#~ msgid "define root of project" +#~ msgstr "definiera roten av projektet" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "hämta en licens och placera den i mappen LICENSES/" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "hämta en licens och placera den i mappen LICENSES/" + +#~ msgid "list all non-compliant files" +#~ msgstr "lista alla filer som inte uppfyller kraven" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "lista alla SPDX-licenser som stöds" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' är inte en fil" + +#~ msgid "can't open '{}'" +#~ msgstr "kan inte öppna '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "kan inte skriva till katalogen '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "kan inte läsa eller skriva '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' är inte ett giltigt SPDX-uttryck, avbryter" + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Se för en lista över giltiga SPDX-" +#~ "licensidentifierare." + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "ladda ner alla saknade licenser som upptäckts i projektet" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Fel: {spdx_identifier} existerar redan." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Fel: Hämtningen av licensen misslyckades." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Fungerar din internet-anslutning?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Hämtningen av {spdx_identifier} lyckades." + +#~ msgid "the following arguments are required: license" +#~ msgstr "följande argument behövs: licens" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "kan inte använda --output med mer än en licens" + #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." #~ msgstr "'{dep5}' kunde inte avkodas som UTF-8." diff --git a/po/tr.po b/po/tr.po index 6e951d365..c09f7564d 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for more information, and " -"for the online documentation." -msgstr "" -"reuse, REUSE önerileriyle uyum için bir araçtır. Daha fazla bilgi için " -" sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "FSFE'nin çalışmalarını destekleyin:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Gücümüz ve özerkliğimiz için bağışlar oldukça önemli. Gereken her yerde " -"Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "hata ayıklama cümlelerini etkinleştirir" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "kullanımdan kaldırma uyarılarını gizle" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "Git alt modüllerini atlamaz" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "Meson alt projelerini atlamaz" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "çoklu işlem kullanmaz" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "projenin kökünü tanımlar" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "programın sürüm numarasını gösterip çıkar" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "alt komutlar" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" - -#: src/reuse/_main.py:154 -#, fuzzy -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "bütün uyumsuz dosyaları listeler" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Proje dizinini REUSE Belirtimi {reuse_version} sürümüyle uyumu için inceler. " -"Belirtimin son sürümüne adresinden " -"erişebilirsiniz.\n" -"\n" -"Özellikle aşağıdaki ölçütler denetleniyor:\n" -"\n" -"- Projede herhangi bir kötü (tanımlanamayan, SPDX ile uyumsuz) lisans var " -"mı?\n" -"\n" -"- Projede belirtilen ama LICENSES/ dizininde yer almayan lisans var mı?\n" -"\n" -"- LICENSES/ dizininde yer alan ama projede kullanılmayan lisanslar var mı?\n" -"\n" -"- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "tüm desteklenen SPDK lisanslarını listeler" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "'{path}' çözümlenemeyen bir SPDX ifadesine sahip, dosya atlanıyor" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' bir dosya değil" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' bir dizin değil" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "'{}' açılamıyor" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "'{}' dizinine yazılamıyor" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "'{}' okunamıyor veya yazılamıyor" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Şunu mu kastettiniz:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Geçerli SPDX Lisans Kimlikleri listesi için " -"adresine bakın." - -#: src/reuse/convert_dep5.py:118 -#, fuzzy -msgid "no '.reuse/dep5' file" -msgstr ".reuse/dep5 oluşturuluyor" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Lisansın SPDX Lisans Kimliği" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "projede tespit edilen bütün eksik lisansları indir" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Hata: {spdx_identifier} halihazırda mevcut." - -#: src/reuse/download.py:163 -#, fuzzy, python-brace-format -msgid "Error: {path} does not exist." -msgstr "'{path}' .spdx ile bitmiyor" - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Hata: lisans indirme başarısız oldu." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "İnternet bağlantınız çalışıyor mu?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "{spdx_identifier} başarılı bir şekilde indirildi." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--all ile birlikte kullanıldığında --output'un bir etkisi yok" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "şu değişkenler gerekiyor: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "--output birden fazla lisansla birlikte kullanılamıyor" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " "is a {item_class})." msgstr "" -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -508,174 +97,160 @@ msgstr "" msgid "generated comment is missing copyright lines or license expressions" msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "çıktıyı JSON olarak biçimlendirir" - -#: src/reuse/lint.py:39 -#, fuzzy -msgid "formats output as plain text (default)" -msgstr "çıktıyı düz metin olarak biçimlendirir" - -#: src/reuse/lint.py:45 -#, fuzzy -msgid "formats output as errors per line" -msgstr "çıktıyı düz metin olarak biçimlendirir" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "KÖTÜ LİSANSLAR" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' şurada mevcut:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "MODASI GEÇMİŞ LİSANSLAR" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "Şu lisanslar artık SPDX tarafından kullanılmıyor:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "DOSYA UZANTISI OLMAYAN LİSANSLAR" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Şu lisansların dosya uzantısı yok:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "EKSİK LİSANSLAR" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "KULLANILMAYAN LİSANSLAR" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Şu lisanslar kullanılmıyor:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "OKUMA HATALARI" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Okunamıyor:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "EKSİK TELİF HAKKI VE LİSANS BİLGİSİ" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "Şu dosyalarda telif hakkı ve lisans bilgisi yok:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Şu dosyalarda telif hakkı bilgisi yok:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Şu dosyalarda lisans bilgisi yok:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "ÖZET" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Kötü lisanslar:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Modası geçmiş lisanslar:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Dosya uzantısı olmayan lisanslar:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Eksik lisanslar:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Kullanılmayan lisanslar:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Kullanılan lisanslar:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Okuma hataları:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 #, fuzzy msgid "Files with copyright information:" msgstr "Telif hakkı içeren dosyalar:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 #, fuzzy msgid "Files with license information:" msgstr "Lisans bilgisi içeren dosyalar:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Tebrikler! Projeniz REUSE Belirtiminin {} sürümüyle uyumlu :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "Maalesef, projeniz REUSE Belirtiminin {} sürümüyle uyumlu değil :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, fuzzy, python-brace-format msgid "{path}: no license identifier\n" msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, fuzzy, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "Modası geçmiş lisanslar:" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, fuzzy, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "Dosya uzantısı olmayan lisanslar:" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, fuzzy, python-brace-format msgid "{lic_path}: unused license\n" msgstr "Kullanılmayan lisanslar:" @@ -748,17 +323,17 @@ msgid "" "installed" msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -766,7 +341,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -775,14 +350,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -791,7 +366,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -800,14 +375,14 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -816,190 +391,713 @@ msgid "" "software/tutorial/>" msgstr "" -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -"LicenseConcluded sahasını doldur; lütfen reuse bu sahanın doğru olduğunu " -"güvence edemeyeceğini dikkate alın" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "SPDX raporunu imzalayan kişinin ismi" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "SPDX raporunu imzalayan kuruluşun ismi" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "bu yardım mesajını gösterip çık" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Modası geçmiş lisanslar:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +msgid "Options" msgstr "" -"hata: --add-license-concluded verildiğinde --creator-person=İSİM veya --" -"creator-organization=İSİM gereklidir" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "bir değişken bekleniyor" +msgstr[1] "bir değişken bekleniyor" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "alt komutlar" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Eksik lisanslar:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: hata: %(message)s\n" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "bu yardım mesajını gösterip çık" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "konumsal değişkenler" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Eksik lisanslar:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Şunu mu kastettiniz:" +msgstr[1] "Şunu mu kastettiniz:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +"Choose from:\n" +"\t{choices}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" msgstr "" -"'{path}' yaygın SPDX dosya deseniyle eşleşmiyor. Önerilen adlandırma " -"kurallarına şuradan bakabilirsiniz: https://spdx.github.io/spdx-spec/" -"conformance/#44-standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "kullanım: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "'{path}' .spdx ile bitmiyor" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' bir dizin değil" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' tek satırlık yorumları desteklemiyor, lütfen --single-line " +#~ "kullanmayın" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' çok satırlı yorumları desteklemiyor, lütfen --multi-line " +#~ "kullanmayın" + +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--skip-unrecognised, --style ile kullanıldığında etkisizdir" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "--contributor, --copyright veya --license seçenekleri gereklidir" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "{template} şablonu bulunamıyor" + +#~ msgid "can't write to '{}'" +#~ msgstr "'{}' yazılamıyor" + +#, fuzzy +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Aşağıdaki dosya bilinen bir dosya uzantısına sahip değil. Lütfen --style, " +#~ "--force-dot-license veya --skip-unrecognised kullanın:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "telif hakkı ifadesi, tekrarlanabilir" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "SPDX Kimliği, tekrarlanabilir" + +#~ msgid "file contributor, repeatable" +#~ msgstr "dosyaya katkı veren, tekrarlanabilir" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "telif hakkı ifadesi, isteğe bağlı" + +#~ msgid "comment style to use, optional" +#~ msgstr "kullanılacak yorum biçimi, isteğe bağlı" + +#, fuzzy +#~ msgid "copyright prefix to use, optional" +#~ msgstr "kullanılacak telif hakkı biçimi, isteğe bağlı" + +#~ msgid "name of template to use, optional" +#~ msgstr "kullanılacak şablon ismi, isteğe bağlı" + +#~ msgid "do not include year in statement" +#~ msgstr "ifadede yıl içerme" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "eğer telif hakkı ifadeleri aynıysa telif hakkı satırlarını birleştir" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "tek satırlı yorum biçimi kullan, isteğe bağlı" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "çok satırlı yorum biçimi kullan, isteğe bağlı" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "" +#~ "başlıkları belirlenen dizinlerin altındaki tüm dosyalara yinelemeli " +#~ "olarak ekle" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "dosyadaki ilk başlığı değiştirme; sadece yeni bir tane ekle" + +#, fuzzy +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "dosyanın başlığına yazmak yerine bir .license yazar" + +#, fuzzy +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "tanımlanamayan yorum biçimleri içeren dosyaları atla" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "tanımlanamayan yorum biçimleri içeren dosyaları atla" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "halihazırda REUSE bilgisi içeren dosyaları atla" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' ikili bir dosya, bu nedenle başlık için '{new_path}' kullanılacak" + +#~ msgid "prevents output" +#~ msgstr "çıktıyı önler" + +#, fuzzy +#~ msgid "formats output as errors per line (default)" +#~ msgstr "çıktıyı düz metin olarak biçimlendirir" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse, REUSE önerileriyle uyum için bir araçtır. Daha fazla bilgi için " +#~ " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "FSFE'nin çalışmalarını destekleyin:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Gücümüz ve özerkliğimiz için bağışlar oldukça önemli. Gereken her yerde " +#~ "Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." + +#~ msgid "enable debug statements" +#~ msgstr "hata ayıklama cümlelerini etkinleştirir" + +#~ msgid "hide deprecation warnings" +#~ msgstr "kullanımdan kaldırma uyarılarını gizle" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "Git alt modüllerini atlamaz" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "Meson alt projelerini atlamaz" + +#~ msgid "do not use multiprocessing" +#~ msgstr "çoklu işlem kullanmaz" + +#~ msgid "define root of project" +#~ msgstr "projenin kökünü tanımlar" + +#~ msgid "show program's version number and exit" +#~ msgstr "programın sürüm numarasını gösterip çıkar" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" + +#, fuzzy +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" + +#~ msgid "list all non-compliant files" +#~ msgstr "bütün uyumsuz dosyaları listeler" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Proje dizinini REUSE Belirtimi {reuse_version} sürümüyle uyumu için " +#~ "inceler. Belirtimin son sürümüne " +#~ "adresinden erişebilirsiniz.\n" +#~ "\n" +#~ "Özellikle aşağıdaki ölçütler denetleniyor:\n" +#~ "\n" +#~ "- Projede herhangi bir kötü (tanımlanamayan, SPDX ile uyumsuz) lisans var " +#~ "mı?\n" +#~ "\n" +#~ "- Projede belirtilen ama LICENSES/ dizininde yer almayan lisans var mı?\n" +#~ "\n" +#~ "- LICENSES/ dizininde yer alan ama projede kullanılmayan lisanslar var " +#~ "mı?\n" +#~ "\n" +#~ "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "tüm desteklenen SPDK lisanslarını listeler" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' bir dosya değil" -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() tanımlı değil" +#~ msgid "can't open '{}'" +#~ msgstr "'{}' açılamıyor" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "'{}' dizinine yazılamıyor" + +#~ msgid "can't read or write '{}'" +#~ msgstr "'{}' okunamıyor veya yazılamıyor" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Geçerli SPDX Lisans Kimlikleri listesi için " +#~ "adresine bakın." + +#, fuzzy +#~ msgid "no '.reuse/dep5' file" +#~ msgstr ".reuse/dep5 oluşturuluyor" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Lisansın SPDX Lisans Kimliği" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "projede tespit edilen bütün eksik lisansları indir" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Hata: {spdx_identifier} halihazırda mevcut." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Hata: lisans indirme başarısız oldu." + +#~ msgid "Is your internet connection working?" +#~ msgstr "İnternet bağlantınız çalışıyor mu?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "{spdx_identifier} başarılı bir şekilde indirildi." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--all ile birlikte kullanıldığında --output'un bir etkisi yok" + +#~ msgid "the following arguments are required: license" +#~ msgstr "şu değişkenler gerekiyor: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "--output birden fazla lisansla birlikte kullanılamıyor" + +#~ msgid "formats output as JSON" +#~ msgstr "çıktıyı JSON olarak biçimlendirir" + +#, fuzzy +#~ msgid "formats output as plain text (default)" +#~ msgstr "çıktıyı düz metin olarak biçimlendirir" + +#, fuzzy +#~ msgid "formats output as errors per line" +#~ msgstr "çıktıyı düz metin olarak biçimlendirir" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "LicenseConcluded sahasını doldur; lütfen reuse bu sahanın doğru olduğunu " +#~ "güvence edemeyeceğini dikkate alın" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "SPDX raporunu imzalayan kişinin ismi" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "SPDX raporunu imzalayan kuruluşun ismi" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "hata: --add-license-concluded verildiğinde --creator-person=İSİM veya --" +#~ "creator-organization=İSİM gereklidir" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "'{path}' yaygın SPDX dosya deseniyle eşleşmiyor. Önerilen adlandırma " +#~ "kurallarına şuradan bakabilirsiniz: https://spdx.github.io/spdx-spec/" +#~ "conformance/#44-standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "kullanım: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() tanımlı değil" -#: /usr/lib/python3.10/argparse.py:1223 #, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "bilinmeyen ayrıştıcı %(parser_name)r (choices: %(choices)s)" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "bilinmeyen ayrıştıcı %(parser_name)r (choices: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1283 #, python-format -msgid "argument \"-\" with mode %r" -msgstr "%r kipine sahip \"-\" argümanı" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "%r kipine sahip \"-\" argümanı" -#: /usr/lib/python3.10/argparse.py:1292 #, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "'%(filename)s' açılamıyor: %(error)s" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "'%(filename)s' açılamıyor: %(error)s" -#: /usr/lib/python3.10/argparse.py:1501 #, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "eylemler birleştirilemiyor - iki grup %r olarak adlandırılmış" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "eylemler birleştirilemiyor - iki grup %r olarak adlandırılmış" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' konumsal parametre için hatalı bir değişkendir" +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' konumsal parametre için hatalı bir değişkendir" -#: /usr/lib/python3.10/argparse.py:1561 #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "hatalı %(option)r seçeneği: %(prefix_chars)r karakteriye başlamalı" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "hatalı %(option)r seçeneği: %(prefix_chars)r karakteriye başlamalı" -#: /usr/lib/python3.10/argparse.py:1579 #, python-format -msgid "dest= is required for options like %r" -msgstr "%r gibi seçenekler için dest= gerekli" +#~ msgid "dest= is required for options like %r" +#~ msgstr "%r gibi seçenekler için dest= gerekli" -#: /usr/lib/python3.10/argparse.py:1596 #, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "hatalı conflict_resolution değeri: %r" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "hatalı conflict_resolution değeri: %r" -#: /usr/lib/python3.10/argparse.py:1614 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "çelişkili seçenek karakter dizisi: %s" -msgstr[1] "çelişkili seçenek karakter dizisi: %s" - -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "ayrık seçenekler isteğe bağlı olmalı" - -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "konumsal değişkenler" - -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "çelişkili seçenek karakter dizisi: %s" +#~ msgstr[1] "çelişkili seçenek karakter dizisi: %s" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "bu yardım mesajını gösterip çık" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "ayrık seçenekler isteğe bağlı olmalı" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "birden fazla altayrıştırıcı değişkeni içeremez" +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "birden fazla altayrıştırıcı değişkeni içeremez" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "tanımlanamayan değişkenler: %s" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "tanımlanamayan değişkenler: %s" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "%s değişkeniyle izin yok" +#~ msgid "not allowed with argument %s" +#~ msgstr "%s değişkeniyle izin yok" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "açık %r değişkeni yok sayıldı" +#~ msgid "ignored explicit argument %r" +#~ msgstr "açık %r değişkeni yok sayıldı" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "şu değişkenler gereklidir: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "şu değişkenler gereklidir: %s" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "%s değişkenlerinden biri gereklidir" - -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "bir değişken bekleniyor" +#~ msgid "one of the arguments %s is required" +#~ msgstr "%s değişkenlerinden biri gereklidir" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "en fazla bir değişken bekleniyor" +#~ msgid "expected at most one argument" +#~ msgstr "en fazla bir değişken bekleniyor" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "en azından bir değişken bekleniyor" +#~ msgid "expected at least one argument" +#~ msgstr "en azından bir değişken bekleniyor" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "%s değişkeni bekleniyor" -msgstr[1] "%s değişkenleri bekleniyor" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "%s değişkeni bekleniyor" +#~ msgstr[1] "%s değişkenleri bekleniyor" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "belirsiz seçenek: %(option)s, %(matches)s ile eşleşebilir" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "belirsiz seçenek: %(option)s, %(matches)s ile eşleşebilir" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "beklenmedik seçenek karakter dizisi: %s" +#~ msgid "unexpected option string: %s" +#~ msgstr "beklenmedik seçenek karakter dizisi: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r çağrılabilir değil" +#~ msgid "%r is not callable" +#~ msgstr "%r çağrılabilir değil" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "hatalı %(type)s değeri: %(value)r" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "hatalı %(type)s değeri: %(value)r" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "hatalı tercih: %(value)r (%(choices)s seçilmelidir)" - -#: /usr/lib/python3.10/argparse.py:2606 -#, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: hata: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "hatalı tercih: %(value)r (%(choices)s seçilmelidir)" #, fuzzy, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." diff --git a/po/uk.po b/po/uk.po index ae0340865..58212f46b 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-30 13:59+0000\n" +"POT-Creation-Date: 2024-10-10 16:26+0000\n" "PO-Revision-Date: 2024-09-11 19:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/_annotate.py:74 -#, python-brace-format -msgid "" -"'{path}' does not support single-line comments, please do not use --single-" -"line" -msgstr "" -"'{path}' не підтримує однорядкові коментарі, не використовуйте --single-line" - -#: src/reuse/_annotate.py:81 -#, python-brace-format -msgid "" -"'{path}' does not support multi-line comments, please do not use --multi-line" -msgstr "" -"'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-line" - -#: src/reuse/_annotate.py:136 +#: src/reuse/_annotate.py:95 #, python-brace-format msgid "Skipped unrecognised file '{path}'" msgstr "Пропущено нерозпізнаний файл '{path}'" -#: src/reuse/_annotate.py:142 +#: src/reuse/_annotate.py:101 #, python-brace-format msgid "'{path}' is not recognised; creating '{path}.license'" msgstr "'{path}' не розпізнано; створення '{path}.license'" -#: src/reuse/_annotate.py:158 +#: src/reuse/_annotate.py:117 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" -#: src/reuse/_annotate.py:192 +#: src/reuse/_annotate.py:151 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Помилка: не вдалося створити коментар для '{path}'" -#: src/reuse/_annotate.py:199 +#: src/reuse/_annotate.py:158 #, python-brace-format msgid "" "Error: Generated comment header for '{path}' is missing copyright lines or " @@ -68,433 +53,31 @@ msgstr "" "записано новий заголовок." #. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:210 +#: src/reuse/_annotate.py:169 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Успішно змінено заголовок {path}" -#: src/reuse/_annotate.py:221 -msgid "--skip-unrecognised has no effect when used together with --style" -msgstr "--skip-unrecognised не працює разом із --style" - -#: src/reuse/_annotate.py:231 -msgid "option --contributor, --copyright or --license is required" -msgstr "потрібен параметр --contributor, --copyright або --license" - -#: src/reuse/_annotate.py:272 -#, python-brace-format -msgid "template {template} could not be found" -msgstr "не вдалося знайти шаблон {template}" - -#: src/reuse/_annotate.py:341 src/reuse/_util.py:567 -msgid "can't write to '{}'" -msgstr "неможливо записати в '{}'" - -#: src/reuse/_annotate.py:366 -msgid "" -"The following files do not have a recognised file extension. Please use --" -"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" -msgstr "" -"Ці файли не мають розпізнаного файлового розширення. Використовуйте --style, " -"--force-dot-license, --fallback-dot-license або --skip-unrecognised:" - -#: src/reuse/_annotate.py:382 -msgid "copyright statement, repeatable" -msgstr "оголошення авторського права, повторюване" - -#: src/reuse/_annotate.py:389 -msgid "SPDX Identifier, repeatable" -msgstr "Ідентифікатор SPDX, повторюваний" - -#: src/reuse/_annotate.py:395 -msgid "file contributor, repeatable" -msgstr "співавтор файлу, повторюваний" - -#: src/reuse/_annotate.py:403 -msgid "year of copyright statement, optional" -msgstr "рік оголошення авторського права, необов'язково" - -#: src/reuse/_annotate.py:411 -msgid "comment style to use, optional" -msgstr "використовуваний стиль коментарів, необов'язковий" - -#: src/reuse/_annotate.py:417 -msgid "copyright prefix to use, optional" -msgstr "префікс авторського права для користування, опціонально" - -#: src/reuse/_annotate.py:430 -msgid "name of template to use, optional" -msgstr "використовувана назва шаблону, необов'язково" - -#: src/reuse/_annotate.py:435 -msgid "do not include year in statement" -msgstr "не включати рік в оголошення" - -#: src/reuse/_annotate.py:440 -msgid "merge copyright lines if copyright statements are identical" -msgstr "" -"об’єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні" - -#: src/reuse/_annotate.py:446 -msgid "force single-line comment style, optional" -msgstr "примусовий однорядковий стиль коментаря, необов'язково" - -#: src/reuse/_annotate.py:451 -msgid "force multi-line comment style, optional" -msgstr "примусовий багаторядковий стиль коментарів, необов'язково" - -#: src/reuse/_annotate.py:458 -msgid "add headers to all files under specified directories recursively" -msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" - -#: src/reuse/_annotate.py:465 -msgid "do not replace the first header in the file; just add a new one" -msgstr "не замінювати перший заголовок у файлі; просто додавати новий" - -#: src/reuse/_annotate.py:473 -msgid "always write a .license file instead of a header inside the file" -msgstr "завжди записуйте файл .license замість заголовка всередині файлу" - -#: src/reuse/_annotate.py:480 -msgid "write a .license file to files with unrecognised comment styles" -msgstr "дописати файл .license до файлів з нерозпізнаними стилями коментарів" - -#: src/reuse/_annotate.py:486 -msgid "skip files with unrecognised comment styles" -msgstr "пропускати файли з нерозпізнаними стилями коментарів" - -#: src/reuse/_annotate.py:497 -msgid "skip files that already contain REUSE information" -msgstr "пропускати файли, які вже містять інформацію REUSE" - -#: src/reuse/_annotate.py:532 -#, python-brace-format -msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -msgstr "" -"'{path}' — це двійковий файл, тому для заголовка використовується " -"'{new_path}'" - -#: src/reuse/_lint_file.py:25 src/reuse/lint.py:30 -msgid "prevents output" -msgstr "запобігає виводу" - -#: src/reuse/_lint_file.py:31 -msgid "formats output as errors per line (default)" -msgstr "форматує вивід у вигляді помилок на рядок (усталено)" - -#: src/reuse/_lint_file.py:38 -msgid "files to lint" -msgstr "файли для перевірки" - -#: src/reuse/_lint_file.py:48 -#, python-brace-format -msgid "'{file}' is not inside of '{root}'" -msgstr "'{file}' не розміщено в '{root}'" - -#: src/reuse/_main.py:48 -msgid "" -"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " -"for the online documentation." -msgstr "" -"reuse — це засіб для дотримання порад REUSE. Перегляньте для отримання додаткових відомостей і перегляду онлайн-документації." - -#: src/reuse/_main.py:54 -msgid "" -"This version of reuse is compatible with version {} of the REUSE " -"Specification." -msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." - -#: src/reuse/_main.py:57 -msgid "Support the FSFE's work:" -msgstr "Підтримати роботу FSFE:" - -#: src/reuse/_main.py:61 -msgid "" -"Donations are critical to our strength and autonomy. They enable us to " -"continue working for Free Software wherever necessary. Please consider " -"making a donation at ." -msgstr "" -"Внески мають вирішальне значення для нашої стійкості й незалежності. Вони " -"дають нам змогу продовжувати працювати над вільним програмним забезпеченням, " -"де це необхідно. Будь ласка, розгляньте можливість підтримати нас на " -"." - -#: src/reuse/_main.py:84 -msgid "enable debug statements" -msgstr "увімкнути інструкції налагодження" - -#: src/reuse/_main.py:89 -msgid "hide deprecation warnings" -msgstr "сховати попередження про застарілість" - -#: src/reuse/_main.py:94 -msgid "do not skip over Git submodules" -msgstr "не пропускати підмодулі Git" - -#: src/reuse/_main.py:99 -msgid "do not skip over Meson subprojects" -msgstr "не пропускати підпроєкти Meson" - -#: src/reuse/_main.py:104 -msgid "do not use multiprocessing" -msgstr "не використовувати багатопроцесорність" - -#: src/reuse/_main.py:111 -msgid "define root of project" -msgstr "визначити кореневий каталог проєкту" - -#: src/reuse/_main.py:119 -msgid "show program's version number and exit" -msgstr "показати номер версії програми та вийти" - -#: src/reuse/_main.py:123 -msgid "subcommands" -msgstr "підкоманди" - -#: src/reuse/_main.py:130 -msgid "add copyright and licensing into the header of files" -msgstr "додати авторські права та ліцензії в заголовок файлів" - -#: src/reuse/_main.py:133 -msgid "" -"Add copyright and licensing into the header of one or more files.\n" -"\n" -"By using --copyright and --license, you can specify which copyright holders " -"and licenses to add to the headers of the given files.\n" -"\n" -"By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files." -msgstr "" -"Додайте інформацію про авторські права та ліцензування в заголовок одного " -"або декількох файлів.\n" -"\n" -" За допомогою --copyright і --license ви можете вказати, яких власників " -"авторських прав і ліцензій додавати до заголовків цих файлів.\n" -"\n" -" За допомогою --contributor ви можете вказати особу або організацію, яка " -"зробила внесок, але не є власником авторських прав на дані файли." - -#: src/reuse/_main.py:152 -msgid "download a license and place it in the LICENSES/ directory" -msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" - -#: src/reuse/_main.py:154 -msgid "Download a license and place it in the LICENSES/ directory." -msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." - -#: src/reuse/_main.py:163 -msgid "list all non-compliant files" -msgstr "список усіх несумісних файлів" - -#: src/reuse/_main.py:166 -#, fuzzy, python-brace-format -msgid "" -"Lint the project directory for compliance with version {reuse_version} of " -"the REUSE Specification. You can find the latest version of the " -"specification at .\n" -"\n" -"Specifically, the following criteria are checked:\n" -"\n" -"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " -"project?\n" -"\n" -"- Are there any deprecated licenses in the project?\n" -"\n" -"- Are there any license files in the LICENSES/ directory without file " -"extension?\n" -"\n" -"- Are any licenses referred to inside of the project, but not included in " -"the LICENSES/ directory?\n" -"\n" -"- Are any licenses included in the LICENSES/ directory that are not used " -"inside of the project?\n" -"\n" -"- Are there any read errors?\n" -"\n" -"- Do all files have valid copyright and licensing information?" -msgstr "" -"Перевірте каталог проєкту на відповідність версії {reuse_version} " -"специфікації REUSE. Ви можете знайти останню версію специфікації за адресою " -".\n" -"\n" -"Зокрема, перевіряються такі критерії:\n" -"\n" -"- Чи є в проєкті погані (нерозпізнані, несумісні з SPDX) ліцензії?\n" -"\n" -"- Чи є ліцензії, які згадуються всередині проєкту, але не включені в каталог " -"LICENSES/?\n" -"\n" -"- Чи включені будь-які ліцензії в каталог LICENSES/, які не використовуються " -"всередині проєкту?\n" -"\n" -"- Чи всі файли мають дійсні відомості про авторські права та ліцензії?" - -#: src/reuse/_main.py:202 -msgid "" -"Lint individual files. The specified files are checked for the presence of " -"copyright and licensing information, and whether the found licenses are " -"included in the LICENSES/ directory." -msgstr "" - -#: src/reuse/_main.py:208 -msgid "list non-compliant files from specified list of files" -msgstr "список невідповідних файлів із вказаного списку файлів" - -#: src/reuse/_main.py:217 -#, fuzzy -msgid "Generate an SPDX bill of materials in RDF format." -msgstr "друкувати опис матеріалів проєкту у форматі SPDX" - -#: src/reuse/_main.py:219 -msgid "print the project's bill of materials in SPDX format" -msgstr "друкувати опис матеріалів проєкту у форматі SPDX" - -#: src/reuse/_main.py:228 -msgid "List all non-deprecated SPDX licenses from the official list." -msgstr "" - -#: src/reuse/_main.py:230 -msgid "list all supported SPDX licenses" -msgstr "список всіх підтримуваних ліцензій SPDX" - -#: src/reuse/_main.py:241 -msgid "" -"Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -"generated file is semantically identical. The .reuse/dep5 file is " -"subsequently deleted." -msgstr "" - -#: src/reuse/_main.py:246 -msgid "convert .reuse/dep5 to REUSE.toml" -msgstr "конвертувати .reuse/dep5 у REUSE.toml" - -#: src/reuse/_main.py:311 -#, python-brace-format -msgid "" -"'{path}' could not be parsed. We received the following error message: " -"{message}" -msgstr "" -"'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " -"{message}" - -#: src/reuse/_util.py:362 src/reuse/global_licensing.py:232 +#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" -#: src/reuse/_util.py:418 +#: src/reuse/_util.py:384 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" -#: src/reuse/_util.py:550 -msgid "'{}' is not a file" -msgstr "'{}' не є файлом" - -#: src/reuse/_util.py:553 -msgid "'{}' is not a directory" -msgstr "'{}' не є каталогом" - -#: src/reuse/_util.py:556 -msgid "can't open '{}'" -msgstr "не вдалося відкрити '{}'" - -#: src/reuse/_util.py:561 -msgid "can't write to directory '{}'" -msgstr "неможливо записати в каталог '{}'" - -#: src/reuse/_util.py:580 -msgid "can't read or write '{}'" -msgstr "неможливо прочитати чи записати '{}'" - -#: src/reuse/_util.py:590 -msgid "'{}' is not a valid SPDX expression, aborting" -msgstr "'{}' не є дійсним виразом SPDX, переривання" - -#: src/reuse/_util.py:618 -msgid "'{}' is not a valid SPDX License Identifier." -msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." - -#: src/reuse/_util.py:625 -msgid "Did you mean:" -msgstr "Ви мали на увазі:" - -#: src/reuse/_util.py:632 -msgid "" -"See for a list of valid SPDX License " -"Identifiers." -msgstr "" -"Перегляньте список дійсних ідентифікаторів " -"ліцензії SPDX." - -#: src/reuse/convert_dep5.py:118 -msgid "no '.reuse/dep5' file" -msgstr "немає файлу '.reuse/dep5" - -#: src/reuse/download.py:130 -msgid "SPDX License Identifier of license" -msgstr "Ідентифікатор ліцензії SPDX" - -#: src/reuse/download.py:135 -msgid "download all missing licenses detected in the project" -msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" - -#: src/reuse/download.py:145 -msgid "" -"source from which to copy custom LicenseRef- licenses, either a directory " -"that contains the file or the file itself" -msgstr "" -"джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " -"каталог, який містить файл, або сам файл" - -#: src/reuse/download.py:156 -#, python-brace-format -msgid "Error: {spdx_identifier} already exists." -msgstr "Помилка: {spdx_identifier} вже існує." - -#: src/reuse/download.py:163 -#, python-brace-format -msgid "Error: {path} does not exist." -msgstr "Помилка: {path} не існує." - -#: src/reuse/download.py:166 -msgid "Error: Failed to download license." -msgstr "Помилка: не вдалося завантажити ліцензію." - -#: src/reuse/download.py:171 -msgid "Is your internet connection working?" -msgstr "Чи працює ваше інтернет-з'єднання?" - -#: src/reuse/download.py:176 -#, python-brace-format -msgid "Successfully downloaded {spdx_identifier}." -msgstr "Успішно завантажено {spdx_identifier}." - -#: src/reuse/download.py:189 -msgid "--output has no effect when used together with --all" -msgstr "--output не працює разом з --all" - -#: src/reuse/download.py:193 -msgid "the following arguments are required: license" -msgstr "необхідні такі аргументи: license" - -#: src/reuse/download.py:195 -msgid "cannot use --output with more than one license" -msgstr "не можна використовувати --output з кількома ліцензіями" - -#: src/reuse/global_licensing.py:119 +#: src/reuse/global_licensing.py:120 #, python-brace-format msgid "" "{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" "{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/global_licensing.py:133 +#: src/reuse/global_licensing.py:134 #, python-brace-format msgid "" "Item in {attr_name} collection must be a {type_name} (got {item_value} that " @@ -503,17 +86,17 @@ msgstr "" "Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " "що є {item_class})." -#: src/reuse/global_licensing.py:145 +#: src/reuse/global_licensing.py:146 #, python-brace-format msgid "{attr_name} must not be empty." msgstr "{attr_name} не повинне бути порожнім." -#: src/reuse/global_licensing.py:169 +#: src/reuse/global_licensing.py:170 #, python-brace-format msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." -#: src/reuse/global_licensing.py:193 +#: src/reuse/global_licensing.py:194 #, python-brace-format msgid "" "The value of 'precedence' must be one of {precedence_vals} (got {received})" @@ -527,170 +110,158 @@ msgstr "" "у згенерованому коментарі відсутні рядки про авторські права або вирази " "ліцензії" -#: src/reuse/lint.py:33 -msgid "formats output as JSON" -msgstr "форматує вивід як JSON" - -#: src/reuse/lint.py:39 -msgid "formats output as plain text (default)" -msgstr "форматує вивід як звичайний текст (усталено)" - -#: src/reuse/lint.py:45 -msgid "formats output as errors per line" -msgstr "форматує вивід у вигляді помилок на рядок" - -#: src/reuse/lint.py:64 +#: src/reuse/lint.py:38 msgid "BAD LICENSES" msgstr "ПОГАНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:66 src/reuse/lint.py:95 +#: src/reuse/lint.py:40 src/reuse/lint.py:69 msgid "'{}' found in:" msgstr "'{}' знайдено в:" -#: src/reuse/lint.py:73 +#: src/reuse/lint.py:47 msgid "DEPRECATED LICENSES" msgstr "ЗАСТАРІЛІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:75 +#: src/reuse/lint.py:49 msgid "The following licenses are deprecated by SPDX:" msgstr "У SPDX застаріли такі ліцензії:" -#: src/reuse/lint.py:83 +#: src/reuse/lint.py:57 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "ЛІЦЕНЗІЇ БЕЗ РОЗШИРЕННЯ ФАЙЛУ" -#: src/reuse/lint.py:85 +#: src/reuse/lint.py:59 msgid "The following licenses have no file extension:" msgstr "Ці ліцензії не мають розширення файлу:" -#: src/reuse/lint.py:93 +#: src/reuse/lint.py:67 msgid "MISSING LICENSES" msgstr "ВІДСУТНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:102 +#: src/reuse/lint.py:76 msgid "UNUSED LICENSES" msgstr "НЕВИКОРИСТАНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:77 msgid "The following licenses are not used:" msgstr "Не використовуються такі ліцензії:" -#: src/reuse/lint.py:110 +#: src/reuse/lint.py:84 msgid "READ ERRORS" msgstr "ПОМИЛКИ ЧИТАННЯ" -#: src/reuse/lint.py:111 +#: src/reuse/lint.py:85 msgid "Could not read:" msgstr "Не вдалося прочитати:" -#: src/reuse/lint.py:132 +#: src/reuse/lint.py:106 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "ВІДСУТНІ ВІДОМОСТІ ПРО АВТОРСЬКІ ПРАВА ТА ЛІЦЕНЗУВАННЯ" -#: src/reuse/lint.py:138 +#: src/reuse/lint.py:112 msgid "The following files have no copyright and licensing information:" msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" -#: src/reuse/lint.py:149 +#: src/reuse/lint.py:123 msgid "The following files have no copyright information:" msgstr "Такі файли не містять відомостей про авторські права:" -#: src/reuse/lint.py:158 +#: src/reuse/lint.py:132 msgid "The following files have no licensing information:" msgstr "Такі файли не мають відомостей про ліцензування:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:140 msgid "SUMMARY" msgstr "ПІДСУМОК" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:145 msgid "Bad licenses:" msgstr "Погані ліцензії:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:146 msgid "Deprecated licenses:" msgstr "Застарілі ліцензії:" -#: src/reuse/lint.py:173 +#: src/reuse/lint.py:147 msgid "Licenses without file extension:" msgstr "Ліцензії без розширення файлу:" -#: src/reuse/lint.py:176 +#: src/reuse/lint.py:150 msgid "Missing licenses:" msgstr "Відсутні ліцензії:" -#: src/reuse/lint.py:177 +#: src/reuse/lint.py:151 msgid "Unused licenses:" msgstr "Невикористані ліцензії:" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:152 msgid "Used licenses:" msgstr "Використані ліцензії:" -#: src/reuse/lint.py:179 +#: src/reuse/lint.py:153 msgid "Read errors:" msgstr "Помилки читання:" -#: src/reuse/lint.py:181 +#: src/reuse/lint.py:155 msgid "Files with copyright information:" msgstr "Файли з інформацією про авторські права:" -#: src/reuse/lint.py:185 +#: src/reuse/lint.py:159 msgid "Files with license information:" msgstr "Файли з інформацією про ліцензію:" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:176 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Вітаємо! Ваш проєкт відповідає версії {} специфікації REUSE :-)" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:183 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "На жаль, ваш проєкт не сумісний із версією {} специфікації REUSE :-(" -#: src/reuse/lint.py:216 +#: src/reuse/lint.py:190 msgid "RECOMMENDATIONS" msgstr "РЕКОМЕНДАЦІЇ" -#: src/reuse/lint.py:280 +#: src/reuse/lint.py:254 #, python-brace-format msgid "{path}: missing license {lic}\n" msgstr "{path}: пропущена ліцензія {lic}\n" -#: src/reuse/lint.py:285 +#: src/reuse/lint.py:259 #, python-brace-format msgid "{path}: read error\n" msgstr "{path}: помилка читання\n" -#: src/reuse/lint.py:289 +#: src/reuse/lint.py:263 #, python-brace-format msgid "{path}: no license identifier\n" msgstr "{path}: немає ідентифікатора ліцензії\n" -#: src/reuse/lint.py:293 +#: src/reuse/lint.py:267 #, python-brace-format msgid "{path}: no copyright notice\n" msgstr "{path}: без повідомлення про авторське право\n" -#: src/reuse/lint.py:320 +#: src/reuse/lint.py:294 #, python-brace-format msgid "{path}: bad license {lic}\n" msgstr "{path}: погана ліцензія {lic}\n" -#: src/reuse/lint.py:327 +#: src/reuse/lint.py:301 #, python-brace-format msgid "{lic_path}: deprecated license\n" msgstr "{lic_path}: застаріла ліцензія\n" -#: src/reuse/lint.py:334 +#: src/reuse/lint.py:308 #, python-brace-format msgid "{lic_path}: license without file extension\n" msgstr "{lic_path}: ліцензія без розширення файлу\n" -#: src/reuse/lint.py:343 +#: src/reuse/lint.py:317 #, python-brace-format msgid "{lic_path}: unused license\n" msgstr "{lic_path}: невикористана ліцензія\n" @@ -770,17 +341,17 @@ msgstr "" "проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS не " "встановлено" -#: src/reuse/report.py:149 +#: src/reuse/report.py:150 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не вдалося прочитати '{path}'" -#: src/reuse/report.py:154 +#: src/reuse/report.py:155 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Під час аналізу '{path}' сталася неочікувана помилка" -#: src/reuse/report.py:507 +#: src/reuse/report.py:508 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -793,7 +364,7 @@ msgstr "" "Часті запитання про користувацькі ліцензії: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:518 +#: src/reuse/report.py:519 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -806,7 +377,7 @@ msgstr "" "застаріла для SPDX. Поточний список і відповідні рекомендовані нові " "ідентифікатори можна знайти тут: " -#: src/reuse/report.py:529 +#: src/reuse/report.py:530 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -816,7 +387,7 @@ msgstr "" "ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " "файл(и) відповідно." -#: src/reuse/report.py:538 +#: src/reuse/report.py:539 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -831,7 +402,7 @@ msgstr "" "будь-які відсутні ідентифікатори. Для користувацьких ліцензій (починаючи з " "'LicenseRef-') вам потрібно додати ці файли самостійно." -#: src/reuse/report.py:550 +#: src/reuse/report.py:551 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -845,7 +416,7 @@ msgstr "" "відповідні ліцензовані файли, або видаліть невикористаний текст ліцензії, " "якщо ви впевнені, що жоден файл або фрагмент коду не ліцензований як такий." -#: src/reuse/report.py:561 +#: src/reuse/report.py:562 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -856,7 +427,7 @@ msgstr "" "відповідні файли у верхній частині виводу як частину зареєстрованих " "повідомлень про помилки." -#: src/reuse/report.py:570 +#: src/reuse/report.py:571 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " @@ -870,193 +441,765 @@ msgstr "" "теги 'SPDX-FileCopyrightText' і 'SPDX-License-Identifier'. У довіднику " "описано інші способи зробити це: " -#: src/reuse/spdx.py:32 -msgid "" -"populate the LicenseConcluded field; note that reuse cannot guarantee the " -"field is accurate" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" msgstr "" -"заповніть поле LicenseConcluded; зауважте, що повторне використання не може " -"гарантувати точність поля" -#: src/reuse/spdx.py:39 -msgid "name of the person signing off on the SPDX report" -msgstr "ім'я особи, яка підписує звіт SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" -#: src/reuse/spdx.py:44 -msgid "name of the organization signing off on the SPDX report" -msgstr "назва організації, яка підписує звіт SPDX" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 +msgid "Aborted!" +msgstr "" -#: src/reuse/spdx.py:60 -msgid "" -"error: --creator-person=NAME or --creator-organization=NAME required when --" -"add-license-concluded is provided" +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 +#, fuzzy +msgid "Show this message and exit." +msgstr "показати це повідомлення та вийти" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 +#, fuzzy, python-brace-format +msgid "(Deprecated) {text}" +msgstr "Застарілі ліцензії:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 +#, fuzzy +msgid "Options" +msgstr "параметри" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 +#, fuzzy, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "очікується один аргумент" +msgstr[1] "очікується один аргумент" +msgstr[2] "очікується один аргумент" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 +#, fuzzy +msgid "Commands" +msgstr "підкоманди" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 +#, fuzzy +msgid "Missing command." +msgstr "Відсутні ліцензії:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 +#, python-brace-format +msgid "env var: {var}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 +msgid "(dynamic)" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 +#, python-brace-format +msgid "default: {default}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 +msgid "required" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: помилка: %(message)s\n" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 +#, fuzzy +msgid "Show the version and exit." +msgstr "показати це повідомлення та вийти" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" msgstr "" -"помилка: --creator-person=NAME або --creator-organization=NAME вимагається, " -"якщо надається --add-license-concluded" -#: src/reuse/spdx.py:75 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 +#, fuzzy +msgid "Missing argument" +msgstr "позиційні аргументи" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 +#, fuzzy +msgid "Missing option" +msgstr "Відсутні ліцензії:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 +#, fuzzy, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "Ви мали на увазі:" +msgstr[1] "Ви мали на увазі:" +msgstr[2] "Ви мали на увазі:" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format msgid "" -"'{path}' does not match a common SPDX file pattern. Find the suggested " -"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" +"Choose from:\n" +"\t{choices}" msgstr "" -"'{path}' не відповідає загальному шаблону файлу SPDX. Знайдіть запропоновані " -"правила іменування тут: https://spdx.github.io/spdx-spec/conformance/#44-" -"standard-data-format-requirements" -#: /usr/lib/python3.10/argparse.py:308 -msgid "usage: " -msgstr "використання: " +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 +#, fuzzy +msgid "{name} {filename!r} does not exist." +msgstr "Помилка: {path} не існує." + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 +#, fuzzy, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "'{}' не є каталогом" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support single-line comments, please do not use --" +#~ "single-line" +#~ msgstr "" +#~ "'{path}' не підтримує однорядкові коментарі, не використовуйте --single-" +#~ "line" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not support multi-line comments, please do not use --multi-" +#~ "line" +#~ msgstr "" +#~ "'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-" +#~ "line" + +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--skip-unrecognised не працює разом із --style" + +#~ msgid "option --contributor, --copyright or --license is required" +#~ msgstr "потрібен параметр --contributor, --copyright або --license" + +#, python-brace-format +#~ msgid "template {template} could not be found" +#~ msgstr "не вдалося знайти шаблон {template}" + +#~ msgid "can't write to '{}'" +#~ msgstr "неможливо записати в '{}'" + +#~ msgid "" +#~ "The following files do not have a recognised file extension. Please use --" +#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" +#~ "unrecognised:" +#~ msgstr "" +#~ "Ці файли не мають розпізнаного файлового розширення. Використовуйте --" +#~ "style, --force-dot-license, --fallback-dot-license або --skip-" +#~ "unrecognised:" + +#~ msgid "copyright statement, repeatable" +#~ msgstr "оголошення авторського права, повторюване" + +#~ msgid "SPDX Identifier, repeatable" +#~ msgstr "Ідентифікатор SPDX, повторюваний" + +#~ msgid "file contributor, repeatable" +#~ msgstr "співавтор файлу, повторюваний" + +#~ msgid "year of copyright statement, optional" +#~ msgstr "рік оголошення авторського права, необов'язково" + +#~ msgid "comment style to use, optional" +#~ msgstr "використовуваний стиль коментарів, необов'язковий" + +#~ msgid "copyright prefix to use, optional" +#~ msgstr "префікс авторського права для користування, опціонально" + +#~ msgid "name of template to use, optional" +#~ msgstr "використовувана назва шаблону, необов'язково" + +#~ msgid "do not include year in statement" +#~ msgstr "не включати рік в оголошення" + +#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgstr "" +#~ "об’єднувати рядки авторських прав, якщо оголошення авторських прав " +#~ "ідентичні" + +#~ msgid "force single-line comment style, optional" +#~ msgstr "примусовий однорядковий стиль коментаря, необов'язково" + +#~ msgid "force multi-line comment style, optional" +#~ msgstr "примусовий багаторядковий стиль коментарів, необов'язково" + +#~ msgid "add headers to all files under specified directories recursively" +#~ msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" + +#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgstr "не замінювати перший заголовок у файлі; просто додавати новий" + +#~ msgid "always write a .license file instead of a header inside the file" +#~ msgstr "завжди записуйте файл .license замість заголовка всередині файлу" + +#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgstr "" +#~ "дописати файл .license до файлів з нерозпізнаними стилями коментарів" + +#~ msgid "skip files with unrecognised comment styles" +#~ msgstr "пропускати файли з нерозпізнаними стилями коментарів" + +#~ msgid "skip files that already contain REUSE information" +#~ msgstr "пропускати файли, які вже містять інформацію REUSE" + +#, python-brace-format +#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgstr "" +#~ "'{path}' — це двійковий файл, тому для заголовка використовується " +#~ "'{new_path}'" + +#~ msgid "prevents output" +#~ msgstr "запобігає виводу" + +#~ msgid "formats output as errors per line (default)" +#~ msgstr "форматує вивід у вигляді помилок на рядок (усталено)" + +#~ msgid "files to lint" +#~ msgstr "файли для перевірки" + +#, python-brace-format +#~ msgid "'{file}' is not inside of '{root}'" +#~ msgstr "'{file}' не розміщено в '{root}'" + +#~ msgid "" +#~ "reuse is a tool for compliance with the REUSE recommendations. See " +#~ " for more information, and for the online documentation." +#~ msgstr "" +#~ "reuse — це засіб для дотримання порад REUSE. Перегляньте для отримання додаткових відомостей і перегляду онлайн-документації." + +#~ msgid "" +#~ "This version of reuse is compatible with version {} of the REUSE " +#~ "Specification." +#~ msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." + +#~ msgid "Support the FSFE's work:" +#~ msgstr "Підтримати роботу FSFE:" + +#~ msgid "" +#~ "Donations are critical to our strength and autonomy. They enable us to " +#~ "continue working for Free Software wherever necessary. Please consider " +#~ "making a donation at ." +#~ msgstr "" +#~ "Внески мають вирішальне значення для нашої стійкості й незалежності. Вони " +#~ "дають нам змогу продовжувати працювати над вільним програмним " +#~ "забезпеченням, де це необхідно. Будь ласка, розгляньте можливість " +#~ "підтримати нас на ." -#: /usr/lib/python3.10/argparse.py:880 -msgid ".__call__() not defined" -msgstr ".__call__() не визначено" +#~ msgid "enable debug statements" +#~ msgstr "увімкнути інструкції налагодження" + +#~ msgid "hide deprecation warnings" +#~ msgstr "сховати попередження про застарілість" + +#~ msgid "do not skip over Git submodules" +#~ msgstr "не пропускати підмодулі Git" + +#~ msgid "do not skip over Meson subprojects" +#~ msgstr "не пропускати підпроєкти Meson" + +#~ msgid "do not use multiprocessing" +#~ msgstr "не використовувати багатопроцесорність" + +#~ msgid "define root of project" +#~ msgstr "визначити кореневий каталог проєкту" + +#~ msgid "show program's version number and exit" +#~ msgstr "показати номер версії програми та вийти" + +#~ msgid "add copyright and licensing into the header of files" +#~ msgstr "додати авторські права та ліцензії в заголовок файлів" + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files." +#~ msgstr "" +#~ "Додайте інформацію про авторські права та ліцензування в заголовок одного " +#~ "або декількох файлів.\n" +#~ "\n" +#~ " За допомогою --copyright і --license ви можете вказати, яких власників " +#~ "авторських прав і ліцензій додавати до заголовків цих файлів.\n" +#~ "\n" +#~ " За допомогою --contributor ви можете вказати особу або організацію, яка " +#~ "зробила внесок, але не є власником авторських прав на дані файли." + +#~ msgid "download a license and place it in the LICENSES/ directory" +#~ msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" + +#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." + +#~ msgid "list all non-compliant files" +#~ msgstr "список усіх несумісних файлів" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Lint the project directory for compliance with version {reuse_version} of " +#~ "the REUSE Specification. You can find the latest version of the " +#~ "specification at .\n" +#~ "\n" +#~ "Specifically, the following criteria are checked:\n" +#~ "\n" +#~ "- Are there any bad (unrecognised, not compliant with SPDX) licenses in " +#~ "the project?\n" +#~ "\n" +#~ "- Are there any deprecated licenses in the project?\n" +#~ "\n" +#~ "- Are there any license files in the LICENSES/ directory without file " +#~ "extension?\n" +#~ "\n" +#~ "- Are any licenses referred to inside of the project, but not included in " +#~ "the LICENSES/ directory?\n" +#~ "\n" +#~ "- Are any licenses included in the LICENSES/ directory that are not used " +#~ "inside of the project?\n" +#~ "\n" +#~ "- Are there any read errors?\n" +#~ "\n" +#~ "- Do all files have valid copyright and licensing information?" +#~ msgstr "" +#~ "Перевірте каталог проєкту на відповідність версії {reuse_version} " +#~ "специфікації REUSE. Ви можете знайти останню версію специфікації за " +#~ "адресою .\n" +#~ "\n" +#~ "Зокрема, перевіряються такі критерії:\n" +#~ "\n" +#~ "- Чи є в проєкті погані (нерозпізнані, несумісні з SPDX) ліцензії?\n" +#~ "\n" +#~ "- Чи є ліцензії, які згадуються всередині проєкту, але не включені в " +#~ "каталог LICENSES/?\n" +#~ "\n" +#~ "- Чи включені будь-які ліцензії в каталог LICENSES/, які не " +#~ "використовуються всередині проєкту?\n" +#~ "\n" +#~ "- Чи всі файли мають дійсні відомості про авторські права та ліцензії?" + +#~ msgid "list non-compliant files from specified list of files" +#~ msgstr "список невідповідних файлів із вказаного списку файлів" + +#, fuzzy +#~ msgid "Generate an SPDX bill of materials in RDF format." +#~ msgstr "друкувати опис матеріалів проєкту у форматі SPDX" + +#~ msgid "print the project's bill of materials in SPDX format" +#~ msgstr "друкувати опис матеріалів проєкту у форматі SPDX" + +#~ msgid "list all supported SPDX licenses" +#~ msgstr "список всіх підтримуваних ліцензій SPDX" + +#~ msgid "convert .reuse/dep5 to REUSE.toml" +#~ msgstr "конвертувати .reuse/dep5 у REUSE.toml" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' could not be parsed. We received the following error message: " +#~ "{message}" +#~ msgstr "" +#~ "'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " +#~ "{message}" + +#~ msgid "'{}' is not a file" +#~ msgstr "'{}' не є файлом" + +#~ msgid "can't open '{}'" +#~ msgstr "не вдалося відкрити '{}'" + +#~ msgid "can't write to directory '{}'" +#~ msgstr "неможливо записати в каталог '{}'" + +#~ msgid "can't read or write '{}'" +#~ msgstr "неможливо прочитати чи записати '{}'" + +#~ msgid "'{}' is not a valid SPDX expression, aborting" +#~ msgstr "'{}' не є дійсним виразом SPDX, переривання" + +#~ msgid "'{}' is not a valid SPDX License Identifier." +#~ msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." + +#~ msgid "" +#~ "See for a list of valid SPDX License " +#~ "Identifiers." +#~ msgstr "" +#~ "Перегляньте список дійсних ідентифікаторів " +#~ "ліцензії SPDX." + +#~ msgid "no '.reuse/dep5' file" +#~ msgstr "немає файлу '.reuse/dep5" + +#~ msgid "SPDX License Identifier of license" +#~ msgstr "Ідентифікатор ліцензії SPDX" + +#~ msgid "download all missing licenses detected in the project" +#~ msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" + +#~ msgid "" +#~ "source from which to copy custom LicenseRef- licenses, either a directory " +#~ "that contains the file or the file itself" +#~ msgstr "" +#~ "джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " +#~ "каталог, який містить файл, або сам файл" + +#, python-brace-format +#~ msgid "Error: {spdx_identifier} already exists." +#~ msgstr "Помилка: {spdx_identifier} вже існує." + +#~ msgid "Error: Failed to download license." +#~ msgstr "Помилка: не вдалося завантажити ліцензію." + +#~ msgid "Is your internet connection working?" +#~ msgstr "Чи працює ваше інтернет-з'єднання?" + +#, python-brace-format +#~ msgid "Successfully downloaded {spdx_identifier}." +#~ msgstr "Успішно завантажено {spdx_identifier}." + +#~ msgid "--output has no effect when used together with --all" +#~ msgstr "--output не працює разом з --all" + +#~ msgid "the following arguments are required: license" +#~ msgstr "необхідні такі аргументи: license" + +#~ msgid "cannot use --output with more than one license" +#~ msgstr "не можна використовувати --output з кількома ліцензіями" + +#~ msgid "formats output as JSON" +#~ msgstr "форматує вивід як JSON" + +#~ msgid "formats output as plain text (default)" +#~ msgstr "форматує вивід як звичайний текст (усталено)" + +#~ msgid "formats output as errors per line" +#~ msgstr "форматує вивід у вигляді помилок на рядок" + +#~ msgid "" +#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " +#~ "field is accurate" +#~ msgstr "" +#~ "заповніть поле LicenseConcluded; зауважте, що повторне використання не " +#~ "може гарантувати точність поля" + +#~ msgid "name of the person signing off on the SPDX report" +#~ msgstr "ім'я особи, яка підписує звіт SPDX" + +#~ msgid "name of the organization signing off on the SPDX report" +#~ msgstr "назва організації, яка підписує звіт SPDX" + +#~ msgid "" +#~ "error: --creator-person=NAME or --creator-organization=NAME required when " +#~ "--add-license-concluded is provided" +#~ msgstr "" +#~ "помилка: --creator-person=NAME або --creator-organization=NAME " +#~ "вимагається, якщо надається --add-license-concluded" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " +#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +#~ "standard-data-format-requirements" +#~ msgstr "" +#~ "'{path}' не відповідає загальному шаблону файлу SPDX. Знайдіть " +#~ "запропоновані правила іменування тут: https://spdx.github.io/spdx-spec/" +#~ "conformance/#44-standard-data-format-requirements" + +#~ msgid "usage: " +#~ msgstr "використання: " + +#~ msgid ".__call__() not defined" +#~ msgstr ".__call__() не визначено" -#: /usr/lib/python3.10/argparse.py:1223 #, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" +#~ msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +#~ msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" -#: /usr/lib/python3.10/argparse.py:1283 #, python-format -msgid "argument \"-\" with mode %r" -msgstr "аргумент \"-\" з режимом %r" +#~ msgid "argument \"-\" with mode %r" +#~ msgstr "аргумент \"-\" з режимом %r" -#: /usr/lib/python3.10/argparse.py:1292 #, python-format -msgid "can't open '%(filename)s': %(error)s" -msgstr "не вдалося відкрити '%(filename)s': %(error)s" +#~ msgid "can't open '%(filename)s': %(error)s" +#~ msgstr "не вдалося відкрити '%(filename)s': %(error)s" -#: /usr/lib/python3.10/argparse.py:1501 #, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "не вдалося об'єднати дії - дві групи називаються %r" +#~ msgid "cannot merge actions - two groups are named %r" +#~ msgstr "не вдалося об'єднати дії - дві групи називаються %r" -#: /usr/lib/python3.10/argparse.py:1539 -msgid "'required' is an invalid argument for positionals" -msgstr "'required' — неприпустимий аргумент для позиційних значень" +#~ msgid "'required' is an invalid argument for positionals" +#~ msgstr "'required' — неприпустимий аргумент для позиційних значень" -#: /usr/lib/python3.10/argparse.py:1561 #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "" -"недійсний рядок опцій %(option)r: має починатися з символу %(prefix_chars)r" +#~ msgid "" +#~ "invalid option string %(option)r: must start with a character " +#~ "%(prefix_chars)r" +#~ msgstr "" +#~ "недійсний рядок опцій %(option)r: має починатися з символу " +#~ "%(prefix_chars)r" -#: /usr/lib/python3.10/argparse.py:1579 #, python-format -msgid "dest= is required for options like %r" -msgstr "dest= потрібен для таких опцій, як %r" +#~ msgid "dest= is required for options like %r" +#~ msgstr "dest= потрібен для таких опцій, як %r" -#: /usr/lib/python3.10/argparse.py:1596 #, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "недійсне значення conflict_resolution: %r" +#~ msgid "invalid conflict_resolution value: %r" +#~ msgstr "недійсне значення conflict_resolution: %r" -#: /usr/lib/python3.10/argparse.py:1614 #, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "конфліктний рядок опцій: %s" -msgstr[1] "конфліктні рядки опцій: %s" -msgstr[2] "конфліктні рядки опцій: %s" - -#: /usr/lib/python3.10/argparse.py:1680 -msgid "mutually exclusive arguments must be optional" -msgstr "взаємозаперечні аргументи повинні бути необов'язковими" - -#: /usr/lib/python3.10/argparse.py:1748 -msgid "positional arguments" -msgstr "позиційні аргументи" - -#: /usr/lib/python3.10/argparse.py:1749 -msgid "options" -msgstr "параметри" +#~ msgid "conflicting option string: %s" +#~ msgid_plural "conflicting option strings: %s" +#~ msgstr[0] "конфліктний рядок опцій: %s" +#~ msgstr[1] "конфліктні рядки опцій: %s" +#~ msgstr[2] "конфліктні рядки опцій: %s" -#: /usr/lib/python3.10/argparse.py:1764 -msgid "show this help message and exit" -msgstr "показати це повідомлення та вийти" +#~ msgid "mutually exclusive arguments must be optional" +#~ msgstr "взаємозаперечні аргументи повинні бути необов'язковими" -#: /usr/lib/python3.10/argparse.py:1795 -msgid "cannot have multiple subparser arguments" -msgstr "не може мати кілька аргументів підпарсера" +#~ msgid "cannot have multiple subparser arguments" +#~ msgstr "не може мати кілька аргументів підпарсера" -#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 #, python-format -msgid "unrecognized arguments: %s" -msgstr "нерозпізнані аргументи: %s" +#~ msgid "unrecognized arguments: %s" +#~ msgstr "нерозпізнані аргументи: %s" -#: /usr/lib/python3.10/argparse.py:1948 #, python-format -msgid "not allowed with argument %s" -msgstr "не дозволено з аргументом %s" +#~ msgid "not allowed with argument %s" +#~ msgstr "не дозволено з аргументом %s" -#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 #, python-format -msgid "ignored explicit argument %r" -msgstr "нехтується явний аргумент %r" +#~ msgid "ignored explicit argument %r" +#~ msgstr "нехтується явний аргумент %r" -#: /usr/lib/python3.10/argparse.py:2119 #, python-format -msgid "the following arguments are required: %s" -msgstr "такі аргументи обов'язкові: %s" +#~ msgid "the following arguments are required: %s" +#~ msgstr "такі аргументи обов'язкові: %s" -#: /usr/lib/python3.10/argparse.py:2134 #, python-format -msgid "one of the arguments %s is required" -msgstr "один з аргументів %s обов'язковий" - -#: /usr/lib/python3.10/argparse.py:2177 -msgid "expected one argument" -msgstr "очікується один аргумент" +#~ msgid "one of the arguments %s is required" +#~ msgstr "один з аргументів %s обов'язковий" -#: /usr/lib/python3.10/argparse.py:2178 -msgid "expected at most one argument" -msgstr "очікується щонайбільше один аргумент" +#~ msgid "expected at most one argument" +#~ msgstr "очікується щонайбільше один аргумент" -#: /usr/lib/python3.10/argparse.py:2179 -msgid "expected at least one argument" -msgstr "очікується хоча б один аргумент" +#~ msgid "expected at least one argument" +#~ msgstr "очікується хоча б один аргумент" -#: /usr/lib/python3.10/argparse.py:2183 #, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "очікується %s аргумент" -msgstr[1] "очікується %s аргументи" -msgstr[2] "очікується %s аргументів" +#~ msgid "expected %s argument" +#~ msgid_plural "expected %s arguments" +#~ msgstr[0] "очікується %s аргумент" +#~ msgstr[1] "очікується %s аргументи" +#~ msgstr[2] "очікується %s аргументів" -#: /usr/lib/python3.10/argparse.py:2241 #, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" +#~ msgid "ambiguous option: %(option)s could match %(matches)s" +#~ msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" -#: /usr/lib/python3.10/argparse.py:2305 #, python-format -msgid "unexpected option string: %s" -msgstr "неочікуваний рядок параметрів: %s" +#~ msgid "unexpected option string: %s" +#~ msgstr "неочікуваний рядок параметрів: %s" -#: /usr/lib/python3.10/argparse.py:2502 #, python-format -msgid "%r is not callable" -msgstr "%r не можна викликати" +#~ msgid "%r is not callable" +#~ msgstr "%r не можна викликати" -#: /usr/lib/python3.10/argparse.py:2519 #, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "недійсне значення %(type)s: %(value)r" +#~ msgid "invalid %(type)s value: %(value)r" +#~ msgstr "недійсне значення %(type)s: %(value)r" -#: /usr/lib/python3.10/argparse.py:2530 #, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "неприпустимий вибір: %(value)r (варто обрати з %(choices)s)" - -#: /usr/lib/python3.10/argparse.py:2606 -#, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: помилка: %(message)s\n" +#~ msgid "invalid choice: %(value)r (choose from %(choices)s)" +#~ msgstr "неприпустимий вибір: %(value)r (варто обрати з %(choices)s)" #, python-brace-format #~ msgid "'{path}' could not be decoded as UTF-8." From 419abc63c42592968cc8aea031374bd51afab7fa Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:30:04 +0200 Subject: [PATCH 091/156] Generate .pot with all reuse Python files Signed-off-by: Carmen Bianca BAKKER --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7edcd64f8..67b4426f8 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ dist: clean-build clean-pyc clean-docs ## builds source and wheel package .PHONY: create-pot create-pot: ## generate .pot file - xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot src/reuse/**.py + xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot src/reuse/**/*.py xgettext --add-comments --output=po/click.pot "${VIRTUAL_ENV}"/lib/python*/*-packages/click/**.py msgcat --output=po/reuse.pot po/reuse.pot po/click.pot for name in po/*.po; do \ From a87cdcc9c498e00456cd5f0962060cd97b742c85 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 10 Oct 2024 18:31:46 +0200 Subject: [PATCH 092/156] Fix typo This typo fix should also trigger pot generation. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index 0e185f274..1f943fba1 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -106,7 +106,7 @@ def handle_parse_result( def spdx_identifier(text: str) -> Expression: - """factory for creating SPDX expressions.""" + """Factory for creating SPDX expressions.""" try: return _LICENSING.parse(text) except (ExpressionError, ParseError) as error: From 39f280d62c260bcdd35fe8fcf04d372a5feccc2e Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 10 Oct 2024 16:33:09 +0000 Subject: [PATCH 093/156] Update reuse.pot --- po/cs.po | 1259 +++++++++++++++++++++++++++--------------------- po/de.po | 1100 +++++++++++++++++++++++------------------- po/eo.po | 936 ++++++++++++++++++++---------------- po/es.po | 1275 +++++++++++++++++++++++++++---------------------- po/fr.po | 1287 +++++++++++++++++++++++++++++--------------------- po/gl.po | 910 +++++++++++++++++++---------------- po/it.po | 922 ++++++++++++++++++++---------------- po/nl.po | 916 +++++++++++++++++++---------------- po/pt.po | 911 +++++++++++++++++++---------------- po/reuse.pot | 499 ++++++++++--------- po/ru.po | 1272 ++++++++++++++++++++++++++++--------------------- po/sv.po | 655 ++++++++++++------------- po/tr.po | 1019 ++++++++++++++++++++------------------- po/uk.po | 1265 ++++++++++++++++++++++++++++--------------------- 14 files changed, 7999 insertions(+), 6227 deletions(-) diff --git a/po/cs.po b/po/cs.po index 35dcae546..1d8e1205f 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-09-14 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech =2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/_annotate.py:95 -#, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "Přeskočen nerozpoznaný soubor '{path}'" - -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "'{path}' není rozpoznán; vytváří se '{path}.license'" - -#: src/reuse/_annotate.py:117 -#, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" -msgstr "Přeskočený soubor '{path}' již obsahuje informace REUSE" +#: src/reuse/cli/annotate.py:62 +#, fuzzy +msgid "Option '--copyright', '--license', or '--contributor' is required." +msgstr "je vyžadována možnost --contributor, --copyright nebo --license" -#: src/reuse/_annotate.py:151 -#, python-brace-format -msgid "Error: Could not create comment for '{path}'" -msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" +#: src/reuse/cli/annotate.py:123 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" +msgstr "" +"Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" +"dot-license, --fallback-dot-license nebo --skip-unrecognised:" -#: src/reuse/_annotate.py:158 -#, python-brace-format +#: src/reuse/cli/annotate.py:156 +#, fuzzy, python-brace-format msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." msgstr "" -"Chyba: Chybí řádky s autorskými právy nebo licenční výrazy v generovaném " -"záhlaví komentáře pro '{path}'. Šablona je pravděpodobně nesprávná. " -"Nepodařilo se zapsat novou hlavičku." +"'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" +"line" -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 -#, python-brace-format -msgid "Successfully changed header of {path}" -msgstr "Úspěšně změněna hlavička {path}" +#: src/reuse/cli/annotate.py:163 +#, fuzzy, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." +msgstr "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" -msgstr "Nepodařilo se analyzovat '{expression}'" +#: src/reuse/cli/annotate.py:209 +#, fuzzy, python-brace-format +msgid "Template '{template}' could not be found." +msgstr "šablonu {template} se nepodařilo najít" -#: src/reuse/_util.py:384 -#, python-brace-format -msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" -msgstr "" -"'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" +#: src/reuse/cli/annotate.py:272 +#, fuzzy +msgid "Add copyright and licensing into the headers of files." +msgstr "přidání autorských práv a licencí do záhlaví souborů" -#: src/reuse/global_licensing.py:120 -#, python-brace-format +#: src/reuse/cli/annotate.py:275 msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -"{attr_name} musí být {type_name} (mít {value}, který je {value_class})." -#: src/reuse/global_licensing.py:134 -#, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -"Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, která " -"je {item_class})." -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." -msgstr "{attr_name} nesmí být prázdný." +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" +msgstr "" -#: src/reuse/global_licensing.py:170 -#, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." -msgstr "{name} musí být {type} (má {value}, která je {value_type})." +#: src/reuse/cli/annotate.py:296 +#, fuzzy +msgid "Copyright statement, repeatable." +msgstr "prohlášení o autorských právech, opakovatelné" -#: src/reuse/global_licensing.py:194 -#, python-brace-format -msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" msgstr "" -"Hodnota 'precedence' musí být jedna z {precedence_vals} (got {received})" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:305 +#, fuzzy +msgid "SPDX License Identifier, repeatable." +msgstr "Identifikátor SPDX, opakovatelný" + +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" msgstr "" -"ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " -"výrazy" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" -msgstr "NEVHODNÉ LICENCE" +#: src/reuse/cli/annotate.py:313 +#, fuzzy +msgid "File contributor, repeatable." +msgstr "přispěvatel souboru, opakovatelný" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" -msgstr "'{}' nalezeno v:" +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" +msgstr "" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" -msgstr "ZASTARALÉ LICENCE" +#: src/reuse/cli/annotate.py:325 +#, fuzzy +msgid "Year of copyright statement." +msgstr "rok vydání prohlášení o autorských právech, nepovinné" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" -msgstr "Následující licence jsou v SPDX zrušeny:" +#: src/reuse/cli/annotate.py:333 +#, fuzzy +msgid "Comment style to use." +msgstr "styl komentáře, který se má použít, nepovinné" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" -msgstr "LICENCE BEZ KONCOVKY SOUBORU" +#: src/reuse/cli/annotate.py:338 +#, fuzzy +msgid "Copyright prefix to use." +msgstr "předpona autorských práv, která se má použít, nepovinné" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" -msgstr "Následující licence nemají příponu souboru:" +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" +msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" -msgstr "CHYBĚJÍCÍ LICENCE" +#: src/reuse/cli/annotate.py:351 +#, fuzzy +msgid "Name of template to use." +msgstr "název šablony, která se má použít, nepovinné" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" -msgstr "NEPOUŽITÉ LICENCE" +#: src/reuse/cli/annotate.py:358 +#, fuzzy +msgid "Do not include year in copyright statement." +msgstr "neuvádět rok v prohlášení" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" -msgstr "Následující licence nejsou používány:" +#: src/reuse/cli/annotate.py:363 +#, fuzzy +msgid "Merge copyright lines if copyright statements are identical." +msgstr "" +"sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských právech " +"totožná" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" -msgstr "CHYBY ČTENÍ" +#: src/reuse/cli/annotate.py:370 +#, fuzzy +msgid "Force single-line comment style." +msgstr "vynutit jednořádkový styl komentáře, nepovinné" -#: src/reuse/lint.py:85 -msgid "Could not read:" -msgstr "Nelze načíst:" +#: src/reuse/cli/annotate.py:377 +#, fuzzy +msgid "Force multi-line comment style." +msgstr "vynutit víceřádkový styl komentáře, nepovinné" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" -msgstr "CHYBĚJÍCÍ INFORMACE O AUTORSKÝCH PRÁVECH A LICENCÍCH" +#: src/reuse/cli/annotate.py:383 +#, fuzzy +msgid "Add headers to all files under specified directories recursively." +msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" -msgstr "" -"Následující soubory neobsahují žádné informace o autorských právech a " -"licencích:" +#: src/reuse/cli/annotate.py:388 +#, fuzzy +msgid "Do not replace the first header in the file; just add a new one." +msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" -msgstr "Následující soubory nemají žádné informace o autorských právech:" +#: src/reuse/cli/annotate.py:395 +#, fuzzy +msgid "Always write a .license file instead of a header inside the file." +msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" -msgstr "Následující soubory neobsahují žádné licenční informace:" +#: src/reuse/cli/annotate.py:402 +#, fuzzy +msgid "Write a .license file to files with unrecognised comment styles." +msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" -#: src/reuse/lint.py:140 -msgid "SUMMARY" -msgstr "SHRNUTÍ" +#: src/reuse/cli/annotate.py:409 +#, fuzzy +msgid "Skip files with unrecognised comment styles." +msgstr "přeskočit soubory s nerozpoznanými styly komentářů" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" -msgstr "Neplatné licence:" +#: src/reuse/cli/annotate.py:420 +#, fuzzy +msgid "Skip files that already contain REUSE information." +msgstr "přeskočit soubory, které již obsahují informace REUSE" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" -msgstr "Zastaralé licence:" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" +msgstr "" -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" -msgstr "Licence bez přípony souboru:" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" -msgstr "Chybějící licence:" +#: src/reuse/cli/common.py:58 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" +msgstr "" +"'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové hlášení: " +"{message}" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Nepoužité licence:" +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" +msgstr "" -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Použité licence:" +#: src/reuse/cli/common.py:114 +#, fuzzy +msgid "'{}' is not a valid SPDX expression." +msgstr "'{}' není platný výraz SPDX, přeruší se" -#: src/reuse/lint.py:153 -msgid "Read errors:" -msgstr "Chyby čtení:" +#: src/reuse/cli/convert_dep5.py:19 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" -#: src/reuse/lint.py:155 -msgid "Files with copyright information:" -msgstr "Soubory s informacemi o autorských právech:" +#: src/reuse/cli/convert_dep5.py:31 +#, fuzzy +msgid "No '.reuse/dep5' file." +msgstr "žádný soubor '.reuse/dep5'" -#: src/reuse/lint.py:159 -msgid "Files with license information:" -msgstr "Soubory s licenčními informacemi:" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' není platný identifikátor licence SPDX." -#: src/reuse/lint.py:176 -msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" -msgstr "Gratulujeme! Váš projekt je v souladu s verzí {} specifikace REUSE :-)" +#: src/reuse/cli/download.py:59 +#, fuzzy +msgid "Did you mean:" +msgstr "Měl jste na mysli:" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:66 msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" -msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-(" - -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" -msgstr "DOPORUČENÍ" +"See for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Seznam platných identifikátorů licence SPDX naleznete na adrese ." -#: src/reuse/lint.py:254 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: chybí licence {lic}\n" +msgid "Error: {spdx_identifier} already exists." +msgstr "Chyba: {spdx_identifier} již existuje." -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: chyba čtení\n" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Chyba: {path} neexistuje." -#: src/reuse/lint.py:263 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: žádný identifikátor licence\n" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Chyba: Nepodařilo se stáhnout licenci." -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: žádné upozornění na autorská práva\n" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Funguje vaše internetové připojení?" -#: src/reuse/lint.py:294 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: bad license {lic}\n" -msgstr "{path}: špatná licence {lic}\n" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Úspěšně stažen {spdx_identifier}." -#: src/reuse/lint.py:301 -#, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "{lic_path}: zastaralá licence\n" +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." -#: src/reuse/lint.py:308 -#, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "{lic_path}: licence bez přípony souboru\n" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "{lic_path}: nepoužitá licence\n" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "stáhnout všechny chybějící licence zjištěné v projektu" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' zahrnuto v {global_path}" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/download.py:136 +#, fuzzy msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." -msgstr "'{path}' je zahrnuta výhradně v REUSE.toml. Nečte obsah souboru." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." +msgstr "" +"zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " +"který soubor obsahuje, nebo samotný soubor" + +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "NEVHODNÉ LICENCE" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "volby --single-line a --multi-line se vzájemně vylučují" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "nelze použít --output s více než jednou licencí" -#: src/reuse/project.py:275 +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"'{path}' byl rozpoznán jako binární soubor; v jeho obsahu nebyly hledány " -"informace o REUSE." -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -"'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor REUSE." -"toml. Pro konverzi použijte `reuse convert-dep5`." -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -"Nalezeno '{new_path}' i '{old_path}'. Oba soubory nelze uchovávat současně, " -"nejsou vzájemně kompatibilní." -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "určující identifikátor '{path}'" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Jaká je internetová adresa projektu?" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} nemá příponu souboru" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"Nepodařilo se přeložit identifikátor licence SPDX {path}, přeloženo na " -"{identifier}. Zkontrolujte, zda je licence v seznamu licencí nalezeném na " -"adrese nebo zda začíná znakem 'LicenseRef-' a " -"zda má příponu souboru." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -"{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"Následující soubory neobsahují žádné informace o autorských právech a " +"licencích:" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "brání výstupu" + +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "formátuje výstup jako JSON" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "formátuje výstup jako prostý text (výchozí)" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "formátuje výstup jako chyby na řádek" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -"projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný software " -"VCS" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Nepodařilo se načíst '{path}'" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "formátuje výstup jako chyby na řádek (výchozí)" -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" + +#: src/reuse/cli/lint_file.py:64 +#, fuzzy, python-brace-format +msgid "'{file}' is not inside of '{root}'." +msgstr "'{file}' není uvnitř '{root}'" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: chyba: %(message)s\n" + +#: src/reuse/cli/main.py:40 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Oprava špatných licencí: Alespoň jedna licence v adresáři LICENSES a/nebo " -"poskytnutá pomocí značek 'SPDX-License-Identifier' je neplatná. Nejsou to " -"platné identifikátory licencí SPDX nebo nezačínají znakem 'LicenseRef-'. " -"Často kladené otázky o vlastních licencích: https://reuse.software/faq/" -"#custom-license" - -#: src/reuse/report.py:519 +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" + +#: src/reuse/cli/main.py:47 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " -msgstr "" -"Oprava zastaralých licencí: Alespoň jedna z licencí v adresáři LICENSES a/" -"nebo poskytnutých pomocí tagu 'SPDX-License-Identifier' nebo v souboru '." -"reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " -"nové identifikátory naleznete zde: " - -#: src/reuse/report.py:530 +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -"Oprava licencí bez přípony souboru: Nejméně jeden textový soubor licence v " -"adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím způsobem " -"přejmenujte." -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:62 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." -msgstr "" -"Oprava chybějících licencí: V adresáři 'LICENSES' není k dispozici " -"odpovídající textový soubor s licencí pro alespoň jeden z identifikátorů " -"licencí poskytovaných pomocí značek 'SPDX-License-Identifier'. Pro " -"identifikátory licencí SPDX můžete jednoduše spustit příkaz 'reuse download " -"--all' a získat všechny chybějící. Pro vlastní licence (začínající na " -"'LicenseRef-') musíte tyto soubory přidat sami." - -#: src/reuse/report.py:551 +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse je nástrojem pro dodržování doporučení REUSE. Další informace " +"naleznete na adrese a online dokumentaci na adrese " +"." + +#: src/reuse/cli/main.py:69 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." -msgstr "" -"Oprava nepoužívaných licencí: Alespoň jeden z textových souborů licencí v " -"'LICENSES' není odkazován žádným souborem, např. značkou 'SPDX-License-" -"Identifier'. Ujistěte se, že jste odpovídajícím způsobem licencované soubory " -"buď správně označili, nebo nepoužitý licenční text odstranili, pokud jste si " -"jisti, že žádný soubor nebo kousek kódu není takto licencován." - -#: src/reuse/report.py:562 +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Podpořte činnost FSFE:" + +#: src/reuse/cli/main.py:78 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" -"Oprava chyb čtení: Nástroj nemůže přečíst alespoň jeden ze souborů v " -"adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v horní " -"části výstupu jako součást zaznamenaných chybových hlášení." +"Dary jsou pro naši sílu a nezávislost zásadní. Umožňují nám pokračovat v " +"práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " +"možnost přispět na ." -#: src/reuse/report.py:571 +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "povolit příkazy pro ladění" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "skrýt varování o zastarání" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "nepřeskakovat submoduly systému Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "nepřeskakovat podprojekty Meson" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "nepoužívat multiprocessing" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "definovat kořen projektu" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" + +#: src/reuse/cli/spdx.py:33 +#, fuzzy +msgid "File to write to." +msgstr "soubory do lint" + +#: src/reuse/cli/spdx.py:39 +#, fuzzy msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Oprava chybějících informací o autorských právech/licencích: U jednoho nebo " -"více souborů nemůže nástroj najít informace o autorských právech a/nebo " -"licenční informace. To obvykle provedete přidáním značek 'SPDX-" -"FileCopyrightText' a 'SPDX-License-Identifier' ke každému souboru. V návodu " -"jsou vysvětleny další způsoby, jak to provést: " +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" +"vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " +"zaručit, že pole bude přesné" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "jméno osoby podepisující zprávu SPDX" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "název organizace, která podepsala zprávu SPDX" + +#: src/reuse/cli/spdx.py:82 +#, fuzzy +msgid "" +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." +msgstr "" +"chyba: --creator-person=NAME nebo --creator-organization=NAME je vyžadováno " +"při zadání parametru --add-licence-concluded" + +#: src/reuse/cli/spdx.py:97 +#, python-brace-format +msgid "" +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"'{path}' neodpovídá běžnému vzoru souboru SPDX. Navrhované konvence pro " +"pojmenování najdete zde: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "seznam všech podporovaných licencí SPDX" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -528,11 +626,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: chyba: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -736,164 +829,366 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Přeskočen nerozpoznaný soubor '{path}'" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' není rozpoznán; vytváří se '{path}.license'" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Přeskočený soubor '{path}' již obsahuje informace REUSE" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" -#~ "line" +#~ "Chyba: Chybí řádky s autorskými právy nebo licenční výrazy v generovaném " +#~ "záhlaví komentáře pro '{path}'. Šablona je pravděpodobně nesprávná. " +#~ "Nepodařilo se zapsat novou hlavičku." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Úspěšně změněna hlavička {path}" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Nepodařilo se analyzovat '{expression}'" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" +#~ "'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" -#~ msgid "--skip-unrecognised has no effect when used together with --style" +#, python-brace-format +#~ msgid "" +#~ "{attr_name} must be a {type_name} (got {value} that is a {value_class})." #~ msgstr "" -#~ "--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" +#~ "{attr_name} musí být {type_name} (mít {value}, který je {value_class})." -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "je vyžadována možnost --contributor, --copyright nebo --license" +#, python-brace-format +#~ msgid "" +#~ "Item in {attr_name} collection must be a {type_name} (got {item_value} " +#~ "that is a {item_class})." +#~ msgstr "" +#~ "Položka v kolekci {attr_name} musí být {type_name} (mít {item_value}, " +#~ "která je {item_class})." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "šablonu {template} se nepodařilo najít" +#~ msgid "{attr_name} must not be empty." +#~ msgstr "{attr_name} nesmí být prázdný." -#~ msgid "can't write to '{}'" -#~ msgstr "nelze zapisovat do '{}'" +#, python-brace-format +#~ msgid "{name} must be a {type} (got {value} that is a {value_type})." +#~ msgstr "{name} musí být {type} (má {value}, která je {value_type})." +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "The value of 'precedence' must be one of {precedence_vals} (got " +#~ "{received})" #~ msgstr "" -#~ "Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" -#~ "dot-license, --fallback-dot-license nebo --skip-unrecognised:" +#~ "Hodnota 'precedence' musí být jedna z {precedence_vals} (got {received})" + +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " +#~ "výrazy" + +#~ msgid "'{}' found in:" +#~ msgstr "'{}' nalezeno v:" + +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "ZASTARALÉ LICENCE" + +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Následující licence jsou v SPDX zrušeny:" + +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENCE BEZ KONCOVKY SOUBORU" + +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Následující licence nemají příponu souboru:" + +#~ msgid "MISSING LICENSES" +#~ msgstr "CHYBĚJÍCÍ LICENCE" + +#~ msgid "UNUSED LICENSES" +#~ msgstr "NEPOUŽITÉ LICENCE" + +#~ msgid "The following licenses are not used:" +#~ msgstr "Následující licence nejsou používány:" + +#~ msgid "READ ERRORS" +#~ msgstr "CHYBY ČTENÍ" + +#~ msgid "Could not read:" +#~ msgstr "Nelze načíst:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "CHYBĚJÍCÍ INFORMACE O AUTORSKÝCH PRÁVECH A LICENCÍCH" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Následující soubory nemají žádné informace o autorských právech:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Následující soubory neobsahují žádné licenční informace:" + +#~ msgid "SUMMARY" +#~ msgstr "SHRNUTÍ" + +#~ msgid "Bad licenses:" +#~ msgstr "Neplatné licence:" -#~ msgid "copyright statement, repeatable" -#~ msgstr "prohlášení o autorských právech, opakovatelné" +#~ msgid "Deprecated licenses:" +#~ msgstr "Zastaralé licence:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identifikátor SPDX, opakovatelný" +#~ msgid "Licenses without file extension:" +#~ msgstr "Licence bez přípony souboru:" -#~ msgid "file contributor, repeatable" -#~ msgstr "přispěvatel souboru, opakovatelný" +#~ msgid "Missing licenses:" +#~ msgstr "Chybějící licence:" -#~ msgid "year of copyright statement, optional" -#~ msgstr "rok vydání prohlášení o autorských právech, nepovinné" +#~ msgid "Unused licenses:" +#~ msgstr "Nepoužité licence:" -#~ msgid "comment style to use, optional" -#~ msgstr "styl komentáře, který se má použít, nepovinné" +#~ msgid "Used licenses:" +#~ msgstr "Použité licence:" -#~ msgid "copyright prefix to use, optional" -#~ msgstr "předpona autorských práv, která se má použít, nepovinné" +#~ msgid "Read errors:" +#~ msgstr "Chyby čtení:" -#~ msgid "name of template to use, optional" -#~ msgstr "název šablony, která se má použít, nepovinné" +#~ msgid "Files with copyright information:" +#~ msgstr "Soubory s informacemi o autorských právech:" -#~ msgid "do not include year in statement" -#~ msgstr "neuvádět rok v prohlášení" +#~ msgid "Files with license information:" +#~ msgstr "Soubory s licenčními informacemi:" -#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských " -#~ "právech totožná" +#~ "Gratulujeme! Váš projekt je v souladu s verzí {} specifikace REUSE :-)" + +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" +#~ msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-(" -#~ msgid "force single-line comment style, optional" -#~ msgstr "vynutit jednořádkový styl komentáře, nepovinné" +#~ msgid "RECOMMENDATIONS" +#~ msgstr "DOPORUČENÍ" + +#, python-brace-format +#~ msgid "{path}: missing license {lic}\n" +#~ msgstr "{path}: chybí licence {lic}\n" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "vynutit víceřádkový styl komentáře, nepovinné" +#, python-brace-format +#~ msgid "{path}: read error\n" +#~ msgstr "{path}: chyba čtení\n" -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" +#, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "{path}: žádný identifikátor licence\n" -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" +#, python-brace-format +#~ msgid "{path}: no copyright notice\n" +#~ msgstr "{path}: žádné upozornění na autorská práva\n" -#~ msgid "always write a .license file instead of a header inside the file" -#~ msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" +#, python-brace-format +#~ msgid "{path}: bad license {lic}\n" +#~ msgstr "{path}: špatná licence {lic}\n" -#~ msgid "write a .license file to files with unrecognised comment styles" -#~ msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" +#, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "{lic_path}: zastaralá licence\n" + +#, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "{lic_path}: licence bez přípony souboru\n" + +#, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "{lic_path}: nepoužitá licence\n" + +#, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' zahrnuto v {global_path}" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' is covered exclusively by REUSE.toml. Not reading the file " +#~ "contents." +#~ msgstr "'{path}' je zahrnuta výhradně v REUSE.toml. Nečte obsah souboru." -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "přeskočit soubory s nerozpoznanými styly komentářů" +#, python-brace-format +#~ msgid "" +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." +#~ msgstr "" +#~ "'{path}' byl rozpoznán jako binární soubor; v jeho obsahu nebyly hledány " +#~ "informace o REUSE." -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "přeskočit soubory, které již obsahují informace REUSE" +#~ msgid "" +#~ "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE." +#~ "toml. Use `reuse convert-dep5` to convert." +#~ msgstr "" +#~ "'.reuse/dep5' je zastaralý. Místo toho doporučujeme používat soubor REUSE." +#~ "toml. Pro konverzi použijte `reuse convert-dep5`." #, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "Found both '{new_path}' and '{old_path}'. You cannot keep both files " +#~ "simultaneously; they are not intercompatible." #~ msgstr "" -#~ "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" +#~ "Nalezeno '{new_path}' i '{old_path}'. Oba soubory nelze uchovávat " +#~ "současně, nejsou vzájemně kompatibilní." -#~ msgid "prevents output" -#~ msgstr "brání výstupu" +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "určující identifikátor '{path}'" -#~ msgid "formats output as errors per line (default)" -#~ msgstr "formátuje výstup jako chyby na řádek (výchozí)" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} nemá příponu souboru" -#~ msgid "files to lint" -#~ msgstr "soubory do lint" +#, python-brace-format +#~ msgid "" +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." +#~ msgstr "" +#~ "Nepodařilo se přeložit identifikátor licence SPDX {path}, přeloženo na " +#~ "{identifier}. Zkontrolujte, zda je licence v seznamu licencí nalezeném na " +#~ "adrese nebo zda začíná znakem 'LicenseRef-' " +#~ "a zda má příponu souboru." #, python-brace-format -#~ msgid "'{file}' is not inside of '{root}'" -#~ msgstr "'{file}' není uvnitř '{root}'" +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" #~ msgstr "" -#~ "reuse je nástrojem pro dodržování doporučení REUSE. Další informace " -#~ "naleznete na adrese a online dokumentaci na " -#~ "adrese ." +#~ "projekt '{}' není úložištěm VCS nebo není nainstalován požadovaný " +#~ "software VCS" + +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Nepodařilo se načíst '{path}'" + +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." -#~ msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" +#~ msgstr "" +#~ "Oprava špatných licencí: Alespoň jedna licence v adresáři LICENSES a/nebo " +#~ "poskytnutá pomocí značek 'SPDX-License-Identifier' je neplatná. Nejsou to " +#~ "platné identifikátory licencí SPDX nebo nezačínají znakem 'LicenseRef-'. " +#~ "Často kladené otázky o vlastních licencích: https://reuse.software/faq/" +#~ "#custom-license" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Podpořte činnost FSFE:" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Oprava zastaralých licencí: Alespoň jedna z licencí v adresáři LICENSES a/" +#~ "nebo poskytnutých pomocí tagu 'SPDX-License-Identifier' nebo v souboru '." +#~ "reuse/dep5' byla v SPDX zastaralá. Aktuální seznam a příslušné doporučené " +#~ "nové identifikátory naleznete zde: " #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." #~ msgstr "" -#~ "Dary jsou pro naši sílu a nezávislost zásadní. Umožňují nám pokračovat v " -#~ "práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " -#~ "možnost přispět na ." +#~ "Oprava licencí bez přípony souboru: Nejméně jeden textový soubor licence " +#~ "v adresáři 'LICENSES' nemá příponu '.txt'. Soubor(y) odpovídajícím " +#~ "způsobem přejmenujte." -#~ msgid "enable debug statements" -#~ msgstr "povolit příkazy pro ladění" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Oprava chybějících licencí: V adresáři 'LICENSES' není k dispozici " +#~ "odpovídající textový soubor s licencí pro alespoň jeden z identifikátorů " +#~ "licencí poskytovaných pomocí značek 'SPDX-License-Identifier'. Pro " +#~ "identifikátory licencí SPDX můžete jednoduše spustit příkaz 'reuse " +#~ "download --all' a získat všechny chybějící. Pro vlastní licence " +#~ "(začínající na 'LicenseRef-') musíte tyto soubory přidat sami." -#~ msgid "hide deprecation warnings" -#~ msgstr "skrýt varování o zastarání" +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." +#~ msgstr "" +#~ "Oprava nepoužívaných licencí: Alespoň jeden z textových souborů licencí v " +#~ "'LICENSES' není odkazován žádným souborem, např. značkou 'SPDX-License-" +#~ "Identifier'. Ujistěte se, že jste odpovídajícím způsobem licencované " +#~ "soubory buď správně označili, nebo nepoužitý licenční text odstranili, " +#~ "pokud jste si jisti, že žádný soubor nebo kousek kódu není takto " +#~ "licencován." -#~ msgid "do not skip over Git submodules" -#~ msgstr "nepřeskakovat submoduly systému Git" +#~ msgid "" +#~ "Fix read errors: At least one of the files in your directory cannot be " +#~ "read by the tool. Please check the file permissions. You will find the " +#~ "affected files at the top of the output as part of the logged error " +#~ "messages." +#~ msgstr "" +#~ "Oprava chyb čtení: Nástroj nemůže přečíst alespoň jeden ze souborů v " +#~ "adresáři. Zkontrolujte oprávnění souboru. Postižené soubory najdete v " +#~ "horní části výstupu jako součást zaznamenaných chybových hlášení." -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "nepřeskakovat podprojekty Meson" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Oprava chybějících informací o autorských právech/licencích: U jednoho " +#~ "nebo více souborů nemůže nástroj najít informace o autorských právech a/" +#~ "nebo licenční informace. To obvykle provedete přidáním značek 'SPDX-" +#~ "FileCopyrightText' a 'SPDX-License-Identifier' ke každému souboru. V " +#~ "návodu jsou vysvětleny další způsoby, jak to provést: " -#~ msgid "do not use multiprocessing" -#~ msgstr "nepoužívat multiprocessing" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" -#~ msgid "define root of project" -#~ msgstr "definovat kořen projektu" +#~ msgid "can't write to '{}'" +#~ msgstr "nelze zapisovat do '{}'" #~ msgid "show program's version number and exit" #~ msgstr "zobrazit číslo verze programu a ukončit jej" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "přidání autorských práv a licencí do záhlaví souborů" - #~ msgid "" #~ "Add copyright and licensing into the header of one or more files.\n" #~ "\n" @@ -914,9 +1209,6 @@ msgstr[2] "" #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Stáhněte si licenci a umístěte ji do adresáře LICENSES/." - #~ msgid "list all non-compliant files" #~ msgstr "seznam všech nevyhovujících souborů" @@ -966,27 +1258,12 @@ msgstr[2] "" #~ msgid "list non-compliant files from specified list of files" #~ msgstr "seznam nevyhovujících souborů ze zadaného seznamu souborů" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "seznam všech podporovaných licencí SPDX" - #~ msgid "convert .reuse/dep5 to REUSE.toml" #~ msgstr "Převeďte .reuse/dep5 do REUSE.toml" -#, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{path}' se nepodařilo zpracovat. Obdrželi jsme následující chybové " -#~ "hlášení: {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' není soubor" @@ -999,97 +1276,15 @@ msgstr[2] "" #~ msgid "can't read or write '{}'" #~ msgstr "nelze číst ani zapisovat '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' není platný výraz SPDX, přeruší se" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' není platný identifikátor licence SPDX." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Seznam platných identifikátorů licence SPDX naleznete na adrese ." - -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "žádný soubor '.reuse/dep5'" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Licence SPDX Identifikátor licence" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "stáhnout všechny chybějící licence zjištěné v projektu" - -#~ msgid "" -#~ "source from which to copy custom LicenseRef- licenses, either a directory " -#~ "that contains the file or the file itself" -#~ msgstr "" -#~ "zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " -#~ "který soubor obsahuje, nebo samotný soubor" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Chyba: {spdx_identifier} již existuje." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Chyba: Nepodařilo se stáhnout licenci." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Funguje vaše internetové připojení?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Úspěšně stažen {spdx_identifier}." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output nemá žádný účinek, pokud se použije společně s --all" #~ msgid "the following arguments are required: license" #~ msgstr "jsou vyžadovány tyto argumenty: licence" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "nelze použít --output s více než jednou licencí" - -#~ msgid "formats output as JSON" -#~ msgstr "formátuje výstup jako JSON" - -#~ msgid "formats output as plain text (default)" -#~ msgstr "formátuje výstup jako prostý text (výchozí)" - -#~ msgid "formats output as errors per line" -#~ msgstr "formátuje výstup jako chyby na řádek" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " -#~ "zaručit, že pole bude přesné" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "jméno osoby podepisující zprávu SPDX" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "název organizace, která podepsala zprávu SPDX" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "chyba: --creator-person=NAME nebo --creator-organization=NAME je " -#~ "vyžadováno při zadání parametru --add-licence-concluded" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "'{path}' neodpovídá běžnému vzoru souboru SPDX. Navrhované konvence pro " -#~ "pojmenování najdete zde: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "použití: " @@ -1227,9 +1422,6 @@ msgstr[2] "" #~ msgid "What is the name of the project?" #~ msgstr "Jaký je název projektu?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Jaká je internetová adresa projektu?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Jak se jmenuje správce?" @@ -1348,9 +1540,6 @@ msgstr[2] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "volby --exclude-year a --year se vzájemně vylučují" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "volby --single-line a --multi-line se vzájemně vylučují" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license bylo zrušeno ve prospěch --force-dot-license" diff --git a/po/de.po b/po/de.po index d9d4289f9..671180f6f 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German for a list of valid SPDX License " +"Identifiers." msgstr "" -"Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" -"Spezifikation :-)" +"Besuchen Sie für eine Liste von gültigen SPDX-" +"Lizenz-Identifikatoren." + +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Fehler: {spdx_identifier} existiert bereits." + +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Fehler: {path} existiert nicht." + +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Funktioniert Ihre Internetverbindung?" + +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "{spdx_identifier} erfolgreich heruntergeladen." -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:106 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" + +#: src/reuse/cli/download.py:109 msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." msgstr "" -"Leider ist Ihr Projekt nicht konform mit Version {} der REUSE-" -"Spezifikation :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" -msgstr "EMPFEHLUNGEN" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/download.py:136 +msgid "" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "FALSCHE LIZENZEN" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." msgstr "" +"Die Optionen --single-line und --multi-line schließen sich gegenseitig aus" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" -#: src/reuse/lint.py:294 +#: src/reuse/cli/lint.py:27 #, python-brace-format -msgid "{path}: bad license {lic}\n" +msgid "" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Veraltete Lizenzen:" - -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Lizenzen ohne Dateiendung:" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Unbenutzte Lizenzen:" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' abgedeckt durch .reuse/dep5" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Was ist die Internetadresse des Projekts?" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/lint.py:43 msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/project.py:275 -#, fuzzy, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"'{path}' wurde als binäre Datei erkannt oder ihre Erweiterung ist als " -"unkommentierbar gekennzeichnet; suche ihre Inhalte nicht nach REUSE-" -"Informationen." -#: src/reuse/project.py:336 +#: src/reuse/cli/lint.py:53 msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "erkenne Identifikator von '{path}'" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"Die folgenden Dateien haben keine Urheberrechts- und Lizenzinformationen:" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} hat keine Dateiendung" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "Verhindert Ausgabe" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "formatiert Ausgabe als JSON" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "formatiert Ausgabe als rohen Text" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "formatiert Ausgabe als rohen Text" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." +msgstr "" + +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "formatiert Ausgabe als rohen Text" + +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -"Konnte SPDX-Lizenz-Identifikator von {path} nicht erkennen, der auf " -"{identifier} verweist. Stellen Sie sicher, dass die Lizenz in der " -"Lizenzliste unter steht oder mit 'LicenseRef-' " -"beginnt und eine Dateiendung hat." -#: src/reuse/project.py:446 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +msgid "'{file}' is not inside of '{root}'." msgstr "" -"{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: Fehler: %(message)s\n" + +#: src/reuse/cli/main.py:40 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " -"nicht installiert" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Konnte '{path}' nicht lesen" - -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" +#: src/reuse/cli/main.py:47 +msgid "" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:54 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Korrektur ungültiger Lizenzen: Mindestens eine Lizenz im LICENSES-" -"Verzeichnis, und/oder die per 'SPDX-License-Identifier' angegeben wird, ist " -"ungültig. Sie sind entweder keine gültigen SPDX-Lizenz-Identifikatoren oder " -"beginnen nicht mit 'LicenseRef-'. FAQ zu benutzerdefinierten Lizenzen: " -"https://reuse.software/faq/#custom-license" - -#: src/reuse/report.py:519 +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." +msgstr "" + +#: src/reuse/cli/main.py:62 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " -msgstr "" -"Korrektur veralteter Lizenzen: Mindestens eine der Lizenzen im LICENSES-" -"Verzeichnis und/oder die per 'SPDX-License-Identifier'-Kennzeichnung oder in " -"'.reuse/dep5' angegeben ist wurde von SPDX als veraltet markiert. Die " -"aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " -"hier: " - -#: src/reuse/report.py:530 +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse ist ein Werkzeug, um die Empfehlungen von REUSE umzusetzen und zu " +"überprüfen. Mehr Informationen finden Sie auf oder " +"in der Online-Dokumentation auf ." + +#: src/reuse/cli/main.py:69 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" -"Korrektur von Lizenzen ohne Dateierweiterung: Mindestens eine " -"Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-Dateierweiterung. " -"Bitte benennen Sie die Datei(en) entsprechend um." +"Diese Version von reuse ist kompatibel mit Version {} der REUSE-" +"Spezifikation." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Die Arbeit der FSFE unterstützen:" -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:78 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." -msgstr "" -"Korrektur fehlender Lizenzen: Für mindestens eine der durch die 'SPDX-" -"License-Identifier' angegebenen Lizenzkennzeichen gibt es im Verzeichnis " -"'LICENSES' keine entsprechende Lizenztextdatei. Für SPDX-Lizenz-" -"Identifikatoren können Sie einfach 'reuse download --all' ausführen, um " -"fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " -"'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." - -#: src/reuse/report.py:551 +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." +msgstr "" +"Spenden sind entscheidend für unsere Leistungsfähigkeit und Autonomie. Sie " +"ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo immer es " +"nötig ist. Bitte erwägen Sie eine Spende unter ." + +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "Debug-Statements aktivieren" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "„Veraltet“-Warnung verbergen" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "Git-Submodules nicht überspringen" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "Meson-Teilprojekte nicht überspringen" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "kein Multiprocessing verwenden" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "Stammverzeichnis des Projekts bestimmen" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "Komponentenliste im SPDX-Format ausgeben" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." +msgstr "" + +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." -msgstr "" -"Korrektur ungenutzter Lizenzen: Mindestens eine der Lizenztextdateien in " -"'LICENSES' wird von keiner Datei referenziert, z.B. durch einen 'SPDX-" -"License-Identifier'-Eintrag. Bitte stellen Sie sicher, dass Sie entweder die " -"entsprechend lizenzierten Dateien korrekt markieren oder den ungenutzten " -"Lizenztext löschen, wenn Sie sicher sind, dass keine Datei oder Code-" -"Schnipsel darunter lizenziert ist." - -#: src/reuse/report.py:562 +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" + +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Korrigiere fehlende Copyright-/Lizenzinformationen: In einer oder mehreren " -"Dateien fehlen Copyright- und/oder Lizenzinformationen. Typischerweise kann " -"das korrigiert werden, indem die 'SPDX-FileCopyrightText'- und 'SPDX-License-" -"Identifier'-Tags den Dateien hinzugefügt werden. Das Tutorial erklärt " -"weitere Wege das zu erreichen: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "Listet alle unterstützten SPDX-Lizenzen auf" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -519,11 +602,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: Fehler: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -722,143 +800,288 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" -#, fuzzy -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Fehler: Kann kein Kommentar für '{path}' erstellen" -#~ msgid "option --contributor, --copyright or --license is required" +#, python-brace-format +#~ msgid "" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "Die Option --contributor, --copyright oder --license ist erforderlich" +#~ "Fehler: Die generierten Kommentar-Kopfzeilen für '{path}' enthalten " +#~ "fehlende Urheberrechtszeilen oder Lizenzausdrücke. Die Vorlage ist " +#~ "wahrscheinlich falsch. Keine neuen Kopfzeile geschrieben." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "Vorlage {template} konnte nicht gefunden werden" +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Kopfzeilen von {path} erfolgreich geändert" -#~ msgid "can't write to '{}'" -#~ msgstr "kann nicht in '{}' schreiben" +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Kann '{expression}' nicht parsen" -#, fuzzy +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' hat keine erkannte Dateiendung, bitte verwenden Sie --style oder " -#~ "--explicit-license" +#~ "'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " +#~ "Überspringe Datei" -#~ msgid "copyright statement, repeatable" -#~ msgstr "Urheberrechtsinformation, wiederholbar" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder " +#~ "Lizenzausdrücke" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX-Lizenz-Identifikator, wiederholbar" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' gefunden in:" -#~ msgid "file contributor, repeatable" -#~ msgstr "Dateimitwirkender, wiederholbar" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "VERALTETE LIZENZEN" -#~ msgid "year of copyright statement, optional" -#~ msgstr "Jahr der Urheberrechtsinformation, optional" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "" +#~ "Die folgenden Lizenzen wurden von SPDX als veraltetet gekennzeichnet:" -#~ msgid "comment style to use, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LIZENZEN OHNE DATEIENDUNG" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Die folgenden Lizenzen haben keine Dateiendung:" -#~ msgid "name of template to use, optional" -#~ msgstr "Name der zu verwendenden Vorlage, optional" +#~ msgid "MISSING LICENSES" +#~ msgstr "FEHLENDE LIZENZEN" -#~ msgid "do not include year in statement" -#~ msgstr "füge kein Jahr in Angabe hinzu" +#~ msgid "UNUSED LICENSES" +#~ msgstr "NICHT VERWENDETE LIZENZEN" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "Jahr der Urheberrechtsinformation, optional" +#~ msgid "The following licenses are not used:" +#~ msgstr "Die folgenden Lizenzen werden nicht benutzt:" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "READ ERRORS" +#~ msgstr "LESEFEHLER" + +#~ msgid "Could not read:" +#~ msgstr "Unlesbar:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "FEHLENDE URHEBERRECHTS- UND LIZENZINFORMATIONEN" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Die folgenden Dateien haben keine Urheberrechtsinformationen:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Die folgenden Dateien haben keine Lizenzinformationen:" + +#~ msgid "SUMMARY" +#~ msgstr "ZUSAMMENFASSUNG" + +#~ msgid "Bad licenses:" +#~ msgstr "Falsche Lizenzen:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Veraltete Lizenzen:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Lizenzen ohne Dateiendung:" + +#~ msgid "Missing licenses:" +#~ msgstr "Fehlende Lizenzen:" + +#~ msgid "Unused licenses:" +#~ msgstr "Unbenutzte Lizenzen:" + +#~ msgid "Used licenses:" +#~ msgstr "Verwendete Lizenzen:" + +#~ msgid "Read errors:" +#~ msgstr "Lesefehler:" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "Files with copyright information:" +#~ msgstr "Dateien mit Urheberrechtsinformationen:" #, fuzzy -#~ msgid "skip files that already contain REUSE information" +#~ msgid "Files with license information:" #~ msgstr "Dateien mit Lizenzinformationen:" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "'{path}' ist im Binärformat, benutze daher '{new_path}' für die Kopfzeilen" +#~ "Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" +#~ "Spezifikation :-)" -#~ msgid "prevents output" -#~ msgstr "Verhindert Ausgabe" +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" +#~ msgstr "" +#~ "Leider ist Ihr Projekt nicht konform mit Version {} der REUSE-" +#~ "Spezifikation :-(" -#, fuzzy -#~ msgid "formats output as errors per line (default)" -#~ msgstr "formatiert Ausgabe als rohen Text" +#~ msgid "RECOMMENDATIONS" +#~ msgstr "EMPFEHLUNGEN" +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Veraltete Lizenzen:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Lizenzen ohne Dateiendung:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Unbenutzte Lizenzen:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' abgedeckt durch .reuse/dep5" + +#, fuzzy, python-brace-format #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." #~ msgstr "" -#~ "reuse ist ein Werkzeug, um die Empfehlungen von REUSE umzusetzen und zu " -#~ "überprüfen. Mehr Informationen finden Sie auf " -#~ "oder in der Online-Dokumentation auf ." +#~ "'{path}' wurde als binäre Datei erkannt oder ihre Erweiterung ist als " +#~ "unkommentierbar gekennzeichnet; suche ihre Inhalte nicht nach REUSE-" +#~ "Informationen." +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "erkenne Identifikator von '{path}'" + +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} hat keine Dateiendung" + +#, python-brace-format #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" -#~ "Spezifikation." - -#~ msgid "Support the FSFE's work:" -#~ msgstr "Die Arbeit der FSFE unterstützen:" +#~ "Konnte SPDX-Lizenz-Identifikator von {path} nicht erkennen, der auf " +#~ "{identifier} verweist. Stellen Sie sicher, dass die Lizenz in der " +#~ "Lizenzliste unter steht oder mit " +#~ "'LicenseRef-' beginnt und eine Dateiendung hat." +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" #~ msgstr "" -#~ "Spenden sind entscheidend für unsere Leistungsfähigkeit und Autonomie. " -#~ "Sie ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo " -#~ "immer es nötig ist. Bitte erwägen Sie eine Spende unter ." +#~ "{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#~ msgid "enable debug statements" -#~ msgstr "Debug-Statements aktivieren" +#~ msgid "" +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" +#~ msgstr "" +#~ "Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " +#~ "nicht installiert" -#~ msgid "hide deprecation warnings" -#~ msgstr "„Veraltet“-Warnung verbergen" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Konnte '{path}' nicht lesen" -#~ msgid "do not skip over Git submodules" -#~ msgstr "Git-Submodules nicht überspringen" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "Meson-Teilprojekte nicht überspringen" +#~ msgid "" +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" +#~ msgstr "" +#~ "Korrektur ungültiger Lizenzen: Mindestens eine Lizenz im LICENSES-" +#~ "Verzeichnis, und/oder die per 'SPDX-License-Identifier' angegeben wird, " +#~ "ist ungültig. Sie sind entweder keine gültigen SPDX-Lizenz-" +#~ "Identifikatoren oder beginnen nicht mit 'LicenseRef-'. FAQ zu " +#~ "benutzerdefinierten Lizenzen: https://reuse.software/faq/#custom-license" -#~ msgid "do not use multiprocessing" -#~ msgstr "kein Multiprocessing verwenden" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Korrektur veralteter Lizenzen: Mindestens eine der Lizenzen im LICENSES-" +#~ "Verzeichnis und/oder die per 'SPDX-License-Identifier'-Kennzeichnung oder " +#~ "in '.reuse/dep5' angegeben ist wurde von SPDX als veraltet markiert. Die " +#~ "aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " +#~ "hier: " -#~ msgid "define root of project" -#~ msgstr "Stammverzeichnis des Projekts bestimmen" +#~ msgid "" +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." +#~ msgstr "" +#~ "Korrektur von Lizenzen ohne Dateierweiterung: Mindestens eine " +#~ "Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-" +#~ "Dateierweiterung. Bitte benennen Sie die Datei(en) entsprechend um." -#~ msgid "show program's version number and exit" -#~ msgstr "zeige die Versionsnummer des Programms und beende" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Korrektur fehlender Lizenzen: Für mindestens eine der durch die 'SPDX-" +#~ "License-Identifier' angegebenen Lizenzkennzeichen gibt es im Verzeichnis " +#~ "'LICENSES' keine entsprechende Lizenztextdatei. Für SPDX-Lizenz-" +#~ "Identifikatoren können Sie einfach 'reuse download --all' ausführen, um " +#~ "fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " +#~ "'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." -#~ msgid "add copyright and licensing into the header of files" +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." #~ msgstr "" -#~ "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von " -#~ "Dateien" +#~ "Korrektur ungenutzter Lizenzen: Mindestens eine der Lizenztextdateien in " +#~ "'LICENSES' wird von keiner Datei referenziert, z.B. durch einen 'SPDX-" +#~ "License-Identifier'-Eintrag. Bitte stellen Sie sicher, dass Sie entweder " +#~ "die entsprechend lizenzierten Dateien korrekt markieren oder den " +#~ "ungenutzten Lizenztext löschen, wenn Sie sicher sind, dass keine Datei " +#~ "oder Code-Schnipsel darunter lizenziert ist." -#~ msgid "download a license and place it in the LICENSES/ directory" -#~ msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Korrigiere fehlende Copyright-/Lizenzinformationen: In einer oder " +#~ "mehreren Dateien fehlen Copyright- und/oder Lizenzinformationen. " +#~ "Typischerweise kann das korrigiert werden, indem die 'SPDX-" +#~ "FileCopyrightText'- und 'SPDX-License-Identifier'-Tags den Dateien " +#~ "hinzugefügt werden. Das Tutorial erklärt weitere Wege das zu erreichen: " +#~ "" #, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" + +#~ msgid "can't write to '{}'" +#~ msgstr "kann nicht in '{}' schreiben" + +#~ msgid "show program's version number and exit" +#~ msgstr "zeige die Versionsnummer des Programms und beende" + +#~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" #~ msgid "list all non-compliant files" @@ -908,24 +1131,9 @@ msgstr[1] "" #~ "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " #~ "versehen?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "Komponentenliste im SPDX-Format ausgeben" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "Komponentenliste im SPDX-Format ausgeben" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "Listet alle unterstützten SPDX-Lizenzen auf" - -#, fuzzy, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{dep5}' konnte nicht geparst werden. Wir erhielten folgende " -#~ "Fehlermeldung: {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' ist keine Datei" @@ -938,64 +1146,15 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "kann '{}' nicht lesen oder schreiben" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Besuchen Sie für eine Liste von gültigen " -#~ "SPDX-Lizenz-Identifikatoren." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "Erstelle .reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "SPDX-Lizenz-Identifikator der Lizenz" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "" -#~ "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Fehler: {spdx_identifier} existiert bereits." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Funktioniert Ihre Internetverbindung?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "{spdx_identifier} erfolgreich heruntergeladen." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" #~ msgid "the following arguments are required: license" #~ msgstr "Die folgenden Argumente sind erforderlich: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" - -#~ msgid "formats output as JSON" -#~ msgstr "formatiert Ausgabe als JSON" - -#, fuzzy -#~ msgid "formats output as plain text (default)" -#~ msgstr "formatiert Ausgabe als rohen Text" - -#, fuzzy -#~ msgid "formats output as errors per line" -#~ msgstr "formatiert Ausgabe als rohen Text" - #~ msgid "usage: " #~ msgstr "Benutzung: " @@ -1154,9 +1313,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Was ist der Name des Projekts?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Was ist die Internetadresse des Projekts?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Was ist der Name der Betreuenden?" @@ -1287,10 +1443,6 @@ msgstr[1] "" #~ msgstr "" #~ "Die Optionen --exclude-year und --year schließen sich gegenseitig aus" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "" -#~ "Die Optionen --single-line und --multi-line schließen sich gegenseitig aus" - #~ msgid "Downloading {}" #~ msgstr "Lade {} herunter" diff --git a/po/eo.po b/po/eo.po index fb81d1274..6115519a8 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Vidu por listo de validaj SPDX Permesilaj " +"Identigiloj." + +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Eraro: {spdx_identifier} jam ekzistas." + +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "'{path}' ne finiĝas per .spdx" + +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Eraro: Malsukcesis elŝuti permesilon." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Ĉu via retkonekto funkcias?" -#: src/reuse/lint.py:155 +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Sukceses elŝutis {spdx_identifier}." + +#: src/reuse/cli/download.py:106 #, fuzzy -msgid "Files with copyright information:" -msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/lint.py:159 +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" + +#: src/reuse/cli/download.py:122 #, fuzzy -msgid "Files with license information:" -msgstr "Dosieroj sen permesilinformo: {count} / {total}" +msgid "Download all missing licenses detected in the project." +msgstr "elŝuti ĉiujn mankantajn permesilojn kiujn oni eltrovis en la projekto" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" -msgstr "Gratulon! Via projekto konformas al versio {} de la REUSE Specifo :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." +msgstr "" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "MALBONAJ PERMESILOJ" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "ne povas uzi --output kun pli ol unu permesilo" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"Bedaŭrinde, via projekto ne konformas al versio {} de la REUSE Specifo :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Kiu estas la reta adreso de la projekto?" + +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' ne estas valida SPDX Permesila Identigilo." +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" +msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Arĥaikigitaj permesiloj:" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "La sekvaj dosieroj ne havas kopirajtajn kaj permesilajn informojn:" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Permesiloj sen dosiersufikso:" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Neuzataj permesiloj:" +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' sub .reuse/dep5" +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint_file.py:25 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:416 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "precizigante identigilon de '{path}'" +msgid "'{file}' is not inside of '{root}'." +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} ne havas dosiersufikson" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: eraro: %(message)s\n" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/main.py:40 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Ne povis precizigi SPDX Permesila Identigilo de {path}, uzante {identifier}. " -"Certigu ke la permesilo estas en la listo ĉe aŭ " -"ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/main.py:47 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -"{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " -"{other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:54 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Ne povis legi '{path}'" +#: src/reuse/cli/main.py:62 +msgid "" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse estas ilo por konformiĝo al la rekomendoj de REUSE. Vidu por pli da informo, kaj por " +"la reta dokumentado." -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Okazis neanticipita eraro dum analizado de '{path}'" +#: src/reuse/cli/main.py:69 +msgid "" +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Subtenu la laboradon de FSFE:" + +#: src/reuse/cli/main.py:78 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Donacoj estas gravegaj por niaj forto kaj aŭtonomeco. Ili ebligas nin " +"daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " +"pripensi fari donacon ĉe ." -#: src/reuse/report.py:519 -msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "ŝalti sencimigajn ordonojn" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "kaŝi avertojn de evitindaĵoj" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "ne preterpasi Git-submodulojn" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "ne preterpasi Meson-subprojektojn" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "ne uzi plurprocesoradon" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "difini radikon de la projekto" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "presi la pecoliston de la projekto en SPDX-formo" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:530 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." msgstr "" -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:551 -msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" msgstr "" +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" + #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format msgid "{editor}: Editing failed" @@ -479,11 +591,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: eraro: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -682,149 +789,198 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" +#, fuzzy, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Preterpasis nekonatan dosieron {path}" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Preterpasis dosieron '{path}' kiu jam enhavas REUSE-informojn" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Eraro: Ne povis krei komenton por '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' ne subtenas unuopliniajn komentojn, bonvolu ne uzi --single-line" +#~ "Eraro: Al generita komentkapo por '{path}' mankas kopirajtlinioj aŭ " +#~ "permesilesprimoj. La ŝablono probable malbonas. Ne skribis novan kapon." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Sukcese ŝanĝis kapon de {path}" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Ne povis analizi '{expression}'" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' ne subtenas plurliniajn komentojn, bonvolu ne uzi --multi-line" +#~ "'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante " +#~ "la dosieron" -#, fuzzy -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--output faras nenion kiam --all ankaŭ uziĝas" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "opcio --copyright aŭ --license necesas" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' trovita en:" -#, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "ŝablono {template} netroveblas" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "ARĤAIKIGITAJ PERMESILOJ" -#~ msgid "can't write to '{}'" -#~ msgstr "ne povas skribi al '{}'" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "La sekvajn permesilojn arĥaikigis SPDX:" -#, fuzzy -#~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" -#~ msgstr "" -#~ "La sekvaj dosieroj ne havas konatan dosiersufikson. Bonvolu uzi --style, " -#~ "--force-dot-license aŭ --skip-unrecognised:" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "PERMESILOJ SEN DOSIERSUFIKSO" -#~ msgid "copyright statement, repeatable" -#~ msgstr "kopirajtlinio, ripetabla" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "La sekvaj permesiloj ne havas dosiersufikson:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Identigilo, ripetabla" +#~ msgid "MISSING LICENSES" +#~ msgstr "MANKANTAJ PERMESILOJ" -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "SPDX Identigilo, ripetabla" +#~ msgid "UNUSED LICENSES" +#~ msgstr "NEUZATAJ PERMESILOJ" -#~ msgid "year of copyright statement, optional" -#~ msgstr "jaro de kopirajtlinio, malnepra" +#~ msgid "The following licenses are not used:" +#~ msgstr "La sekvajn permesilojn oni ne uzas:" -#~ msgid "comment style to use, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "READ ERRORS" +#~ msgstr "LEG-ERAROJ" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "Could not read:" +#~ msgstr "Ne povis legi:" -#~ msgid "name of template to use, optional" -#~ msgstr "nomo de uzenda ŝablono, malnepra" +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "MANKANTAJ KOPIRAJTAJ KAJ PERMESILAJ INFORMOJ" -#~ msgid "do not include year in statement" -#~ msgstr "ne inkluzivi jaron en kopirajtlinio" +#~ msgid "The following files have no copyright information:" +#~ msgstr "La sekvaj dosieroj ne havas kopirajtajn informojn:" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "jaro de kopirajtlinio, malnepra" +#~ msgid "The following files have no licensing information:" +#~ msgstr "La sekvaj dosieroj ne havas permesilajn informojn:" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "SUMMARY" +#~ msgstr "RESUMO" + +#~ msgid "Bad licenses:" +#~ msgstr "Malbonaj permesiloj:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Arĥaikigitaj permesiloj:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Permesiloj sen dosiersufikso:" + +#~ msgid "Missing licenses:" +#~ msgstr "Mankantaj permesiloj:" + +#~ msgid "Unused licenses:" +#~ msgstr "Neuzataj permesiloj:" + +#~ msgid "Used licenses:" +#~ msgstr "Uzataj permesiloj:" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "Read errors:" +#~ msgstr "Leg-eraroj: {count}" #, fuzzy -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "Preterpasis dosieron '{path}' kiu jam enhavas REUSE-informojn" +#~ msgid "Files with copyright information:" +#~ msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' estas duuma, tiel uzante '{new_path}' por la kapo" +#, fuzzy +#~ msgid "Files with license information:" +#~ msgstr "Dosieroj sen permesilinformo: {count} / {total}" #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "reuse estas ilo por konformiĝo al la rekomendoj de REUSE. Vidu por pli da informo, kaj " -#~ "por la reta dokumentado." +#~ "Gratulon! Via projekto konformas al versio {} de la REUSE Specifo :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." -#~ msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" +#~ msgstr "" +#~ "Bedaŭrinde, via projekto ne konformas al versio {} de la REUSE Specifo :-(" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' ne estas valida SPDX Permesila Identigilo." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Arĥaikigitaj permesiloj:" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Subtenu la laboradon de FSFE:" +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Permesiloj sen dosiersufikso:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Neuzataj permesiloj:" +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' sub .reuse/dep5" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "precizigante identigilon de '{path}'" + +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} ne havas dosiersufikson" + +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Donacoj estas gravegaj por niaj forto kaj aŭtonomeco. Ili ebligas nin " -#~ "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " -#~ "pripensi fari donacon ĉe ." +#~ "Ne povis precizigi SPDX Permesila Identigilo de {path}, uzante " +#~ "{identifier}. Certigu ke la permesilo estas en la listo ĉe aŭ ke ĝi komencas per 'LicenseRef-' kaj havas " +#~ "dosiersufikson." -#~ msgid "enable debug statements" -#~ msgstr "ŝalti sencimigajn ordonojn" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " +#~ "{other_path}" -#~ msgid "hide deprecation warnings" -#~ msgstr "kaŝi avertojn de evitindaĵoj" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Ne povis legi '{path}'" -#~ msgid "do not skip over Git submodules" -#~ msgstr "ne preterpasi Git-submodulojn" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Okazis neanticipita eraro dum analizado de '{path}'" #, fuzzy -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "ne preterpasi Meson-subprojektojn" - -#~ msgid "do not use multiprocessing" -#~ msgstr "ne uzi plurprocesoradon" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--output faras nenion kiam --all ankaŭ uziĝas" -#~ msgid "define root of project" -#~ msgstr "difini radikon de la projekto" +#~ msgid "can't write to '{}'" +#~ msgstr "ne povas skribi al '{}'" #~ msgid "show program's version number and exit" #~ msgstr "montri versionumeron de programo kaj eliri" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" - #~ msgid "list all non-compliant files" #~ msgstr "listigi ĉiujn nekonformajn dosierojn" @@ -869,16 +1025,9 @@ msgstr[1] "" #~ "\n" #~ "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "presi la pecoliston de la projekto en SPDX-formo" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "presi la pecoliston de la projekto en SPDX-formo" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' ne estas dosiero" @@ -891,53 +1040,15 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "ne povas legi aŭ skribi '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' ne estas valida SPDX Permesila Identigilo." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Vidu por listo de validaj SPDX Permesilaj " -#~ "Identigiloj." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "Krante .reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "SPDX Permesila Identigilo de permesilo" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "" -#~ "elŝuti ĉiujn mankantajn permesilojn kiujn oni eltrovis en la projekto" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Eraro: {spdx_identifier} jam ekzistas." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Eraro: Malsukcesis elŝuti permesilon." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Ĉu via retkonekto funkcias?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Sukceses elŝutis {spdx_identifier}." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output faras nenion kiam --all ankaŭ uziĝas" #~ msgid "the following arguments are required: license" #~ msgstr "la sekvaj argumentoj nepras: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "ne povas uzi --output kun pli ol unu permesilo" - #~ msgid "usage: " #~ msgstr "uzo: " @@ -1080,9 +1191,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Kiu estas la nomo de la projekto?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Kiu estas la reta adreso de la projekto?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Kiu estas la nomo de la daŭriganto?" @@ -1189,10 +1297,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" -#, fuzzy -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" - #~ msgid "Downloading {}" #~ msgstr "Elŝutante {}" diff --git a/po/es.po b/po/es.po index a7a2c34bb..a27755745 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-10-10 16:26+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish for a list of valid SPDX License " +"Identifiers." msgstr "" +"Consulta para obtener un listado de los " +"Identificadores SPDX de Licencia válidos." -#: src/reuse/lint.py:259 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: read error\n" -msgstr "" +msgid "Error: {spdx_identifier} already exists." +msgstr "Error: {spdx_identifier} ya existe." -#: src/reuse/lint.py:263 +#: src/reuse/cli/download.py:82 #, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' no es un Identificador SPDX de Licencia válido." +msgid "Error: {path} does not exist." +msgstr "Error: {path} no existe." + +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Error: Fallo al descargar la licencia." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "¿Está funcionando tu conexión a Internet?" -#: src/reuse/lint.py:267 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: no copyright notice\n" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "{spdx_identifier} descargado con éxito." + +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Descargar una licencia y colocarla en el directorio LICENSES/ ." + +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Licencias obsoletas:" +#: src/reuse/cli/download.py:136 +#, fuzzy +msgid "" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." +msgstr "" +"fuente desde la que copiar las licencias LicenseRef- personalizadas, ya sea " +"un directorio que contenga el archivo o el propio archivo" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Licencias sin extensión de fichero:" +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "LICENCIAS MALAS" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Licencias no utilizadas:" +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "las opciones --single-line y --multi-line se excluyen mutuamente" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' cubierto por .reuse/dep5" +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "no se puede utilizar --output con más de una licencia" -#: src/reuse/project.py:268 +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" +msgstr "" + +#: src/reuse/cli/lint.py:36 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -"Se ha detectado que '{path}' es un archivo binario; no se ha buscado " -"información REUTILIZABLE en su contenido." -#: src/reuse/project.py:336 +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "¿Cuál es la dirección de Internet del proyecto?" + +#: src/reuse/cli/lint.py:43 msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "determinando el identificador de '{path}'" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} no tiene extensión de fichero" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format -msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" msgstr "" -"No pudo detectarse el Identificador SPDX de Licencia de {path}: detectando " -"{identifier}. Asegúrate de que la licencia consta en la lista de licencias " -"alojada en , o de que empieza por 'LicenseRef-', " -"y de que posee una extensión de fichero." +"Los siguientes archivos carecen de información de copyright y licencia:" -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "impide la producción" + +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "formato de salida JSON" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "Formato de salida como texto sin formato (por defecto)" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "formatea la salida como un texto plano" + +#: src/reuse/cli/lint_file.py:25 +#, fuzzy msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -"{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " -"{other_path}" +"Archivos individuales de Lint. Los archivos especificados se comprueban para " +"ver si hay información de copyright y licencias, y si las licencias " +"encontradas están incluidas en el directorio LICENSES/ ." -#: src/reuse/project.py:485 -msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "Formatea la salida como errores por línea (por defecto)" + +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -"el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " -"está instalado" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "No se pudo leer '{path}'" +#: src/reuse/cli/lint_file.py:64 +#, fuzzy, python-brace-format +msgid "'{file}' is not inside of '{root}'." +msgstr "'{file}' no está dentro de '{root}'" -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Se produjo un error inesperado al procesar '{path}'" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: error: %(message)s\n" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:40 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Corregir licencias defectuosas: Al menos una licencia en el directorio " -"LICENCIAS y/o proporcionada por etiquetas 'SPDX-License-Identifier' no es " -"válida. No son identificadores de licencia SPDX válidos o no empiezan por " -"'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " -"https://reuse.software/faq/#custom-license" - -#: src/reuse/report.py:519 +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" + +#: src/reuse/cli/main.py:47 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " -msgstr "" -"Corrección de licencias obsoletas: Al menos una de las licencias en el " -"directorio LICENCIAS y/o proporcionada por una etiqueta 'SPDX-License-" -"Identifier' o en '.reuse/dep5' ha sido obsoleta por SPDX. La lista actual y " -"los nuevos identificadores recomendados se encuentran aquí: " - -#: src/reuse/report.py:530 +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 +msgid "" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." +msgstr "" + +#: src/reuse/cli/main.py:62 +msgid "" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse es una herramienta para cumplir con las recomendaciones de la " +"iniciativa REUSE. Visita para obtener más " +"información, y para acceder a la " +"documentación en línea." + +#: src/reuse/cli/main.py:69 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" -"Corregir licencias sin extensión de archivo: al menos un archivo de texto " -"con la licencia en el directorio 'LICENCIAS' no tiene una extensión '.txt'. " -"Cambie el nombre de los archivos en consecuencia." +"Esta versión de reuse es compatible con la versión {} de la Especificación " +"REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Apoya el trabajo de la FSFE:" -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:78 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." -msgstr "" -"Corrección de las licencias que faltan: Para al menos uno de los " -"identificadores de la licencia proporcionados por las etiquetas 'SPDX-" -"License-Identifier', no existe el correspondiente archivo de texto de " -"licencia en el directorio 'LICENCIAS'. Para los identificadores de licencia " -"SPDX, basta con ejecutar 'reuse download --all' para obtener los que falten. " -"En el caso de las licencias personalizadas (que empiezan por 'LicenseRef-'), " -"deberá añadir estos archivos usted mismo." - -#: src/reuse/report.py:551 +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." +msgstr "" +"Las donaciones son esenciales para nuestra fortaleza y autonomía. Estas nos " +"permiten continuar trabajando por el Software Libre allá donde sea " +"necesario. Por favor, considera el hacer una donación en ." + +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "habilita instrucciones de depuración" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "ocultar las advertencias de que está obsoleto" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "no omitas los submódulos de Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "no te saltes los subproyectos de Meson" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "no utilices multiproceso" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "define el origen del proyecto" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "Genere una lista de materiales SPDX en formato RDF." + +#: src/reuse/cli/spdx.py:33 +#, fuzzy +msgid "File to write to." +msgstr "archivos para limpiar" + +#: src/reuse/cli/spdx.py:39 +#, fuzzy msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." -msgstr "" -"Corregir licencias no utilizadas: Al menos uno de los archivos de texto de " -"la licencia en 'LICENCIAS' no está referenciado por ningún archivo, por " -"ejemplo, por una etiqueta 'SPDX-License-Identifier'. Por favor, asegúrese de " -"etiquetar correctamente los archivos con la licencia correspondiente, o " -"elimine el texto de la licencia no utilizado si está seguro de que ningún " -"archivo o fragmento de código tiene una licencia como tal." - -#: src/reuse/report.py:562 +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" +"rellenar el campo LicenseConcluded; ten en cuenta que la reutilización no " +"puede garantizar que el campo sea exacto" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "nombre de la persona que firma el informe SPDX" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "nombre de la organización que firma el informe SPDX" + +#: src/reuse/cli/spdx.py:82 +#, fuzzy msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -"Corregir errores de lectura: Al menos uno de los archivos de su directorio " -"no puede ser leído por la herramienta. Compruebe los permisos de los " -"archivos. Encontrará los archivos afectados en la parte superior como parte " -"de los mensajes de los errores registrados." +"error: se requiere --creator-person=NAME o --creator-organization=NAME " +"cuando se proporciona --add-license-concluded" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Corregir la falta de información del copyright/licencia: Para uno o más " -"archivos, la herramienta no puede encontrar la información del copyright y/o " -"licencia. Para ello, añada las etiquetas 'SPDX-FileCopyrightText' y 'SPDX-" -"License-Identifer' a cada archivo. El tutorial explica otras formas de " -"hacerlo: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"'{path}' no coincide con un patrón del archivo SPDX común. Encontrarás las " +"convenciones de la nomenclatura sugeridas aquí: https://spdx.github.io/spdx-" +"spec/conformance/#44-standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "Lista de todas las licencias SPDX compatibles" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -532,11 +641,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: error: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -735,175 +839,342 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" +#, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Se ha omitido el archivo no reconocido de '{path}'" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' no se reconoce; creando '{path}.license'" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Se ha omitido el archivo '{path}' que ya contiene información REUSE" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Error: No se pudo crear un comentario para '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' no admite comentarios de una sola línea, no utilices --single-" -#~ "line" +#~ "Error: La cabecera de comentario generada para '{path}' carece del " +#~ "mensaje de copyright o de las frases de licencia; la plantilla " +#~ "seguramente es incorrecta. No se ha escrito una nueva cabecera." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Cabecera de {path} correctamente cambiada" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "No se pudo procesar '{expression}'" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" -#~ msgstr "'{path}' no admite comentarios multilínea, no utilices --multi-line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +#~ msgstr "" +#~ "'{path}' posee una expresión SPDX que no puede ser procesada; omitiendo " +#~ "el archivo" -#~ msgid "--skip-unrecognised has no effect when used together with --style" +#, python-brace-format +#~ msgid "" +#~ "{attr_name} must be a {type_name} (got {value} that is a {value_class})." #~ msgstr "" -#~ "--skip-unrecognised no tiene efecto cuando se utiliza junto con --style" +#~ "{attr_name} debe ser un {type_name} (got {value}, que es una " +#~ "{value_class})." -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "se requiere la opción --contributor, --copyright o --license" +#, python-brace-format +#~ msgid "" +#~ "Item in {attr_name} collection must be a {type_name} (got {item_value} " +#~ "that is a {item_class})." +#~ msgstr "" +#~ "El elemento en la colección {attr_name} debe ser un {type_name} (obtiene " +#~ "{item_value}, que es un {item_class})." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "no pudo encontrarse la plantilla {template}" +#~ msgid "{attr_name} must not be empty." +#~ msgstr "{attr_name} no debe estar vacío." -#~ msgid "can't write to '{}'" -#~ msgstr "no se puede escribir en '{}'" +#, python-brace-format +#~ msgid "{name} must be a {type} (got {value} that is a {value_type})." +#~ msgstr "" +#~ "{name} debe ser un {type} (obtiene {value}, que es un {value_type})." +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "The value of 'precedence' must be one of {precedence_vals} (got " +#~ "{received})" #~ msgstr "" -#~ "Los siguientes archivos no tienen una extensión de archivo reconocida. " -#~ "Por favor use --style, -force-dot-license, -fallback-dot-license o -skip-" -#~ "unrecognized:" +#~ "El valor de 'precedence' debe ser uno de {precedence_vals} (obtiene " +#~ "{received})" -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaración de los derechos de autor, repetible" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "el comentario generado carece del mensaje de copyright o de las frases de " +#~ "licencia" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX, repetible" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' encontrado en:" -#~ msgid "file contributor, repeatable" -#~ msgstr "colaborador de archivos, repetible" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "LICENCIAS OBSOLETAS" -#~ msgid "year of copyright statement, optional" -#~ msgstr "año de la declaración de copyright; opcional" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Las siguientes licencias han quedado obsoletas según SPDX:" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentario a utilizar; opcional" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENCIAS SIN EXTENSIÓN DE FICHERO" -#~ msgid "copyright prefix to use, optional" -#~ msgstr "prefijo de copyright para usar, opcional" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Las siguientes licencias no tienen extensión de fichero:" -#~ msgid "name of template to use, optional" -#~ msgstr "nombre de la plantilla a utilizar; opcional" +#~ msgid "MISSING LICENSES" +#~ msgstr "LICENCIAS NO ENCONTRADAS" -#~ msgid "do not include year in statement" -#~ msgstr "no incluir el año en la declaración" +#~ msgid "UNUSED LICENSES" +#~ msgstr "LICENCIAS NO UTILIZADAS" -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "" -#~ "fusionar las líneas del copyright si las declaraciones del copyright son " -#~ "idénticas" +#~ msgid "The following licenses are not used:" +#~ msgstr "Las siguientes licencias no son utilizadas:" -#~ msgid "force single-line comment style, optional" -#~ msgstr "forzar el estilo del comentario de una sola línea, opcional" +#~ msgid "READ ERRORS" +#~ msgstr "ERRORES DE LECTURA" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "forzar el estilo del comentario multilínea, opcional" +#~ msgid "Could not read:" +#~ msgstr "No se pudo leer:" -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "" -#~ "añadir las cabeceras a todos los archivos de los directorios " -#~ "especificados de forma recursiva" +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "FALTA INFORMACIÓN SOBRE COPYRIGHT Y LICENCIA" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Los siguientes ficheros carecen de información de copyright:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Los siguientes ficheros carecen de información de licencia:" + +#~ msgid "SUMMARY" +#~ msgstr "RESUMEN" + +#~ msgid "Bad licenses:" +#~ msgstr "Licencias malas:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Licencias obsoletas:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Licencias sin extensión de fichero:" -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" +#~ msgid "Missing licenses:" +#~ msgstr "Licencias no encontradas:" -#~ msgid "always write a .license file instead of a header inside the file" +#~ msgid "Unused licenses:" +#~ msgstr "Licencias no utilizadas:" + +#~ msgid "Used licenses:" +#~ msgstr "Licencias utilizadas:" + +#~ msgid "Read errors:" +#~ msgstr "Errores de lectura:" + +#, fuzzy +#~ msgid "Files with copyright information:" +#~ msgstr "archivos con información sobre los derechos de autor:" + +#, fuzzy +#~ msgid "Files with license information:" +#~ msgstr "con información sobre las licencias:" + +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "escribir siempre un archivo .license en lugar de una cabecera dentro del " -#~ "archivo" +#~ "¡Enhorabuena! Tu proyecto es compatible con la versión {} de la " +#~ "Especificación REUSE :-)" -#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "escribir un archivo .license en archivos con estilos de comentario no " -#~ "reconocidos" +#~ "Desafortunadamente, tu proyecto no es compatible con la versión {} de la " +#~ "Especificación REUSE :-(" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "omitir los archivos con estilos de comentario no reconocidos" +#~ msgid "RECOMMENDATIONS" +#~ msgstr "RECOMENDACIONES" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "omitir los archivos que ya contienen la información REUSE" +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' no es un Identificador SPDX de Licencia válido." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Licencias obsoletas:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Licencias sin extensión de fichero:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Licencias no utilizadas:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' cubierto por .reuse/dep5" #, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." #~ msgstr "" -#~ "'{path}' es un fichero binario: en consecuencia, se utiliza '{new_path}' " -#~ "para la cabecera" +#~ "Se ha detectado que '{path}' es un archivo binario; no se ha buscado " +#~ "información REUTILIZABLE en su contenido." -#~ msgid "prevents output" -#~ msgstr "impide la producción" +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "determinando el identificador de '{path}'" -#~ msgid "formats output as errors per line (default)" -#~ msgstr "Formatea la salida como errores por línea (por defecto)" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} no tiene extensión de fichero" -#~ msgid "files to lint" -#~ msgstr "archivos para limpiar" +#, python-brace-format +#~ msgid "" +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." +#~ msgstr "" +#~ "No pudo detectarse el Identificador SPDX de Licencia de {path}: " +#~ "detectando {identifier}. Asegúrate de que la licencia consta en la lista " +#~ "de licencias alojada en , o de que empieza " +#~ "por 'LicenseRef-', y de que posee una extensión de fichero." #, python-brace-format -#~ msgid "'{file}' is not inside of '{root}'" -#~ msgstr "'{file}' no está dentro de '{root}'" +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como " +#~ "de {other_path}" #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" #~ msgstr "" -#~ "reuse es una herramienta para cumplir con las recomendaciones de la " -#~ "iniciativa REUSE. Visita para obtener más " -#~ "información, y para acceder a la " -#~ "documentación en línea." +#~ "el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " +#~ "está instalado" + +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "No se pudo leer '{path}'" + +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Se produjo un error inesperado al procesar '{path}'" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" #~ msgstr "" -#~ "Esta versión de reuse es compatible con la versión {} de la " -#~ "Especificación REUSE." +#~ "Corregir licencias defectuosas: Al menos una licencia en el directorio " +#~ "LICENCIAS y/o proporcionada por etiquetas 'SPDX-License-Identifier' no es " +#~ "válida. No son identificadores de licencia SPDX válidos o no empiezan por " +#~ "'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " +#~ "https://reuse.software/faq/#custom-license" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Apoya el trabajo de la FSFE:" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Corrección de licencias obsoletas: Al menos una de las licencias en el " +#~ "directorio LICENCIAS y/o proporcionada por una etiqueta 'SPDX-License-" +#~ "Identifier' o en '.reuse/dep5' ha sido obsoleta por SPDX. La lista actual " +#~ "y los nuevos identificadores recomendados se encuentran aquí: " #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." #~ msgstr "" -#~ "Las donaciones son esenciales para nuestra fortaleza y autonomía. Estas " -#~ "nos permiten continuar trabajando por el Software Libre allá donde sea " -#~ "necesario. Por favor, considera el hacer una donación en ." +#~ "Corregir licencias sin extensión de archivo: al menos un archivo de texto " +#~ "con la licencia en el directorio 'LICENCIAS' no tiene una extensión '." +#~ "txt'. Cambie el nombre de los archivos en consecuencia." -#~ msgid "enable debug statements" -#~ msgstr "habilita instrucciones de depuración" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Corrección de las licencias que faltan: Para al menos uno de los " +#~ "identificadores de la licencia proporcionados por las etiquetas 'SPDX-" +#~ "License-Identifier', no existe el correspondiente archivo de texto de " +#~ "licencia en el directorio 'LICENCIAS'. Para los identificadores de " +#~ "licencia SPDX, basta con ejecutar 'reuse download --all' para obtener los " +#~ "que falten. En el caso de las licencias personalizadas (que empiezan por " +#~ "'LicenseRef-'), deberá añadir estos archivos usted mismo." -#~ msgid "hide deprecation warnings" -#~ msgstr "ocultar las advertencias de que está obsoleto" +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." +#~ msgstr "" +#~ "Corregir licencias no utilizadas: Al menos uno de los archivos de texto " +#~ "de la licencia en 'LICENCIAS' no está referenciado por ningún archivo, " +#~ "por ejemplo, por una etiqueta 'SPDX-License-Identifier'. Por favor, " +#~ "asegúrese de etiquetar correctamente los archivos con la licencia " +#~ "correspondiente, o elimine el texto de la licencia no utilizado si está " +#~ "seguro de que ningún archivo o fragmento de código tiene una licencia " +#~ "como tal." -#~ msgid "do not skip over Git submodules" -#~ msgstr "no omitas los submódulos de Git" +#~ msgid "" +#~ "Fix read errors: At least one of the files in your directory cannot be " +#~ "read by the tool. Please check the file permissions. You will find the " +#~ "affected files at the top of the output as part of the logged error " +#~ "messages." +#~ msgstr "" +#~ "Corregir errores de lectura: Al menos uno de los archivos de su " +#~ "directorio no puede ser leído por la herramienta. Compruebe los permisos " +#~ "de los archivos. Encontrará los archivos afectados en la parte superior " +#~ "como parte de los mensajes de los errores registrados." -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "no te saltes los subproyectos de Meson" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Corregir la falta de información del copyright/licencia: Para uno o más " +#~ "archivos, la herramienta no puede encontrar la información del copyright " +#~ "y/o licencia. Para ello, añada las etiquetas 'SPDX-FileCopyrightText' y " +#~ "'SPDX-License-Identifer' a cada archivo. El tutorial explica otras formas " +#~ "de hacerlo: " -#~ msgid "do not use multiprocessing" -#~ msgstr "no utilices multiproceso" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised no tiene efecto cuando se utiliza junto con --style" -#~ msgid "define root of project" -#~ msgstr "define el origen del proyecto" +#~ msgid "can't write to '{}'" +#~ msgstr "no se puede escribir en '{}'" #~ msgid "show program's version number and exit" #~ msgstr "muestra la versión del programa y sale" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" - #~ msgid "" #~ "Add copyright and licensing into the header of one or more files.\n" #~ "\n" @@ -926,9 +1197,6 @@ msgstr[1] "" #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Descargar una licencia y colocarla en el directorio LICENSES/ ." - #~ msgid "list all non-compliant files" #~ msgstr "lista todos los ficheros no compatibles" @@ -983,50 +1251,19 @@ msgstr[1] "" #~ "- ¿Tienen todos los archivos información válida sobre derechos de autor y " #~ "licencias?" -#~ msgid "" -#~ "Lint individual files. The specified files are checked for the presence " -#~ "of copyright and licensing information, and whether the found licenses " -#~ "are included in the LICENSES/ directory." -#~ msgstr "" -#~ "Archivos individuales de Lint. Los archivos especificados se comprueban " -#~ "para ver si hay información de copyright y licencias, y si las licencias " -#~ "encontradas están incluidas en el directorio LICENSES/ ." - #~ msgid "list non-compliant files from specified list of files" #~ msgstr "" #~ "enumerar los archivos no compatibles de la lista de archivos especificada" -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "Genere una lista de materiales SPDX en formato RDF." - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "imprime la lista de materiales del proyecto en formato SPDX" #~ msgid "List all non-deprecated SPDX licenses from the official list." #~ msgstr "Enumere todas las licencias SPDX no obsoletas de la lista oficial." -#~ msgid "list all supported SPDX licenses" -#~ msgstr "Lista de todas las licencias SPDX compatibles" - -#~ msgid "" -#~ "Convert .reuse/dep5 into a REUSE.toml file in your project root. The " -#~ "generated file is semantically identical. The .reuse/dep5 file is " -#~ "subsequently deleted." -#~ msgstr "" -#~ "Convertir . reuse/dep5 en un archivo REUSE.toml en la raíz del proyecto. " -#~ "El archivo generado es semánticamente idéntico. El . reutilización/dep5 " -#~ "archivo se elimina posteriormente." - #~ msgid "convert .reuse/dep5 to REUSE.toml" #~ msgstr "convertir . reuse/dep5 a REUSE.toml" -#, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{path}' no se pudo analizar. Con el siguiente mensaje de error: {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' no es un fichero" @@ -1039,99 +1276,15 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "no se puede leer o escribir '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' no es una expresión SPDX válida; abortando" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' no es un Identificador SPDX de Licencia válido." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Consulta para obtener un listado de los " -#~ "Identificadores SPDX de Licencia válidos." - -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "sin archivo '.reuse/dep5'" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Identificador SPDX de la licencia" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "" -#~ "descargar todas las licencias no disponibles detectadas en el proyecto" - -#~ msgid "" -#~ "source from which to copy custom LicenseRef- licenses, either a directory " -#~ "that contains the file or the file itself" -#~ msgstr "" -#~ "fuente desde la que copiar las licencias LicenseRef- personalizadas, ya " -#~ "sea un directorio que contenga el archivo o el propio archivo" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Error: {spdx_identifier} ya existe." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Error: Fallo al descargar la licencia." - -#~ msgid "Is your internet connection working?" -#~ msgstr "¿Está funcionando tu conexión a Internet?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "{spdx_identifier} descargado con éxito." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output no tiene efecto cuando se utiliza junto con --all" #~ msgid "the following arguments are required: license" #~ msgstr "se requieren los siguientes parámetros: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "no se puede utilizar --output con más de una licencia" - -#~ msgid "formats output as JSON" -#~ msgstr "formato de salida JSON" - -#~ msgid "formats output as plain text (default)" -#~ msgstr "Formato de salida como texto sin formato (por defecto)" - -#, fuzzy -#~ msgid "formats output as errors per line" -#~ msgstr "formatea la salida como un texto plano" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "rellenar el campo LicenseConcluded; ten en cuenta que la reutilización no " -#~ "puede garantizar que el campo sea exacto" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "nombre de la persona que firma el informe SPDX" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "nombre de la organización que firma el informe SPDX" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "error: se requiere --creator-person=NAME o --creator-organization=NAME " -#~ "cuando se proporciona --add-license-concluded" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "'{path}' no coincide con un patrón del archivo SPDX común. Encontrarás " -#~ "las convenciones de la nomenclatura sugeridas aquí: https://spdx.github." -#~ "io/spdx-spec/conformance/#44-standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "uso: " @@ -1291,9 +1444,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "¿Cuál es el nombre del proyecto?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "¿Cuál es la dirección de Internet del proyecto?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "¿Cuál es el nombre del mantenedor?" @@ -1430,9 +1580,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "las opciones -exclude-year y --year son mutuamente excluyentes" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "las opciones --single-line y --multi-line se excluyen mutuamente" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "" diff --git a/po/fr.po b/po/fr.po index affc6459b..68c192cb8 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-07-07 21:10+0000\n" "Last-Translator: Anthony Loiseau \n" "Language-Team: French 1;\n" "X-Generator: Weblate 5.7-dev\n" -#: src/reuse/_annotate.py:95 -#, fuzzy, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "Le fichier {path} non reconnu a été ignoré" - -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "'{path}' non reconnu, création de '{path}.license'" - -#: src/reuse/_annotate.py:117 -#, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" -msgstr "Le fichier ignoré {path} contenait déjà les données REUSE" - -#: src/reuse/_annotate.py:151 -#, python-brace-format -msgid "Error: Could not create comment for '{path}'" -msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" +#: src/reuse/cli/annotate.py:62 +#, fuzzy +msgid "Option '--copyright', '--license', or '--contributor' is required." +msgstr "une des options --contributor, --copyright ou --license est nécessaire" -#: src/reuse/_annotate.py:158 -#, python-brace-format +#: src/reuse/cli/annotate.py:123 +#, fuzzy msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" msgstr "" -"Erreur : l'en-tête de commentaire généré dans '{path}' ne contient pas de " -"ligne ou d'expression de droits d'auteur ou de licence. Le modèle est " -"probablement incorrect. Nouvel en-tête non écrit." +"Les fichiers suivants n'ont pas une extension reconnue. Merci d'utiliser --" +"style, --force-dot-license, --fallback-dot-license ou --skip-unrecognised :" -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 -#, python-brace-format -msgid "Successfully changed header of {path}" -msgstr "En-tête de {path} modifié avec succès" - -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" -msgstr "Analyse de la syntaxe de '{expression}' impossible" - -#: src/reuse/_util.py:384 -#, python-brace-format +#: src/reuse/cli/annotate.py:156 +#, fuzzy, python-brace-format msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." msgstr "" -"'{path}' contient une expression SPDX qui ne peut pas être analysée : le " -"fichier est ignoré" +"{path} ne supporte pas les commentaires mono-lignes. Merci de ne pas " +"utiliser --single-line" -#: src/reuse/global_licensing.py:120 +#: src/reuse/cli/annotate.py:163 #, fuzzy, python-brace-format msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." msgstr "" -"{attr_name} doit être un(e) {type_name} (obtenu {value} qui est un(e) " -"{value_class})." +"{path} ne supporte pas les commentaires multi-lignes. Merci de ne pas " +"utiliser --multi-line" -#: src/reuse/global_licensing.py:134 +#: src/reuse/cli/annotate.py:209 #, fuzzy, python-brace-format -msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." -msgstr "" -"Les éléments de la collection {attr_name} doivent être des {type_name} " -"(obtenu {item_value} qui et un(e) {item_class})." +msgid "Template '{template}' could not be found." +msgstr "le modèle {template} est introuvable" -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." -msgstr "{attr_name} ne doit pas être vide." +#: src/reuse/cli/annotate.py:272 +#, fuzzy +msgid "Add copyright and licensing into the headers of files." +msgstr "" +"ajoute les informations de droits d'auteur et de licence dans les en-têtes " +"des fichiers" -#: src/reuse/global_licensing.py:170 -#, fuzzy, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." +#: src/reuse/cli/annotate.py:275 +msgid "" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -"{name} doit être un(e) {type} (obtenu {value} qui est un {value_type})." -#: src/reuse/global_licensing.py:194 -#, fuzzy, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -"La valeur de 'precedence' doit être parmi {precedence_vals} (obtenu " -"{received})" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" msgstr "" -"les commentaires générés ne contiennent pas de ligne ou d'expression de " -"droits d'auteur ou de licence" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" -msgstr "MAUVAISES LICENCES" +#: src/reuse/cli/annotate.py:296 +#, fuzzy +msgid "Copyright statement, repeatable." +msgstr "déclaration de droits d'auteur, répétable" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" -msgstr "'{}' trouvé dans :" +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" +msgstr "" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" -msgstr "LICENCES OBSOLÈTES" +#: src/reuse/cli/annotate.py:305 +#, fuzzy +msgid "SPDX License Identifier, repeatable." +msgstr "Identifiant SPDX, répétable" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" -msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" +msgstr "" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" -msgstr "LICENCES SANS EXTENSION DE FICHIER" +#: src/reuse/cli/annotate.py:313 +#, fuzzy +msgid "File contributor, repeatable." +msgstr "contributeur au fichier, répétable" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" -msgstr "Les licences suivantes n'ont pas d'extension de fichier :" +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" +msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" -msgstr "LICENCES MANQUANTES" +#: src/reuse/cli/annotate.py:325 +#, fuzzy +msgid "Year of copyright statement." +msgstr "année de déclaration de droits d'auteur, facultatif" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" -msgstr "LICENCES INUTILISÉES" +#: src/reuse/cli/annotate.py:333 +#, fuzzy +msgid "Comment style to use." +msgstr "style de commentaire à utiliser, facultatif" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" -msgstr "Les licences suivantes ne sont pas utilisées :" +#: src/reuse/cli/annotate.py:338 +#, fuzzy +msgid "Copyright prefix to use." +msgstr "préfixe de droits d'auteur à utiliser, facultatif" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" -msgstr "ERREURS DE LECTURE" +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" +msgstr "" -#: src/reuse/lint.py:85 -msgid "Could not read:" -msgstr "Illisibles :" +#: src/reuse/cli/annotate.py:351 +#, fuzzy +msgid "Name of template to use." +msgstr "nom de modèle à utiliser, facultatif" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" -msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" +#: src/reuse/cli/annotate.py:358 +#, fuzzy +msgid "Do not include year in copyright statement." +msgstr "ne pas inclure d'année dans la déclaration" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" +#: src/reuse/cli/annotate.py:363 +#, fuzzy +msgid "Merge copyright lines if copyright statements are identical." msgstr "" -"Les fichiers suivants ne contiennent pas de données de droits d'auteur et de " -"licence :" +"fusionner les lignes de droits d'auteur si les déclarations de droits " +"d'auteur sont identiques" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" -msgstr "" -"Les fichiers suivants ne contiennent pas de données de droits d'auteur :" +#: src/reuse/cli/annotate.py:370 +#, fuzzy +msgid "Force single-line comment style." +msgstr "forcer le style de commentaire monoligne, facultatif" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" -msgstr "Les fichiers suivants ne contiennent pas de données de licence :" +#: src/reuse/cli/annotate.py:377 +#, fuzzy +msgid "Force multi-line comment style." +msgstr "forcer le style de commentaire multiligne, facultatif" -#: src/reuse/lint.py:140 -msgid "SUMMARY" -msgstr "RÉSUMÉ" +#: src/reuse/cli/annotate.py:383 +#, fuzzy +msgid "Add headers to all files under specified directories recursively." +msgstr "" +"ajouter récursivement les en-têtes dans tous les fichiers des répertoires " +"spécifiés" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" -msgstr "Mauvaises licences :" +#: src/reuse/cli/annotate.py:388 +#, fuzzy +msgid "Do not replace the first header in the file; just add a new one." +msgstr "" +"ne pas remplacer le premier en-tête dans le fichier, mais simplement en " +"ajouter un" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" -msgstr "Licences obsolètes :" +#: src/reuse/cli/annotate.py:395 +#, fuzzy +msgid "Always write a .license file instead of a header inside the file." +msgstr "" +"toujours écrire un fichier .license au lieu d'une entête dans le fichier" -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" -msgstr "Licences sans extension de fichier :" +#: src/reuse/cli/annotate.py:402 +#, fuzzy +msgid "Write a .license file to files with unrecognised comment styles." +msgstr "" +"écrire un fichier .license pour les fichiers au style de commentaire inconnu" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" -msgstr "Licences manquantes :" +#: src/reuse/cli/annotate.py:409 +#, fuzzy +msgid "Skip files with unrecognised comment styles." +msgstr "" +"ignorer les fichiers comportant des styles de commentaires non reconnus" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Licences inutilisées :" +#: src/reuse/cli/annotate.py:420 +#, fuzzy +msgid "Skip files that already contain REUSE information." +msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Licences utilisées :" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" +msgstr "" -#: src/reuse/lint.py:153 -msgid "Read errors:" -msgstr "Erreurs de lecture :" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' est un fichier binaire, par conséquent le fichier '{new_path}' est " +"utilisé pour l'en-tête" -#: src/reuse/lint.py:155 -#, fuzzy -msgid "Files with copyright information:" -msgstr "Fichiers contenant des droits d'auteur :" +#: src/reuse/cli/common.py:58 +#, fuzzy, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" +msgstr "" +"'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " +"suivant : {message}" + +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" +msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/cli/common.py:114 #, fuzzy -msgid "Files with license information:" -msgstr "Fichiers contenant des licences :" +msgid "'{}' is not a valid SPDX expression." +msgstr "'{}' n'est pas une expression SPDX valide, abandon" -#: src/reuse/lint.py:176 +#: src/reuse/cli/convert_dep5.py:19 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." msgstr "" -"Félicitations ! Votre projet est conforme à la version {} de la " -"spécification REUSE :-)" -#: src/reuse/lint.py:183 -msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" -msgstr "" -"Malheureusement, votre projet n'est pas conforme à la version {} de la " -"spécification REUSE :-(" +#: src/reuse/cli/convert_dep5.py:31 +#, fuzzy +msgid "No '.reuse/dep5' file." +msgstr "aucun fichier '.reuse/dep5'" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" -msgstr "RECOMMANDATIONS" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' n'est pas un identifiant de licence SPDX valide." -#: src/reuse/lint.py:254 -#, fuzzy, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path} : la licence {lic} est manquante\n" +#: src/reuse/cli/download.py:59 +#, fuzzy +msgid "Did you mean:" +msgstr "Vouliez-vous dire :" -#: src/reuse/lint.py:259 +#: src/reuse/cli/download.py:66 +msgid "" +"See for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Consultez pour une liste des identifiants de " +"licence SPDX valides." + +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: read error\n" -msgstr "{path} : erreur de lecture\n" +msgid "Error: {spdx_identifier} already exists." +msgstr "Erreur : {spdx_identifier} existe déjà." -#: src/reuse/lint.py:263 +#: src/reuse/cli/download.py:82 #, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}  : pas d'identifiant de licence\n" +msgid "Error: {path} does not exist." +msgstr "Erreur : '{path}' n'existe pas." -#: src/reuse/lint.py:267 -#, fuzzy, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path} : pas de copyright\n" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Erreur : échec du téléchargement de licence." -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" -msgstr "{path} : mauvaise licence {lic}\n" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Votre connexion internet fonctionne-t-elle ?" -#: src/reuse/lint.py:301 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "{lic_path} : licence dépréciée\n" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Téléchargement de {spdx_identifier} terminé." -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "{lic_path} : licence sans extension de fichier\n" +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Télécharge une licence dans le répertoire LICENSES." -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "{lic_path} : licence inutilisée\n" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' est couvert par {global_path}" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "télécharger toutes les licences manquantes détectées dans le projet" -#: src/reuse/project.py:268 -#, fuzzy, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/download.py:130 +msgid "Path to download to." msgstr "" -"'{path}' est couvert en exclusivité par REUSE.toml. Contenu du fichier non " -"lu." -#: src/reuse/project.py:275 -#, fuzzy, python-brace-format +#: src/reuse/cli/download.py:136 +#, fuzzy msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -"'{path}' a été détecté comme étant un fichier binaire, les informations " -"REUSE n'y sont pas recherchées." +"source pour la copie des licences personnalisées LicenseRef-, au choix un " +"dossier contenant les fichiers ou bien directement un fichier" + +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "MAUVAISES LICENCES" -#: src/reuse/project.py:336 +#: src/reuse/cli/download.py:158 #, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "les options --single-line et --multi-line sont mutuellement exclusives" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "--output ne peut pas être utilisé avec plus d'une licence" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"'.reuse/dep5' est déprécié. L'utilisation de REUSE.toml est recommandée. " -"Utilisez `reuse convert-dep5` pour convertir." -#: src/reuse/project.py:357 -#, fuzzy, python-brace-format +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" +msgstr "" + +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -"'{new_path}' et '{old_path}' ont tous les deux été trouvés. Vous ne pouvez " -"pas guarder les deux fichiers en même temps, ils ne sont pas inter-" -"compatibles." -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "résolution de l'identifiant de '{path}'" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Quelle est l'adresse internet du projet ?" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} n'a pas d'extension de fichier" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"Impossible de résoudre l'identifiant de licence SPDX de {path}, utilisation " -"de {identifier}. Merci de vérifier soit que la licence est dans la liste " -"fournie à, soit qu'elle débute par 'LicenseRef-' " -"et qu'elle contient une extension de fichier." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" -msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" +msgstr "" + +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"Les fichiers suivants ne contiennent pas de données de droits d'auteur et de " +"licence :" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "empêche la sortie" + +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "applique le format JSON à la sortie" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "applique le format texte brut pour la sortie" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:94 #, fuzzy +msgid "Format output as errors per line." +msgstr "génère une ligne par erreur" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -"le projet '{}' n'est pas un dépôt VCS ou le logiciel VCS requis n'est pas " -"installé" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Lecture de '{path}' impossible" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "génère une ligne par erreur" + +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" -#: src/reuse/report.py:155 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Erreur inattendue lors de l'analyse de '{path}'" +msgid "'{file}' is not inside of '{root}'." +msgstr "" + +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s : erreur : %(message)s\n" + +#: src/reuse/cli/main.py:40 +msgid "" +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:47 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Corrigez les mauvaises licences : Au moins une licence du dossier LICENSES " -"et/ou fournie par l'étiquette 'SPDX-License-Identifier' est invalide. Soit " -"il ne s'agit pas d'identifiants de licence SPDX valides, soit ces " -"identifiants personnalisés ne commencent pas par 'LicenseRef-'. FAQ à propos " -"des licences personnalisées : https://reuse.software/faq/#custom-license" - -#: src/reuse/report.py:519 +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -"Corrigez les licences dépréciées : Au moins une licence du dossier LICENSES " -"et/ou fournie par une étiquette 'SPDX-License-Identifier' ou par '.reuse/" -"dep5' a été dépréciée par SPDX. La liste des licences dépréciées ainsi que " -"leur nouvel identifiant recommandé peut être trouvé ici : " -#: src/reuse/report.py:530 -#, fuzzy +#: src/reuse/cli/main.py:62 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" -"Corrigez les fichiers de licence sans extension : Au moins un fichier de " -"licence dans le dossier 'LICENSES' n'a pas l'extension de fichier '.txt'. " -"Veuillez renommes ce(s) fichier(s)." +"reuse est un outil pour la conformité aux recommandations de l'initiative " +"REUSE. Voir pour plus d'informations, et pour la documentation en ligne." -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:69 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" -"Corriger les licences manquantes : Au moins une licence identifiée par une " -"étiquette 'SPDX-License-Identifier' n'a pas son fichier texte associé dans " -"le dossier 'LICENSES'. Pour les identifiants de licence SPDX, vous pouvez " -"exécuter la commande 'reuse download --all' pour simplement récupérer les " -"fichiers licence manquants. Pour les licences personnalisées (commençant par " -"'LicenseRef-'), vous devez ajouter ces fichiers vous-même." +"Cette version de reuse est compatible avec la version {} de la spécification " +"REUSE." -#: src/reuse/report.py:551 +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Soutenir le travail de la FSFE :" + +#: src/reuse/cli/main.py:78 +msgid "" +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." +msgstr "" +"Les dons sont cruciaux pour notre force et notre autonomie. Ils nous " +"permettent de continuer à travailler pour le Logiciel Libre partout où c'est " +"nécessaire. Merci d'envisager de faire un don ." + +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "activer les instructions de débogage" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "masquer les avertissements d'obsolescence" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "ne pas omettre les sous-modules Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "ne pas omettre les sous-projets Meson" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "ne pas utiliser le multiprocessing" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "définition de la racine (root) du projet" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "imprime la nomenclature du projet au format SPDX" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." +msgstr "" + +#: src/reuse/cli/spdx.py:39 #, fuzzy msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." msgstr "" -"Corrigez les licences non trouvées : Au moins un fichier de licence dans le " -"répertoire 'LICENSES' n'est référencé par aucun fichier, par ex. par une " -"étiquette 'SPDX-License-Identifier'. Vérifiez que vous avez correctement " -"étiqueté les fichiers concernés par ces licences, ou supprimez ces fichiers " -"de licence inutiles si vous êtes sûr qu'aucun document n'est concerné par " -"ces licences." +"compléter le champ LicenseConcluded ; notez que la réutilisation ne garantit " +"pas que le champ soit correct" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "nom de la personne signataire du rapport SPDX" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "nom de l'organisation signataire du rapport SPDX" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:82 #, fuzzy msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -"Corrigez les erreurs de lecture : Au moins un fichier dans votre dossier ne " -"peut pas être lu par l'outil. Vérifiez ces permissions. Vous trouverez les " -"fichiers concernés en tête de la sortie, avec les messages d'erreur." +"erreur : spécifier --creator-person=NOM ou --creator-organization=NOM est " +"nécessaire quand --add-license-concluded est fourni" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Corrigez les copyrights et licences manquantes : L'outil n'a pas pu trouver " -"le copyright et/ou la licence d'au moins un fichier. Ils sont typiquement " -"identifiés par les étiquettes 'SPDX-FileCopyrightText' et 'SPDX-License-" -"Identifier' dans chaque fichier. Le tutoriel donne d'autres moyens de les " -"ajouter : " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"{path} ne correspond pas à un motif de fichier SPDX commun. Vérifiez les " +"conventions de nommage conseillées à l'adresse https://spdx.github.io/spdx-" +"spec/conformance/#44-standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "liste toutes les licences SPDX acceptées" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -543,11 +636,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s : erreur : %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -746,177 +834,386 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" +#, fuzzy, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Le fichier {path} non reconnu a été ignoré" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' non reconnu, création de '{path}.license'" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Le fichier ignoré {path} contenait déjà les données REUSE" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "{path} ne supporte pas les commentaires mono-lignes. Merci de ne pas " -#~ "utiliser --single-line" +#~ "Erreur : l'en-tête de commentaire généré dans '{path}' ne contient pas de " +#~ "ligne ou d'expression de droits d'auteur ou de licence. Le modèle est " +#~ "probablement incorrect. Nouvel en-tête non écrit." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "En-tête de {path} modifié avec succès" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Analyse de la syntaxe de '{expression}' impossible" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "{path} ne supporte pas les commentaires multi-lignes. Merci de ne pas " -#~ "utiliser --multi-line" +#~ "'{path}' contient une expression SPDX qui ne peut pas être analysée : le " +#~ "fichier est ignoré" -#~ msgid "--skip-unrecognised has no effect when used together with --style" +#, fuzzy, python-brace-format +#~ msgid "" +#~ "{attr_name} must be a {type_name} (got {value} that is a {value_class})." #~ msgstr "" -#~ "--skip-unrecognised est sans effet quand il est utilisé en même temps que " -#~ "--style" +#~ "{attr_name} doit être un(e) {type_name} (obtenu {value} qui est un(e) " +#~ "{value_class})." -#~ msgid "option --contributor, --copyright or --license is required" +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Item in {attr_name} collection must be a {type_name} (got {item_value} " +#~ "that is a {item_class})." #~ msgstr "" -#~ "une des options --contributor, --copyright ou --license est nécessaire" +#~ "Les éléments de la collection {attr_name} doivent être des {type_name} " +#~ "(obtenu {item_value} qui et un(e) {item_class})." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "le modèle {template} est introuvable" +#~ msgid "{attr_name} must not be empty." +#~ msgstr "{attr_name} ne doit pas être vide." -#~ msgid "can't write to '{}'" -#~ msgstr "écriture impossible dans '{}'" +#, fuzzy, python-brace-format +#~ msgid "{name} must be a {type} (got {value} that is a {value_type})." +#~ msgstr "" +#~ "{name} doit être un(e) {type} (obtenu {value} qui est un {value_type})." +#, fuzzy, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "The value of 'precedence' must be one of {precedence_vals} (got " +#~ "{received})" +#~ msgstr "" +#~ "La valeur de 'precedence' doit être parmi {precedence_vals} (obtenu " +#~ "{received})" + +#~ msgid "generated comment is missing copyright lines or license expressions" #~ msgstr "" -#~ "Les fichiers suivants n'ont pas une extension reconnue. Merci d'utiliser " -#~ "--style, --force-dot-license, --fallback-dot-license ou --skip-" -#~ "unrecognised :" +#~ "les commentaires générés ne contiennent pas de ligne ou d'expression de " +#~ "droits d'auteur ou de licence" -#~ msgid "copyright statement, repeatable" -#~ msgstr "déclaration de droits d'auteur, répétable" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' trouvé dans :" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identifiant SPDX, répétable" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "LICENCES OBSOLÈTES" -#~ msgid "file contributor, repeatable" -#~ msgstr "contributeur au fichier, répétable" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" -#~ msgid "year of copyright statement, optional" -#~ msgstr "année de déclaration de droits d'auteur, facultatif" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENCES SANS EXTENSION DE FICHIER" -#~ msgid "comment style to use, optional" -#~ msgstr "style de commentaire à utiliser, facultatif" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Les licences suivantes n'ont pas d'extension de fichier :" -#~ msgid "copyright prefix to use, optional" -#~ msgstr "préfixe de droits d'auteur à utiliser, facultatif" +#~ msgid "MISSING LICENSES" +#~ msgstr "LICENCES MANQUANTES" -#~ msgid "name of template to use, optional" -#~ msgstr "nom de modèle à utiliser, facultatif" +#~ msgid "UNUSED LICENSES" +#~ msgstr "LICENCES INUTILISÉES" -#~ msgid "do not include year in statement" -#~ msgstr "ne pas inclure d'année dans la déclaration" +#~ msgid "The following licenses are not used:" +#~ msgstr "Les licences suivantes ne sont pas utilisées :" -#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgid "READ ERRORS" +#~ msgstr "ERREURS DE LECTURE" + +#~ msgid "Could not read:" +#~ msgstr "Illisibles :" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" + +#~ msgid "The following files have no copyright information:" #~ msgstr "" -#~ "fusionner les lignes de droits d'auteur si les déclarations de droits " -#~ "d'auteur sont identiques" +#~ "Les fichiers suivants ne contiennent pas de données de droits d'auteur :" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Les fichiers suivants ne contiennent pas de données de licence :" + +#~ msgid "SUMMARY" +#~ msgstr "RÉSUMÉ" -#~ msgid "force single-line comment style, optional" -#~ msgstr "forcer le style de commentaire monoligne, facultatif" +#~ msgid "Bad licenses:" +#~ msgstr "Mauvaises licences :" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "forcer le style de commentaire multiligne, facultatif" +#~ msgid "Deprecated licenses:" +#~ msgstr "Licences obsolètes :" -#~ msgid "add headers to all files under specified directories recursively" +#~ msgid "Licenses without file extension:" +#~ msgstr "Licences sans extension de fichier :" + +#~ msgid "Missing licenses:" +#~ msgstr "Licences manquantes :" + +#~ msgid "Unused licenses:" +#~ msgstr "Licences inutilisées :" + +#~ msgid "Used licenses:" +#~ msgstr "Licences utilisées :" + +#~ msgid "Read errors:" +#~ msgstr "Erreurs de lecture :" + +#, fuzzy +#~ msgid "Files with copyright information:" +#~ msgstr "Fichiers contenant des droits d'auteur :" + +#, fuzzy +#~ msgid "Files with license information:" +#~ msgstr "Fichiers contenant des licences :" + +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "ajouter récursivement les en-têtes dans tous les fichiers des répertoires " -#~ "spécifiés" +#~ "Félicitations ! Votre projet est conforme à la version {} de la " +#~ "spécification REUSE :-)" -#~ msgid "do not replace the first header in the file; just add a new one" +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "ne pas remplacer le premier en-tête dans le fichier, mais simplement en " -#~ "ajouter un" +#~ "Malheureusement, votre projet n'est pas conforme à la version {} de la " +#~ "spécification REUSE :-(" + +#~ msgid "RECOMMENDATIONS" +#~ msgstr "RECOMMANDATIONS" + +#, fuzzy, python-brace-format +#~ msgid "{path}: missing license {lic}\n" +#~ msgstr "{path} : la licence {lic} est manquante\n" + +#, python-brace-format +#~ msgid "{path}: read error\n" +#~ msgstr "{path} : erreur de lecture\n" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "{path}  : pas d'identifiant de licence\n" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no copyright notice\n" +#~ msgstr "{path} : pas de copyright\n" -#~ msgid "always write a .license file instead of a header inside the file" +#, python-brace-format +#~ msgid "{path}: bad license {lic}\n" +#~ msgstr "{path} : mauvaise licence {lic}\n" + +#, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "{lic_path} : licence dépréciée\n" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "{lic_path} : licence sans extension de fichier\n" + +#, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "{lic_path} : licence inutilisée\n" + +#, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' est couvert par {global_path}" + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "'{path}' is covered exclusively by REUSE.toml. Not reading the file " +#~ "contents." #~ msgstr "" -#~ "toujours écrire un fichier .license au lieu d'une entête dans le fichier" +#~ "'{path}' est couvert en exclusivité par REUSE.toml. Contenu du fichier " +#~ "non lu." + +#, fuzzy, python-brace-format +#~ msgid "" +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." +#~ msgstr "" +#~ "'{path}' a été détecté comme étant un fichier binaire, les informations " +#~ "REUSE n'y sont pas recherchées." #, fuzzy -#~ msgid "write a .license file to files with unrecognised comment styles" +#~ msgid "" +#~ "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE." +#~ "toml. Use `reuse convert-dep5` to convert." #~ msgstr "" -#~ "écrire un fichier .license pour les fichiers au style de commentaire " -#~ "inconnu" +#~ "'.reuse/dep5' est déprécié. L'utilisation de REUSE.toml est recommandée. " +#~ "Utilisez `reuse convert-dep5` pour convertir." -#~ msgid "skip files with unrecognised comment styles" +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Found both '{new_path}' and '{old_path}'. You cannot keep both files " +#~ "simultaneously; they are not intercompatible." #~ msgstr "" -#~ "ignorer les fichiers comportant des styles de commentaires non reconnus" +#~ "'{new_path}' et '{old_path}' ont tous les deux été trouvés. Vous ne " +#~ "pouvez pas guarder les deux fichiers en même temps, ils ne sont pas inter-" +#~ "compatibles." -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "résolution de l'identifiant de '{path}'" + +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} n'a pas d'extension de fichier" #, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "'{path}' est un fichier binaire, par conséquent le fichier '{new_path}' " -#~ "est utilisé pour l'en-tête" +#~ "Impossible de résoudre l'identifiant de licence SPDX de {path}, " +#~ "utilisation de {identifier}. Merci de vérifier soit que la licence est " +#~ "dans la liste fournie à, soit qu'elle débute " +#~ "par 'LicenseRef-' et qu'elle contient une extension de fichier." -#~ msgid "prevents output" -#~ msgstr "empêche la sortie" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" #, fuzzy -#~ msgid "formats output as errors per line (default)" -#~ msgstr "génère une ligne par erreur" - #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" #~ msgstr "" -#~ "reuse est un outil pour la conformité aux recommandations de l'initiative " -#~ "REUSE. Voir pour plus d'informations, et " -#~ " pour la documentation en ligne." +#~ "le projet '{}' n'est pas un dépôt VCS ou le logiciel VCS requis n'est pas " +#~ "installé" + +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Lecture de '{path}' impossible" + +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Erreur inattendue lors de l'analyse de '{path}'" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" #~ msgstr "" -#~ "Cette version de reuse est compatible avec la version {} de la " -#~ "spécification REUSE." +#~ "Corrigez les mauvaises licences : Au moins une licence du dossier " +#~ "LICENSES et/ou fournie par l'étiquette 'SPDX-License-Identifier' est " +#~ "invalide. Soit il ne s'agit pas d'identifiants de licence SPDX valides, " +#~ "soit ces identifiants personnalisés ne commencent pas par 'LicenseRef-'. " +#~ "FAQ à propos des licences personnalisées : https://reuse.software/faq/" +#~ "#custom-license" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Soutenir le travail de la FSFE :" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Corrigez les licences dépréciées : Au moins une licence du dossier " +#~ "LICENSES et/ou fournie par une étiquette 'SPDX-License-Identifier' ou par " +#~ "'.reuse/dep5' a été dépréciée par SPDX. La liste des licences dépréciées " +#~ "ainsi que leur nouvel identifiant recommandé peut être trouvé ici : " +#~ "" +#, fuzzy #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." #~ msgstr "" -#~ "Les dons sont cruciaux pour notre force et notre autonomie. Ils nous " -#~ "permettent de continuer à travailler pour le Logiciel Libre partout où " -#~ "c'est nécessaire. Merci d'envisager de faire un don ." +#~ "Corrigez les fichiers de licence sans extension : Au moins un fichier de " +#~ "licence dans le dossier 'LICENSES' n'a pas l'extension de fichier '.txt'. " +#~ "Veuillez renommes ce(s) fichier(s)." -#~ msgid "enable debug statements" -#~ msgstr "activer les instructions de débogage" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Corriger les licences manquantes : Au moins une licence identifiée par " +#~ "une étiquette 'SPDX-License-Identifier' n'a pas son fichier texte associé " +#~ "dans le dossier 'LICENSES'. Pour les identifiants de licence SPDX, vous " +#~ "pouvez exécuter la commande 'reuse download --all' pour simplement " +#~ "récupérer les fichiers licence manquants. Pour les licences " +#~ "personnalisées (commençant par 'LicenseRef-'), vous devez ajouter ces " +#~ "fichiers vous-même." -#~ msgid "hide deprecation warnings" -#~ msgstr "masquer les avertissements d'obsolescence" +#, fuzzy +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." +#~ msgstr "" +#~ "Corrigez les licences non trouvées : Au moins un fichier de licence dans " +#~ "le répertoire 'LICENSES' n'est référencé par aucun fichier, par ex. par " +#~ "une étiquette 'SPDX-License-Identifier'. Vérifiez que vous avez " +#~ "correctement étiqueté les fichiers concernés par ces licences, ou " +#~ "supprimez ces fichiers de licence inutiles si vous êtes sûr qu'aucun " +#~ "document n'est concerné par ces licences." -#~ msgid "do not skip over Git submodules" -#~ msgstr "ne pas omettre les sous-modules Git" +#, fuzzy +#~ msgid "" +#~ "Fix read errors: At least one of the files in your directory cannot be " +#~ "read by the tool. Please check the file permissions. You will find the " +#~ "affected files at the top of the output as part of the logged error " +#~ "messages." +#~ msgstr "" +#~ "Corrigez les erreurs de lecture : Au moins un fichier dans votre dossier " +#~ "ne peut pas être lu par l'outil. Vérifiez ces permissions. Vous trouverez " +#~ "les fichiers concernés en tête de la sortie, avec les messages d'erreur." -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "ne pas omettre les sous-projets Meson" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Corrigez les copyrights et licences manquantes : L'outil n'a pas pu " +#~ "trouver le copyright et/ou la licence d'au moins un fichier. Ils sont " +#~ "typiquement identifiés par les étiquettes 'SPDX-FileCopyrightText' et " +#~ "'SPDX-License-Identifier' dans chaque fichier. Le tutoriel donne d'autres " +#~ "moyens de les ajouter : " -#~ msgid "do not use multiprocessing" -#~ msgstr "ne pas utiliser le multiprocessing" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised est sans effet quand il est utilisé en même temps que " +#~ "--style" -#~ msgid "define root of project" -#~ msgstr "définition de la racine (root) du projet" +#~ msgid "can't write to '{}'" +#~ msgstr "écriture impossible dans '{}'" #~ msgid "show program's version number and exit" #~ msgstr "voir la version du programme et quitter" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "ajoute les informations de droits d'auteur et de licence dans les en-" -#~ "têtes des fichiers" - #~ msgid "" #~ "Add copyright and licensing into the header of one or more files.\n" #~ "\n" @@ -940,9 +1237,6 @@ msgstr[1] "" #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "télécharge une licence et la placer dans le répertoire LICENSES" -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Télécharge une licence dans le répertoire LICENSES." - #~ msgid "list all non-compliant files" #~ msgstr "liste tous les fichiers non-conformes" @@ -991,27 +1285,12 @@ msgstr[1] "" #~ "- Tous les fichiers disposent-ils de données de droits d'auteur et de " #~ "licence valides ?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "imprime la nomenclature du projet au format SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "imprime la nomenclature du projet au format SPDX" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "liste toutes les licences SPDX acceptées" - #~ msgid "convert .reuse/dep5 to REUSE.toml" #~ msgstr "convertit .reuse/dep5 en REUSE.toml" -#, fuzzy, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{path}' ne peut pas être traité. Nous avons reçu le message d'erreur " -#~ "suivant : {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' n'est pas un fichier" @@ -1024,100 +1303,15 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "lecture ou écriture impossible pour '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' n'est pas une expression SPDX valide, abandon" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' n'est pas un identifiant de licence SPDX valide." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Consultez pour une liste des identifiants de " -#~ "licence SPDX valides." - -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "aucun fichier '.reuse/dep5'" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Identification de la licence SPDX" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "télécharger toutes les licences manquantes détectées dans le projet" - -#, fuzzy -#~ msgid "" -#~ "source from which to copy custom LicenseRef- licenses, either a directory " -#~ "that contains the file or the file itself" -#~ msgstr "" -#~ "source pour la copie des licences personnalisées LicenseRef-, au choix un " -#~ "dossier contenant les fichiers ou bien directement un fichier" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Erreur : {spdx_identifier} existe déjà." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Erreur : échec du téléchargement de licence." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Votre connexion internet fonctionne-t-elle ?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Téléchargement de {spdx_identifier} terminé." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output n'a pas d'effet s'il est utilisé en même temps que --all" #~ msgid "the following arguments are required: license" #~ msgstr "les arguments suivants sont nécessaires : licence" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "--output ne peut pas être utilisé avec plus d'une licence" - -#~ msgid "formats output as JSON" -#~ msgstr "applique le format JSON à la sortie" - -#, fuzzy -#~ msgid "formats output as plain text (default)" -#~ msgstr "applique le format texte brut pour la sortie" - -#, fuzzy -#~ msgid "formats output as errors per line" -#~ msgstr "génère une ligne par erreur" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "compléter le champ LicenseConcluded ; notez que la réutilisation ne " -#~ "garantit pas que le champ soit correct" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "nom de la personne signataire du rapport SPDX" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "nom de l'organisation signataire du rapport SPDX" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "erreur : spécifier --creator-person=NOM ou --creator-organization=NOM est " -#~ "nécessaire quand --add-license-concluded est fourni" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "{path} ne correspond pas à un motif de fichier SPDX commun. Vérifiez les " -#~ "conventions de nommage conseillées à l'adresse https://spdx.github.io/" -#~ "spdx-spec/conformance/#44-standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "usage : " @@ -1275,9 +1469,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Quel est le nom du projet ?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Quelle est l'adresse internet du projet ?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Quel est le nom de la personne chargée de la maintenance ?" @@ -1404,10 +1595,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "les options --exclude-year et --year sont mutuellement exclusives" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "" -#~ "les options --single-line et --multi-line sont mutuellement exclusives" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license est obsolète et remplacé par --force-dot-license" diff --git a/po/gl.po b/po/gl.po index b243cc45d..00938d040 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Consulte unha lista de Identificadores de Licenza SPDX válidos en ." -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Licenzas non usadas:" +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Erro: {spdx_identifier} xa existe." -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Licenzas usadas:" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "'{path}' non remata en .spdx" -#: src/reuse/lint.py:153 -#, fuzzy -msgid "Read errors:" -msgstr "Erros de lectura: {count}" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Erro: Fallo descargando a licenza." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Está a funcionar a súa conexión a internet?" + +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Descargouse correctamente o {spdx_identifier}." -#: src/reuse/lint.py:155 +#: src/reuse/cli/download.py:106 #, fuzzy -msgid "Files with copyright information:" -msgstr "Arquivos con información de copyright: {count} / {total}" +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" + +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/cli/download.py:122 #, fuzzy -msgid "Files with license information:" -msgstr "Arquivos con información de licenza: {count} / {total}" +msgid "Download all missing licenses detected in the project." +msgstr "descargar todas as licenzas detectadas mais non atopadas no proxecto" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -"Congratulacións! O seu proxecto cumple coa versión {} da especificación " -"REUSE :-)" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "LICENZAS DEFECTUOSAS" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "as opcións --exclude-year e --year non se poden usar á vez" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "non se pode usar --output con máis dunha licenza" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"Desgraciadamente o seu proxecto non cumple coa versión {} da especificación " -"REUSE :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Cal é o enderezo en internet do proxecto?" + +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' non é un Identificador de Licenza SPDX válido." +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" +msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Licenzas obsoletas:" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"Os seguintes arquivos non teñen información de licenza nen de copyright:" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Licenzas sen extensión de arquivo:" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Licenzas non usadas:" +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' cuberto por .reuse/dep5" +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint_file.py:25 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:416 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "resolvendo o identificador de '{path}'" +msgid "'{file}' is not inside of '{root}'." +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} non ten extensión de arquivo" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: erro: %(message)s\n" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/main.py:40 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Non se pode resolver o Identificador de Licenza SPDX de {path}, resólvese " -"como {identifier}. Asegúrese que a licenza está na lista publicada en " -" ou que comeza con 'LicenseRef-' e ten unha " -"extensión de arquivo." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/main.py:47 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -"{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " -"{other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:54 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Non se pode ler '{path}'" - -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Aconteceu un erro inesperado lendo '{path}'" - -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:62 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"reuse é unha ferramenta para o cumprimento das recomendacións REUSE. Ver " +" para máis información e para a documentación en liña." -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:69 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" +"Esta versión de reuse é compatible coa versión {} da especificación REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Apoie o traballo da FSFE:" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:78 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"As doazóns son críticas para a nosa forza e autonomía. Permítennos seguir " +"traballando polo software libre onde sexa necesario. Considere facer unha " +"doazón a ." -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "habilitar sentencias de depuración" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." +msgstr "" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "non salte os submódulos de Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "non salte os submódulos de Git" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "non empregue multiprocesamento" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "definir a raíz do proxecto" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "imprimir a lista de materiales do proxecto en formato SPDX" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" + +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +msgid "List all licenses on the SPDX License List." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 @@ -485,11 +587,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: erro: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -688,128 +785,190 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "precisase a opción --copyright ou --license" +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Erro: Non se pode crear un comentario para '{path}'" #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "no se atopa o modelo {template}" +#~ msgid "" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." +#~ msgstr "" +#~ "Erro: A cabeceira comentada xerada para '{path}' non contén liñas de " +#~ "copyright ou expresións de licenza. Posibelmente o modelo é incorrecto. " +#~ "Non se escribiu unha nova cabecereira." -#~ msgid "can't write to '{}'" -#~ msgstr "non se pode escribir en '{}'" +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "A cabeceira de {path} cambiada con éxito" -#, fuzzy +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Non se pode analizar '{expression}'" + +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' non ten unha extensión de arquivo recoñecida, precisa usar --" -#~ "style ou --explicit-license" +#~ "'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " +#~ "arquivo" -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaración de copyright, repetibel" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "o comentario xerado non ten liñas de copyright ou expresións de licenza" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX, repetibel" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' atopado en:" -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificador SPDX, repetibel" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "LICENZAS OBSOLETAS" -#~ msgid "year of copyright statement, optional" -#~ msgstr "ano da declaración de copyright, opcional" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "As seguintes licenzas son obsoletas para SPDX:" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENZAS SEN EXTENSIÓN DE ARQUIVO" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "As seguintes licenzas non teñen extesión de arquivo:" -#~ msgid "name of template to use, optional" -#~ msgstr "nome do modelo a usar, opcional" +#~ msgid "MISSING LICENSES" +#~ msgstr "LICENZAS NON ATOPADAS" -#~ msgid "do not include year in statement" -#~ msgstr "non incluir ano na declaración" +#~ msgid "UNUSED LICENSES" +#~ msgstr "LICENZAS SEN USO" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "ano da declaración de copyright, opcional" +#~ msgid "The following licenses are not used:" +#~ msgstr "As seguintes licenzas non se usan:" + +#~ msgid "READ ERRORS" +#~ msgstr "ERROS DE LECTURA" + +#~ msgid "Could not read:" +#~ msgstr "Non se pode ler:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "NON SE ATOPA INFORMACIÓN DE LICENZA OU COPYRIGHT" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Os seguintes arquivos non teñen información de copyright:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Os seguintes arquivos non teñen información de licenza:" + +#~ msgid "SUMMARY" +#~ msgstr "RESUMO" + +#~ msgid "Bad licenses:" +#~ msgstr "Licenzas defectuosas:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Licenzas obsoletas:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Licenzas sen extensión de arquivo:" + +#~ msgid "Missing licenses:" +#~ msgstr "Licenzas non atopadas:" + +#~ msgid "Unused licenses:" +#~ msgstr "Licenzas non usadas:" + +#~ msgid "Used licenses:" +#~ msgstr "Licenzas usadas:" #, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "Read errors:" +#~ msgstr "Erros de lectura: {count}" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "Files with copyright information:" +#~ msgstr "Arquivos con información de copyright: {count} / {total}" #, fuzzy -#~ msgid "skip files that already contain REUSE information" +#~ msgid "Files with license information:" #~ msgstr "Arquivos con información de licenza: {count} / {total}" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' é binario, logo úsase '{new_path}' para a cabeceira" - #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "reuse é unha ferramenta para o cumprimento das recomendacións REUSE. Ver " -#~ " para máis información e para a documentación en liña." +#~ "Congratulacións! O seu proxecto cumple coa versión {} da especificación " +#~ "REUSE :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "Esta versión de reuse é compatible coa versión {} da especificación REUSE." +#~ "Desgraciadamente o seu proxecto non cumple coa versión {} da " +#~ "especificación REUSE :-(" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' non é un Identificador de Licenza SPDX válido." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Licenzas obsoletas:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Licenzas sen extensión de arquivo:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Licenzas non usadas:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' cuberto por .reuse/dep5" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "resolvendo o identificador de '{path}'" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Apoie o traballo da FSFE:" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} non ten extensión de arquivo" +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "As doazóns son críticas para a nosa forza e autonomía. Permítennos seguir " -#~ "traballando polo software libre onde sexa necesario. Considere facer unha " -#~ "doazón a ." - -#~ msgid "enable debug statements" -#~ msgstr "habilitar sentencias de depuración" +#~ "Non se pode resolver o Identificador de Licenza SPDX de {path}, resólvese " +#~ "como {identifier}. Asegúrese que a licenza está na lista publicada en " +#~ " ou que comeza con 'LicenseRef-' e ten unha " +#~ "extensión de arquivo." -#~ msgid "do not skip over Git submodules" -#~ msgstr "non salte os submódulos de Git" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " +#~ "{other_path}" -#, fuzzy -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "non salte os submódulos de Git" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Non se pode ler '{path}'" -#~ msgid "do not use multiprocessing" -#~ msgstr "non empregue multiprocesamento" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Aconteceu un erro inesperado lendo '{path}'" -#~ msgid "define root of project" -#~ msgstr "definir a raíz do proxecto" +#~ msgid "can't write to '{}'" +#~ msgstr "non se pode escribir en '{}'" #~ msgid "show program's version number and exit" #~ msgstr "mostrar o número de versión do programa e saír" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "engadir copyright e licenza na cabeceira dos arquivos" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" - #~ msgid "list all non-compliant files" #~ msgstr "listar todos os arquivos que non cumplen os criterios" @@ -855,10 +1014,6 @@ msgstr[1] "" #~ "\n" #~ "- Todos os arquivos teñen información correcta de copyright e licenza?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "imprimir a lista de materiales do proxecto en formato SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "imprimir a lista de materiales do proxecto en formato SPDX" @@ -874,50 +1029,12 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "non se pode ler ou escribir en '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' non é unha expresión SPDX válida, cancelando" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' non é un Identificador de Licenza SPDX válido." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Consulte unha lista de Identificadores de Licenza SPDX válidos en " -#~ "." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "Creando .reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Identificador de Licenza SPDX da licenza" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "" -#~ "descargar todas as licenzas detectadas mais non atopadas no proxecto" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Erro: {spdx_identifier} xa existe." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Erro: Fallo descargando a licenza." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Está a funcionar a súa conexión a internet?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Descargouse correctamente o {spdx_identifier}." - #~ msgid "the following arguments are required: license" #~ msgstr "requirense os seguintes argumentos: licenza" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "non se pode usar --output con máis dunha licenza" - #~ msgid "usage: " #~ msgstr "uso: " @@ -1053,9 +1170,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Cal é o nome do proxecto?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Cal é o enderezo en internet do proxecto?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Cal é o nome do mantenedor?" @@ -1160,10 +1274,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "as opcións --exclude-year e --year non se poden usar á vez" -#, fuzzy -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "as opcións --exclude-year e --year non se poden usar á vez" - #~ msgid "Downloading {}" #~ msgstr "Descargando {}" diff --git a/po/it.po b/po/it.po index ed2ef8bda..7a4d8c658 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Consulta per la lista degli Identificativi di " +"Licenza SPDX validi." -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Licenze usate:" +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Errore: {spdx_identifier} esiste già." -#: src/reuse/lint.py:153 -#, fuzzy -msgid "Read errors:" -msgstr "Errori di lettura: {count}" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "'{path}' non ha estensione .spdx" + +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Errore: Fallito lo scaricamento della licenza." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "La tua connessione Internet funziona?" -#: src/reuse/lint.py:155 +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Scaricamento completato di {spdx_identifier}." + +#: src/reuse/cli/download.py:106 #, fuzzy -msgid "Files with copyright information:" -msgstr "File con informazioni sul copyright: {count} / {total}" +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "scarica una licenza e salvala nella directory LICENSES/" + +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/cli/download.py:122 #, fuzzy -msgid "Files with license information:" -msgstr "File con informazioni sulla licenza: {count} / {total}" +msgid "Download all missing licenses detected in the project." +msgstr "scarica tutte le licenze mancanti ma usate nel progetto" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -"Congratulazioni! Il tuo progetto è conforme con la versione {} della " -"Specifica REUSE :-)" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "LICENZE NON VALIDA" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "non puoi usare --output con più di una licenza" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " -"Specifica REUSE :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Qual è l'indirizzo Internet del progetto?" + +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' non è un valido Identificativo di Licenza SPDX." +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" +msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Licenze obsolete:" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "I seguenti file non hanno informazioni sul copyright e sulla licenza:" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Licenze senza estensione del file:" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Licenze non utilizzate:" +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' verificato da .reuse/dep5" +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint_file.py:25 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:416 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "determinazione dell'identificativo di '{path}'" +msgid "'{file}' is not inside of '{root}'." +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} non ha l'estensione del file" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: errore: %(message)s\n" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/main.py:40 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Non è possibile rilevare l'Identificativo di Licenza SPDX per {path}, viene " -"impostato a {identifier}. Assicurati che la licenza sia nella lista delle " -"licenze elencate su o che inizi con " -"'LicenseRef-', e che abbia un'estensione del file." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/main.py:47 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -"{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " -"{other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:54 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Non è possibile leggere '{path}'" - -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Errore sconosciuto durante la parsificazione di '{path}'" - -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:62 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"reuse è uno strumento per la conformità alle raccomandazioni REUSE. Visita " +" per maggiori informazioni, e per accedere alla documentazione in linea." -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:69 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" +"Questa versione di reuse è compatibile con la versione {} della Specifica " +"REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Sostieni il lavoro della FSFE:" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:78 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Le donazioni sono fondamentali per la nostra forza e la nostra autonomia. Ci " +"permettono di continuare a lavorare per il Software Libero ovunque sia " +"necessario. Prendi in considerazione di fare una donazione su ." -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "abilita le istruzioni di debug" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." +msgstr "" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "non omettere i sottomoduli Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "non omettere i sottomoduli Git" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "non utilizzare il multiprocessing" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "impostare la directory principale del progetto" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" + +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +msgid "List all licenses on the SPDX License List." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 @@ -485,11 +591,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: errore: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -688,134 +789,191 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "è necessario specificare il parametro --copyright o --license" +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Errore: Non è possibile creare il commento per '{path}'" #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "il modello {template} non è stato trovato" +#~ msgid "" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." +#~ msgstr "" +#~ "Errore: Mancano le linee sul copyright o le espressioni di licenza " +#~ "nell'intestazione generata per '{path}'. Il modello è probabilmente " +#~ "incorretto. Non è stata scritta una nuova intestazione." -#~ msgid "can't write to '{}'" -#~ msgstr "non è possibile scrivere su '{}'" +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Instestazione di {path} aggiornata" -#, fuzzy +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Non è possibile parsificare '{expression}'" + +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +#~ msgstr "" +#~ "'{path}' contiene un'espressione SPDX che non può essere parsificata, il " +#~ "file viene saltato" + +#~ msgid "generated comment is missing copyright lines or license expressions" #~ msgstr "" -#~ "'{path}' non ha una estensione conosciuta, usa --style o --explicit-" -#~ "license" +#~ "nel commento generato mancano le linee sul copyright o le espressioni di " +#~ "licenza" -#~ msgid "copyright statement, repeatable" -#~ msgstr "dichiarazione del copyright, ripetibile" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' trovato in:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificativo SPDX, ripetibile" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "LICENZE OBSOLETE" -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificativo SPDX, ripetibile" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Le seguenti licenze sono obsolete secondo SPDX:" -#~ msgid "year of copyright statement, optional" -#~ msgstr "anno della dichiaraione del copyright, opzionale" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENZE SENZA ESTENSIONE DEL FILE" -#~ msgid "comment style to use, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Le seguenti licenze non hanno l'estensione del file:" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "MISSING LICENSES" +#~ msgstr "LICENZE MANCANTI" -#~ msgid "name of template to use, optional" -#~ msgstr "nome del template da usare, opzionale" +#~ msgid "UNUSED LICENSES" +#~ msgstr "LICENZE NON UTILIZZATE" -#~ msgid "do not include year in statement" -#~ msgstr "non include l'anno nella dichiarazione" +#~ msgid "The following licenses are not used:" +#~ msgstr "Le seguenti licenze non sono utilizzate:" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "anno della dichiaraione del copyright, opzionale" +#~ msgid "READ ERRORS" +#~ msgstr "ERRORI DI LETTURA" + +#~ msgid "Could not read:" +#~ msgstr "Non è possibile leggere:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "MANCANO LE INFORMAZIONI SU COPYRIGHT E LICENZA" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "I seguenti file non hanno informazioni sul copyright:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "I seguenti file non hanno informazioni sulla licenza:" + +#~ msgid "SUMMARY" +#~ msgstr "RAPPORTO" + +#~ msgid "Bad licenses:" +#~ msgstr "Licenze non valide:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Licenze obsolete:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Licenze senza estensione del file:" + +#~ msgid "Missing licenses:" +#~ msgstr "Licenze mancanti:" + +#~ msgid "Unused licenses:" +#~ msgstr "Licenze non utilizzate:" + +#~ msgid "Used licenses:" +#~ msgstr "Licenze usate:" #, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "Read errors:" +#~ msgstr "Errori di lettura: {count}" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "Files with copyright information:" +#~ msgstr "File con informazioni sul copyright: {count} / {total}" #, fuzzy -#~ msgid "skip files that already contain REUSE information" +#~ msgid "Files with license information:" #~ msgstr "File con informazioni sulla licenza: {count} / {total}" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' è un file binario, occorre utilizzare '{new_path}' per " -#~ "l'intestazione" - #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "reuse è uno strumento per la conformità alle raccomandazioni REUSE. " -#~ "Visita per maggiori informazioni, e per accedere alla documentazione in linea." +#~ "Congratulazioni! Il tuo progetto è conforme con la versione {} della " +#~ "Specifica REUSE :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "Questa versione di reuse è compatibile con la versione {} della Specifica " -#~ "REUSE." +#~ "Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " +#~ "Specifica REUSE :-(" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' non è un valido Identificativo di Licenza SPDX." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Licenze obsolete:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Licenze senza estensione del file:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Licenze non utilizzate:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' verificato da .reuse/dep5" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "determinazione dell'identificativo di '{path}'" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Sostieni il lavoro della FSFE:" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} non ha l'estensione del file" +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Le donazioni sono fondamentali per la nostra forza e la nostra autonomia. " -#~ "Ci permettono di continuare a lavorare per il Software Libero ovunque sia " -#~ "necessario. Prendi in considerazione di fare una donazione su ." - -#~ msgid "enable debug statements" -#~ msgstr "abilita le istruzioni di debug" +#~ "Non è possibile rilevare l'Identificativo di Licenza SPDX per {path}, " +#~ "viene impostato a {identifier}. Assicurati che la licenza sia nella lista " +#~ "delle licenze elencate su o che inizi con " +#~ "'LicenseRef-', e che abbia un'estensione del file." -#~ msgid "do not skip over Git submodules" -#~ msgstr "non omettere i sottomoduli Git" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " +#~ "{other_path}" -#, fuzzy -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "non omettere i sottomoduli Git" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Non è possibile leggere '{path}'" -#~ msgid "do not use multiprocessing" -#~ msgstr "non utilizzare il multiprocessing" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Errore sconosciuto durante la parsificazione di '{path}'" -#~ msgid "define root of project" -#~ msgstr "impostare la directory principale del progetto" +#~ msgid "can't write to '{}'" +#~ msgstr "non è possibile scrivere su '{}'" #~ msgid "show program's version number and exit" #~ msgstr "mostra la versione del programma ed esce" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "aggiunge le informazioni sul copyright e sulla licenza nell'intestazione " -#~ "dei file" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "scarica una licenza e salvala nella directory LICENSES/" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "scarica una licenza e salvala nella directory LICENSES/" - #~ msgid "list all non-compliant files" #~ msgstr "lista dei file non conformi" @@ -862,10 +1020,6 @@ msgstr[1] "" #~ "\n" #~ "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" @@ -881,49 +1035,12 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "non è possibile leggere o scrivere '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' non è una espressione valida SPDX, interruzione" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' non è un valido Identificativo di Licenza SPDX." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Consulta per la lista degli Identificativi " -#~ "di Licenza SPDX validi." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "Creazione di .reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Identificativo di Licenza SPDX" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "scarica tutte le licenze mancanti ma usate nel progetto" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Errore: {spdx_identifier} esiste già." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Errore: Fallito lo scaricamento della licenza." - -#~ msgid "Is your internet connection working?" -#~ msgstr "La tua connessione Internet funziona?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Scaricamento completato di {spdx_identifier}." - #~ msgid "the following arguments are required: license" #~ msgstr "sono richiesti i seguenti parametri: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "non puoi usare --output con più di una licenza" - #~ msgid "usage: " #~ msgstr "uso: " @@ -1061,9 +1178,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Qual è il nome del progetto?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Qual è l'indirizzo Internet del progetto?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Qual è il nome del responsabile del progetto?" @@ -1169,10 +1283,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" -#, fuzzy -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" - #~ msgid "Downloading {}" #~ msgstr "Scaricamento {}" diff --git a/po/nl.po b/po/nl.po index f85668fec..7169d3b50 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Zie voor een lijst met geldige SPDX Licentie " +"Identificaties." + +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Fout: {spdx_identifier} bestaat al." + +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "'{path}' eindigt niet met .spdx" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Ongebruikte licenties:" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Fout: downloaden van licentie mislukt." -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Gebruikte licenties:" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Werkt uw internetverbinding?" -#: src/reuse/lint.py:153 -#, fuzzy -msgid "Read errors:" -msgstr "Lees fouten: {count}" +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "{spdx_identifier} met succes gedowload." -#: src/reuse/lint.py:155 +#: src/reuse/cli/download.py:106 #, fuzzy -msgid "Files with copyright information:" -msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/lint.py:159 +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" + +#: src/reuse/cli/download.py:122 #, fuzzy -msgid "Files with license information:" -msgstr "Bestanden met licentie-informatie: {count} / {total}" +msgid "Download all missing licenses detected in the project." +msgstr "" +"download alle ontbrekende licenties die in het project zijn gedetecteerd" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -"Gefeliciteerd! Uw project leeft nu versie {} van de REUSE-specificatie na :-)" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "SLECHTE LICENTIES" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "de opties --exclude-year en --year sluiten elkaar uit" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "kan --output niet met meer dan een licentie gebruiken" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"Helaas leeft uw project versie {} van de REUSE-specificatie niet na :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Wat is het internetadres van het project?" + +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' is geen geldige SPDX Licentie Identificatie." +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" +msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Verouderde licenties:" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"De volgende bestanden bevatten geen auteursrecht- en licentie-informatie:" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Licenties zonder bestandsextensie:" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Ongebruikte licenties:" +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' valt onder .reuse/dep5" +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint_file.py:25 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:416 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "identificatie van '{path}' bepalen" +msgid "'{file}' is not inside of '{root}'." +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} heeft geen bestandsextensie" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: fout: %(message)s\n" -# Niet helemaal duidelijk hoe resolving hier wordt bedoeld. -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/main.py:40 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Kon de SPDX Licentie Identificatie van {path} niet bepalen, dus gebruiken we " -"{identifier}. Zorg ervoor dat de licentie zich in de licentielijst bevind " -"die gevonden kan worden op of dat deze begint " -"met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/main.py:47 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -"{identifier} is de SPDX Licentie Identificatie van zowel {path} als " -"{other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:54 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Kon '{path}' niet lezen" - -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" - -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:62 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"reuse is een tool voor naleving van de REUSE Initiatief aanbevelingen. Zie " +" voor meer informatie en voor de online documentatie." -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:69 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" +"Deze versie van reuse is compatibel met versie {} van de REUSE Specificatie." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Ondersteun het werk van de FSFE:" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:78 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Donaties zijn belangrijk voor onze sterkte en autonomie. Ze staan ons toe om " +"verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " +"donatie te maken bij ." -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "zet debug statements aan" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "sla Git-submodules niet over" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "sla Git-submodules niet over" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "gebruik geen multiprocessing" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "bepaal de root van het project" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "print de materiaallijst van het project in SPDX-formaat" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." +msgstr "" + +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" + +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +msgid "List all licenses on the SPDX License List." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 @@ -485,11 +591,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: fout: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -688,132 +789,190 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "de optie --copyright of --license is vereist" +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Fout: Kon geen commentaar voor '{path}' creëren" #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "sjabloon {template} kon niet worden gevonden" +#~ msgid "" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." +#~ msgstr "" +#~ "Fout: de gegenereerde commentaarheader voor '{path}' mist " +#~ "auteursrechtregels of licentie-uitdrukkingen. Het sjabloon is " +#~ "waarschijnlijk niet correct. Schreef geen nieuwe header." -#~ msgid "can't write to '{}'" -#~ msgstr "kan niet schrijven naar '{}'" +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Succesvolle verandering van de header van {path}" -#, fuzzy +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Kon '{expression}' niet parsen" + +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' heeft geen erkende bestandsextensie; gebruik alstublieft --style " -#~ "of --explicit-license" +#~ "'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " +#~ "bestand over" -#~ msgid "copyright statement, repeatable" -#~ msgstr "auteursrechtverklaring (herhaalbaar)" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Identificatie (herhaalbaar)" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' gevonden in:" -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "SPDX Identificatie (herhaalbaar)" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "VEROUDERDE LICENTIES" -#~ msgid "year of copyright statement, optional" -#~ msgstr "jaar van auteursrechtverklaring (optie)" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "De volgende licenties zijn verouderd door SPDX:" -#~ msgid "comment style to use, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENTIES ZONDER BESTANDSEXTENSIE" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "De volgende licenties hebben geen bestandsextensie:" -#~ msgid "name of template to use, optional" -#~ msgstr "naam van het te gebruiken sjabloon (optie)" +#~ msgid "MISSING LICENSES" +#~ msgstr "ONTBREKENDE LICENTIES" -#~ msgid "do not include year in statement" -#~ msgstr "voeg geen jaar toe aan verklaring" +#~ msgid "UNUSED LICENSES" +#~ msgstr "ONGEBRUIKTE LICENTIES" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "jaar van auteursrechtverklaring (optie)" +#~ msgid "The following licenses are not used:" +#~ msgstr "De volgende licenties zijn niet gebruikt:" + +#~ msgid "READ ERRORS" +#~ msgstr "LEES FOUTEN" + +#~ msgid "Could not read:" +#~ msgstr "Kon niet lezen:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "AUTEURSRECHT- EN LICENTIE-INFORMATIE ONTBREEKT" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "De volgende bestanden hebben geen auteursrechtinformatie:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "De volgende bestanden bevatten geen licentie-informatie:" + +#~ msgid "SUMMARY" +#~ msgstr "SAMENVATTING" + +#~ msgid "Bad licenses:" +#~ msgstr "Slechte licenties:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Verouderde licenties:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Licenties zonder bestandsextensie:" + +#~ msgid "Missing licenses:" +#~ msgstr "Ontbrekende licenties:" + +#~ msgid "Unused licenses:" +#~ msgstr "Ongebruikte licenties:" + +#~ msgid "Used licenses:" +#~ msgstr "Gebruikte licenties:" #, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "Read errors:" +#~ msgstr "Lees fouten: {count}" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "Files with copyright information:" +#~ msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" #, fuzzy -#~ msgid "skip files that already contain REUSE information" +#~ msgid "Files with license information:" #~ msgstr "Bestanden met licentie-informatie: {count} / {total}" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' is een binary; daarom wordt '{new_path}' gebruikt voor de header" - #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "reuse is een tool voor naleving van de REUSE Initiatief aanbevelingen. " -#~ "Zie voor meer informatie en voor de online documentatie." +#~ "Gefeliciteerd! Uw project leeft nu versie {} van de REUSE-specificatie " +#~ "na :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "Deze versie van reuse is compatibel met versie {} van de REUSE " -#~ "Specificatie." +#~ "Helaas leeft uw project versie {} van de REUSE-specificatie niet na :-(" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' is geen geldige SPDX Licentie Identificatie." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Verouderde licenties:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Licenties zonder bestandsextensie:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Ongebruikte licenties:" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Ondersteun het werk van de FSFE:" +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' valt onder .reuse/dep5" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "identificatie van '{path}' bepalen" + +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} heeft geen bestandsextensie" +# Niet helemaal duidelijk hoe resolving hier wordt bedoeld. +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Donaties zijn belangrijk voor onze sterkte en autonomie. Ze staan ons toe " -#~ "om verder te werken voor vrije software waar nodig. Overweeg alstublieft " -#~ "om een donatie te maken bij ." - -#~ msgid "enable debug statements" -#~ msgstr "zet debug statements aan" +#~ "Kon de SPDX Licentie Identificatie van {path} niet bepalen, dus gebruiken " +#~ "we {identifier}. Zorg ervoor dat de licentie zich in de licentielijst " +#~ "bevind die gevonden kan worden op of dat " +#~ "deze begint met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#~ msgid "do not skip over Git submodules" -#~ msgstr "sla Git-submodules niet over" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " +#~ "{other_path}" -#, fuzzy -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "sla Git-submodules niet over" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Kon '{path}' niet lezen" -#~ msgid "do not use multiprocessing" -#~ msgstr "gebruik geen multiprocessing" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" -#~ msgid "define root of project" -#~ msgstr "bepaal de root van het project" +#~ msgid "can't write to '{}'" +#~ msgstr "kan niet schrijven naar '{}'" #~ msgid "show program's version number and exit" #~ msgstr "versienummer van het programma laten zien en verlaten" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "voeg auteursrechts- en licentie-informatie toe aan de headers van " -#~ "bestanden" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "download een licentie en plaats het in de LICENSES/-map" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "download een licentie en plaats het in de LICENSES/-map" - #~ msgid "list all non-compliant files" #~ msgstr "lijst maken van alle bestanden die tekortschieten" @@ -861,10 +1020,6 @@ msgstr[1] "" #~ "- Bevatten alle bestanden geldige informatie over auteursricht en " #~ "licenties?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "print de materiaallijst van het project in SPDX-formaat" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "print de materiaallijst van het project in SPDX-formaat" @@ -880,50 +1035,12 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "kan '{}' niet lezen of schrijven" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' is geen geldige SPDX Licentie Identificatie." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Zie voor een lijst met geldige SPDX Licentie " -#~ "Identificaties." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr ".reuse/dep5 aan het creëren" - #~ msgid "SPDX License Identifier of license" #~ msgstr "SPDX Licentie Identificatie of licentie" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "" -#~ "download alle ontbrekende licenties die in het project zijn gedetecteerd" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Fout: {spdx_identifier} bestaat al." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Fout: downloaden van licentie mislukt." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Werkt uw internetverbinding?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "{spdx_identifier} met succes gedowload." - #~ msgid "the following arguments are required: license" #~ msgstr "de volgende argumenten zijn verplicht: licentie" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "kan --output niet met meer dan een licentie gebruiken" - #~ msgid "usage: " #~ msgstr "gebruik: " @@ -1068,9 +1185,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Wat is de naam van het project?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Wat is het internetadres van het project?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Wat is de naam van de beheerder?" @@ -1175,10 +1289,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "de opties --exclude-year en --year sluiten elkaar uit" -#, fuzzy -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "de opties --exclude-year en --year sluiten elkaar uit" - #~ msgid "Downloading {}" #~ msgstr "{} aan het downloaden" diff --git a/po/pt.po b/po/pt.po index d35819a9e..b55cecec9 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese 1;\n" "X-Generator: Weblate 4.18.1\n" -#: src/reuse/_annotate.py:95 -#, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "" +#: src/reuse/cli/annotate.py:62 +#, fuzzy +msgid "Option '--copyright', '--license', or '--contributor' is required." +msgstr "é requerida uma das opções --copyright ou --license" -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" +#: src/reuse/cli/annotate.py:123 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" msgstr "" +"'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" +"explicit-license" -#: src/reuse/_annotate.py:117 +#: src/reuse/cli/annotate.py:156 #, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" +msgid "" +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." msgstr "" -#: src/reuse/_annotate.py:151 -#, python-brace-format -msgid "Error: Could not create comment for '{path}'" -msgstr "Erro: Não foi possível criar um comentário para '{path}'" - -#: src/reuse/_annotate.py:158 +#: src/reuse/cli/annotate.py:163 #, python-brace-format msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." msgstr "" -"Erro: O cabeçalho de comentário gerado para '{path}' não contém linhas de " -"direitos de autor ou expressões de licenciamento. Provavelmente o modelo não " -"está correcto. Não foi escrito nenhum novo cabeçalho." -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 -#, python-brace-format -msgid "Successfully changed header of {path}" -msgstr "O cabeçalho de {path} foi alterado com êxito" +#: src/reuse/cli/annotate.py:209 +#, fuzzy, python-brace-format +msgid "Template '{template}' could not be found." +msgstr "o modelo {template} não foi encontrado" -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" -msgstr "Não foi possível executar parse '{expression}'" +#: src/reuse/cli/annotate.py:272 +#, fuzzy +msgid "Add copyright and licensing into the headers of files." +msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" -#: src/reuse/_util.py:384 -#, python-brace-format +#: src/reuse/cli/annotate.py:275 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -"'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " -"ficheiro ignorado" -#: src/reuse/global_licensing.py:120 -#, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -#: src/reuse/global_licensing.py:134 -#, python-brace-format -msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" msgstr "" -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." +#: src/reuse/cli/annotate.py:296 +#, fuzzy +msgid "Copyright statement, repeatable." +msgstr "declaração de direitos de autor (repetível)" + +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/global_licensing.py:170 -#, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." +#: src/reuse/cli/annotate.py:305 +#, fuzzy +msgid "SPDX License Identifier, repeatable." +msgstr "Identificador SPDX (repetível)" + +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/global_licensing.py:194 -#, python-brace-format -msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" +#: src/reuse/cli/annotate.py:313 +#, fuzzy +msgid "File contributor, repeatable." +msgstr "Identificador SPDX (repetível)" + +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" msgstr "" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:325 +#, fuzzy +msgid "Year of copyright statement." +msgstr "ano da declaração de direitos de autor (opcional)" + +#: src/reuse/cli/annotate.py:333 +#, fuzzy +msgid "Comment style to use." +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/cli/annotate.py:338 +#, fuzzy +msgid "Copyright prefix to use." +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" msgstr "" -"o comentário gerado não tem linhas de direitos de autor ou expressões de " -"licenciamento" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" -msgstr "LICENÇAS IRREGULARES" +#: src/reuse/cli/annotate.py:351 +#, fuzzy +msgid "Name of template to use." +msgstr "nome do modelo a usar (opcional)" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" -msgstr "'{}' encontrado em:" +#: src/reuse/cli/annotate.py:358 +#, fuzzy +msgid "Do not include year in copyright statement." +msgstr "não incluir o ano na declaração" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" -msgstr "LICENÇAS DESCONTINUADAS" +#: src/reuse/cli/annotate.py:363 +#, fuzzy +msgid "Merge copyright lines if copyright statements are identical." +msgstr "ano da declaração de direitos de autor (opcional)" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" -msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" +#: src/reuse/cli/annotate.py:370 +#, fuzzy +msgid "Force single-line comment style." +msgstr "estilo de comentário a usar (opcional)" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" -msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" +#: src/reuse/cli/annotate.py:377 +#, fuzzy +msgid "Force multi-line comment style." +msgstr "estilo de comentário a usar (opcional)" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" -msgstr "As seguintes licenças não têm extensão de ficheiro:" +#: src/reuse/cli/annotate.py:383 +msgid "Add headers to all files under specified directories recursively." +msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" -msgstr "LICENÇAS EM FALTA" +#: src/reuse/cli/annotate.py:388 +msgid "Do not replace the first header in the file; just add a new one." +msgstr "" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" -msgstr "LICENÇAS NÃO USADAS" +#: src/reuse/cli/annotate.py:395 +msgid "Always write a .license file instead of a header inside the file." +msgstr "" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" -msgstr "As seguintes licenças não estão a ser usadas:" +#: src/reuse/cli/annotate.py:402 +msgid "Write a .license file to files with unrecognised comment styles." +msgstr "" + +#: src/reuse/cli/annotate.py:409 +msgid "Skip files with unrecognised comment styles." +msgstr "" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" -msgstr "ERROS DE LEITURA" +#: src/reuse/cli/annotate.py:420 +#, fuzzy +msgid "Skip files that already contain REUSE information." +msgstr "Ficheiros com informação de licenciamento: {count} / {total}" -#: src/reuse/lint.py:85 -msgid "Could not read:" -msgstr "Não foi possível ler:" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" +msgstr "" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" -msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" +#: src/reuse/cli/common.py:58 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" msgstr "" -"Os seguintes ficheiros não contêm informação de direitos de autor nem de " -"licenciamento:" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" -msgstr "Os seguintes ficheiros não contêm informação de direitos de autor:" +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" +msgstr "" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" -msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" +#: src/reuse/cli/common.py:114 +#, fuzzy +msgid "'{}' is not a valid SPDX expression." +msgstr "'{}' não é uma expressão SPDX válida; a abortar" -#: src/reuse/lint.py:140 -msgid "SUMMARY" -msgstr "RESUMO" +#: src/reuse/cli/convert_dep5.py:19 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" -msgstr "Licenças irregulares:" +#: src/reuse/cli/convert_dep5.py:31 +#, fuzzy +msgid "No '.reuse/dep5' file." +msgstr "A criar .reuse/dep5" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" -msgstr "Licenças descontinuadas:" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' não é um Identificador de Licença SPDX válido." -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" -msgstr "Licenças sem extensão de ficheiro:" +#: src/reuse/cli/download.py:59 +msgid "Did you mean:" +msgstr "" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" -msgstr "Licenças em falta:" +#: src/reuse/cli/download.py:66 +msgid "" +"See for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Consultar uma lista de Identificadores de Licença SPDX válidos em ." -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Licenças não usadas:" +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Erro: {spdx_identifier} já existe." -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Licenças usadas:" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "'{path}' não termina em .spdx" -#: src/reuse/lint.py:153 -#, fuzzy -msgid "Read errors:" -msgstr "Erros de leitura: {count}" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Erro: Falha ao descarregar a licença." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "A ligação à Internet está a funcionar?" + +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "{spdx_identifier} transferido com êxito." -#: src/reuse/lint.py:155 +#: src/reuse/cli/download.py:106 #, fuzzy -msgid "Files with copyright information:" -msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" + +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/cli/download.py:122 #, fuzzy -msgid "Files with license information:" -msgstr "Ficheiros com informação de licenciamento: {count} / {total}" +msgid "Download all missing licenses detected in the project." +msgstr "descarregar todas as licenças detectadas como em falta no projecto" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -"Parabéns! O projecto está conforme com a versão {} da especificação REUSE :-)" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "LICENÇAS IRREGULARES" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "as opções --exclude-year e --year são mutuamente exclusivas" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "não se pode usar --output com mais do que uma licença" + +#: src/reuse/cli/lint.py:27 +#, python-brace-format msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"Infelizmente, o projecto não está conforme com a versão {} da especificação " -"REUSE :-(" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:254 -#, python-brace-format -msgid "{path}: missing license {lic}\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Qual é o endereço do projecto na internet?" + +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:263 -#, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' não é um Identificador de Licença SPDX válido." +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" +msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Licenças descontinuadas:" +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" +"Os seguintes ficheiros não contêm informação de direitos de autor nem de " +"licenciamento:" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Licenças sem extensão de ficheiro:" +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Licenças não usadas:" +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' abrangido por .reuse/dep5" +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format +#: src/reuse/cli/lint_file.py:25 msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format -msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:416 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "a determinar o identificador de '{path}'" +msgid "'{file}' is not inside of '{root}'." +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} não tem extensão de ficheiro" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: erro: %(message)s\n" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/main.py:40 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -"Não foi possível determinar o Identificador de Licença SPDX de {path}; a " -"determinar como {identifier}. Confirmar que a licença está na lista " -"publicada em ou que começa por 'LicenseRef-' e " -"tem uma extensão de ficheiro." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/main.py:47 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -"{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:54 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Não foi possível ler '{path}'" - -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" - -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:62 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"O reuse é uma ferramenta para observância das recomendações REUSE. Ver " +" para mais informação e para documentação em linha." -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:69 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" +"Esta versão do reuse é compatível com a versão {} da especificação REUSE." -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Apoiar o trabalho da FSFE:" + +#: src/reuse/cli/main.py:78 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Os donativos são cruciais para a nossa força e autonomia. Permitem-nos " +"continuar a trabalhar em prol do Sotware Livre sempre que necessário. " +"Considere fazer um donativo em ." -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "activar expressões de depuração" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." +msgstr "" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "não ignorar sub-módulos do Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "não ignorar sub-módulos do Git" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "não usar multi-processamento" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "definir a raíz do projecto" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "imprimir a lista de materiais do projecto em formato SPDX" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" + +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +msgid "List all licenses on the SPDX License List." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 @@ -485,11 +588,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: erro: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -688,129 +786,190 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "é requerida uma das opções --copyright ou --license" +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Erro: Não foi possível criar um comentário para '{path}'" #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "o modelo {template} não foi encontrado" +#~ msgid "" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." +#~ msgstr "" +#~ "Erro: O cabeçalho de comentário gerado para '{path}' não contém linhas de " +#~ "direitos de autor ou expressões de licenciamento. Provavelmente o modelo " +#~ "não está correcto. Não foi escrito nenhum novo cabeçalho." -#~ msgid "can't write to '{}'" -#~ msgstr "não é possível escrever em '{}'" +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "O cabeçalho de {path} foi alterado com êxito" -#, fuzzy +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Não foi possível executar parse '{expression}'" + +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" -#~ "explicit-license" +#~ "'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " +#~ "ficheiro ignorado" -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaração de direitos de autor (repetível)" +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "o comentário gerado não tem linhas de direitos de autor ou expressões de " +#~ "licenciamento" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX (repetível)" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' encontrado em:" -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificador SPDX (repetível)" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "LICENÇAS DESCONTINUADAS" -#~ msgid "year of copyright statement, optional" -#~ msgstr "ano da declaração de direitos de autor (opcional)" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "As seguintes licenças não têm extensão de ficheiro:" -#~ msgid "name of template to use, optional" -#~ msgstr "nome do modelo a usar (opcional)" +#~ msgid "MISSING LICENSES" +#~ msgstr "LICENÇAS EM FALTA" -#~ msgid "do not include year in statement" -#~ msgstr "não incluir o ano na declaração" +#~ msgid "UNUSED LICENSES" +#~ msgstr "LICENÇAS NÃO USADAS" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "ano da declaração de direitos de autor (opcional)" +#~ msgid "The following licenses are not used:" +#~ msgstr "As seguintes licenças não estão a ser usadas:" + +#~ msgid "READ ERRORS" +#~ msgstr "ERROS DE LEITURA" + +#~ msgid "Could not read:" +#~ msgstr "Não foi possível ler:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Os seguintes ficheiros não contêm informação de direitos de autor:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" + +#~ msgid "SUMMARY" +#~ msgstr "RESUMO" + +#~ msgid "Bad licenses:" +#~ msgstr "Licenças irregulares:" + +#~ msgid "Deprecated licenses:" +#~ msgstr "Licenças descontinuadas:" + +#~ msgid "Licenses without file extension:" +#~ msgstr "Licenças sem extensão de ficheiro:" + +#~ msgid "Missing licenses:" +#~ msgstr "Licenças em falta:" + +#~ msgid "Unused licenses:" +#~ msgstr "Licenças não usadas:" + +#~ msgid "Used licenses:" +#~ msgstr "Licenças usadas:" #, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "Read errors:" +#~ msgstr "Erros de leitura: {count}" #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "Files with copyright information:" +#~ msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" #, fuzzy -#~ msgid "skip files that already contain REUSE information" +#~ msgid "Files with license information:" #~ msgstr "Ficheiros com informação de licenciamento: {count} / {total}" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" - #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "O reuse é uma ferramenta para observância das recomendações REUSE. Ver " -#~ " para mais informação e para documentação em linha." +#~ "Parabéns! O projecto está conforme com a versão {} da especificação " +#~ "REUSE :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "Esta versão do reuse é compatível com a versão {} da especificação REUSE." +#~ "Infelizmente, o projecto não está conforme com a versão {} da " +#~ "especificação REUSE :-(" + +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' não é um Identificador de Licença SPDX válido." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Licenças descontinuadas:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Licenças sem extensão de ficheiro:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Licenças não usadas:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' abrangido por .reuse/dep5" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "a determinar o identificador de '{path}'" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Apoiar o trabalho da FSFE:" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} não tem extensão de ficheiro" +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Os donativos são cruciais para a nossa força e autonomia. Permitem-nos " -#~ "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " -#~ "Considere fazer um donativo em ." - -#~ msgid "enable debug statements" -#~ msgstr "activar expressões de depuração" +#~ "Não foi possível determinar o Identificador de Licença SPDX de {path}; a " +#~ "determinar como {identifier}. Confirmar que a licença está na lista " +#~ "publicada em ou que começa por 'LicenseRef-' " +#~ "e tem uma extensão de ficheiro." -#~ msgid "do not skip over Git submodules" -#~ msgstr "não ignorar sub-módulos do Git" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#, fuzzy -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "não ignorar sub-módulos do Git" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Não foi possível ler '{path}'" -#~ msgid "do not use multiprocessing" -#~ msgstr "não usar multi-processamento" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" -#~ msgid "define root of project" -#~ msgstr "definir a raíz do projecto" +#~ msgid "can't write to '{}'" +#~ msgstr "não é possível escrever em '{}'" #~ msgid "show program's version number and exit" #~ msgstr "mostrar o número de versão do programa e sair" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" - #~ msgid "list all non-compliant files" #~ msgstr "listar todos os ficheiros não conformes" @@ -858,10 +1017,6 @@ msgstr[1] "" #~ "- Todos os ficheiros têm informação válida de direitos de autor e de " #~ "licenciamento?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "imprimir a lista de materiais do projecto em formato SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "imprimir a lista de materiais do projecto em formato SPDX" @@ -877,49 +1032,12 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "não é possível ler ou escrever em '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' não é uma expressão SPDX válida; a abortar" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' não é um Identificador de Licença SPDX válido." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Consultar uma lista de Identificadores de Licença SPDX válidos em " -#~ "." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "A criar .reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Identificador de Licença SPDX da licença" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "descarregar todas as licenças detectadas como em falta no projecto" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Erro: {spdx_identifier} já existe." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Erro: Falha ao descarregar a licença." - -#~ msgid "Is your internet connection working?" -#~ msgstr "A ligação à Internet está a funcionar?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "{spdx_identifier} transferido com êxito." - #~ msgid "the following arguments are required: license" #~ msgstr "são requeridos os seguintes argumentos: licença" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "não se pode usar --output com mais do que uma licença" - #~ msgid "usage: " #~ msgstr "uso: " @@ -1054,9 +1172,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Qual é o nome do projecto?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Qual é o endereço do projecto na internet?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Qual é o nome do responsável (maintainer)?" @@ -1163,10 +1278,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "as opções --exclude-year e --year são mutuamente exclusivas" -#, fuzzy -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "as opções --exclude-year e --year são mutuamente exclusivas" - #~ msgid "Downloading {}" #~ msgstr "A descarregar {}" diff --git a/po/reuse.pot b/po/reuse.pot index 4aa0a0566..9e31e6697 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,368 +30,448 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/reuse/_annotate.py:95 -#, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "" - -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" +#: src/reuse/cli/annotate.py:62 +msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "" -#: src/reuse/_annotate.py:117 -#, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" +#: src/reuse/cli/annotate.py:123 +msgid "" +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" msgstr "" -#: src/reuse/_annotate.py:151 +#: src/reuse/cli/annotate.py:156 #, python-brace-format -msgid "Error: Could not create comment for '{path}'" +msgid "" +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." msgstr "" -#: src/reuse/_annotate.py:158 +#: src/reuse/cli/annotate.py:163 #, python-brace-format msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." msgstr "" -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 +#: src/reuse/cli/annotate.py:209 #, python-brace-format -msgid "Successfully changed header of {path}" +msgid "Template '{template}' could not be found." msgstr "" -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" +#: src/reuse/cli/annotate.py:272 +msgid "Add copyright and licensing into the headers of files." msgstr "" -#: src/reuse/_util.py:384 -#, python-brace-format +#: src/reuse/cli/annotate.py:275 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -#: src/reuse/global_licensing.py:120 -#, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -#: src/reuse/global_licensing.py:134 -#, python-brace-format -msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" msgstr "" -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." +#: src/reuse/cli/annotate.py:296 +msgid "Copyright statement, repeatable." msgstr "" -#: src/reuse/global_licensing.py:170 -#, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/global_licensing.py:194 -#, python-brace-format -msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" +#: src/reuse/cli/annotate.py:305 +msgid "SPDX License Identifier, repeatable." msgstr "" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" +#: src/reuse/cli/annotate.py:313 +msgid "File contributor, repeatable." msgstr "" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" msgstr "" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" +#: src/reuse/cli/annotate.py:325 +msgid "Year of copyright statement." msgstr "" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" +#: src/reuse/cli/annotate.py:333 +msgid "Comment style to use." msgstr "" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" +#: src/reuse/cli/annotate.py:338 +msgid "Copyright prefix to use." msgstr "" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" +#: src/reuse/cli/annotate.py:351 +msgid "Name of template to use." msgstr "" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" +#: src/reuse/cli/annotate.py:358 +msgid "Do not include year in copyright statement." msgstr "" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" +#: src/reuse/cli/annotate.py:363 +msgid "Merge copyright lines if copyright statements are identical." msgstr "" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" +#: src/reuse/cli/annotate.py:370 +msgid "Force single-line comment style." msgstr "" -#: src/reuse/lint.py:85 -msgid "Could not read:" +#: src/reuse/cli/annotate.py:377 +msgid "Force multi-line comment style." msgstr "" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#: src/reuse/cli/annotate.py:383 +msgid "Add headers to all files under specified directories recursively." msgstr "" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" +#: src/reuse/cli/annotate.py:388 +msgid "Do not replace the first header in the file; just add a new one." msgstr "" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" +#: src/reuse/cli/annotate.py:395 +msgid "Always write a .license file instead of a header inside the file." msgstr "" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" +#: src/reuse/cli/annotate.py:402 +msgid "Write a .license file to files with unrecognised comment styles." msgstr "" -#: src/reuse/lint.py:140 -msgid "SUMMARY" +#: src/reuse/cli/annotate.py:409 +msgid "Skip files with unrecognised comment styles." msgstr "" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" +#: src/reuse/cli/annotate.py:420 +msgid "Skip files that already contain REUSE information." msgstr "" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" msgstr "" -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" +#: src/reuse/cli/common.py:58 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" msgstr "" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" msgstr "" -#: src/reuse/lint.py:152 -msgid "Used licenses:" +#: src/reuse/cli/common.py:114 +msgid "'{}' is not a valid SPDX expression." msgstr "" -#: src/reuse/lint.py:153 -msgid "Read errors:" +#: src/reuse/cli/convert_dep5.py:19 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." msgstr "" -#: src/reuse/lint.py:155 -msgid "Files with copyright information:" +#: src/reuse/cli/convert_dep5.py:31 +msgid "No '.reuse/dep5' file." msgstr "" -#: src/reuse/lint.py:159 -msgid "Files with license information:" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/lint.py:176 -msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +#: src/reuse/cli/download.py:59 +msgid "Did you mean:" msgstr "" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:66 msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" -msgstr "" - -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +"See for a list of valid SPDX License " +"Identifiers." msgstr "" -#: src/reuse/lint.py:254 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: missing license {lic}\n" +msgid "Error: {spdx_identifier} already exists." msgstr "" -#: src/reuse/lint.py:259 +#: src/reuse/cli/download.py:82 #, python-brace-format -msgid "{path}: read error\n" +msgid "Error: {path} does not exist." msgstr "" -#: src/reuse/lint.py:263 -#, python-brace-format -msgid "{path}: no license identifier\n" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" msgstr "" -#: src/reuse/lint.py:294 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: bad license {lic}\n" +msgid "Successfully downloaded {spdx_identifier}." msgstr "" -#: src/reuse/lint.py:301 -#, python-brace-format -msgid "{lic_path}: deprecated license\n" +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." msgstr "" -#: src/reuse/lint.py:308 -#, python-brace-format -msgid "{lic_path}: license without file extension\n" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." msgstr "" -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" +#: src/reuse/cli/download.py:122 +msgid "Download all missing licenses detected in the project." msgstr "" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/download.py:136 msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -#: src/reuse/project.py:275 +#: src/reuse/cli/download.py:142 +msgid "LICENSE" +msgstr "" + +#: src/reuse/cli/download.py:158 +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "" + +#: src/reuse/cli/download.py:172 +msgid "Cannot use '--output' with more than one license." +msgstr "" + +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" +#: src/reuse/cli/lint.py:40 +msgid "- Are there any deprecated licenses in the project?" msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" +msgstr "" + +#: src/reuse/cli/lint.py:59 +msgid "- Do all files have valid copyright and licensing information?" +msgstr "" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." msgstr "" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." +msgstr "" + +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" +msgstr "" + +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." +msgstr "" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/report.py:155 +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" + +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" +msgid "'{file}' is not inside of '{root}'." msgstr "" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, python-format +msgid "%(prog)s, version %(version)s" +msgstr "" + +#: src/reuse/cli/main.py:40 +msgid "" +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" + +#: src/reuse/cli/main.py:47 +msgid "" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:62 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:69 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "" + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" msgstr "" -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:78 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." +msgstr "" + +#: src/reuse/cli/main.py:89 +msgid "Enable debug statements." +msgstr "" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." +msgstr "" + +#: src/reuse/cli/main.py:99 +msgid "Do not skip over Git submodules." +msgstr "" + +#: src/reuse/cli/main.py:104 +msgid "Do not skip over Meson subprojects." +msgstr "" + +#: src/reuse/cli/main.py:109 +msgid "Do not use multiprocessing." +msgstr "" + +#: src/reuse/cli/main.py:119 +msgid "Define root of project." +msgstr "" + +#: src/reuse/cli/spdx.py:23 +msgid "Generate an SPDX bill of materials." +msgstr "" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" + +#: src/reuse/cli/supported_licenses.py:15 +msgid "List all licenses on the SPDX License List." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 @@ -475,11 +555,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, python-format -msgid "%(prog)s, version %(version)s" -msgstr "" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 msgid "Show the version and exit." msgstr "" diff --git a/po/ru.po b/po/ru.po index 0dbc01dad..a4280bbe9 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-08-25 06:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.7.1-dev\n" -#: src/reuse/_annotate.py:95 -#, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "Пропущен нераспознанный файл '{path}'" - -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "'{path}' не распознан; создаем '{path}. лицензия'" +#: src/reuse/cli/annotate.py:62 +#, fuzzy +msgid "Option '--copyright', '--license', or '--contributor' is required." +msgstr "Требуется опция --создатель, - авторское право или --лицензия" -#: src/reuse/_annotate.py:117 -#, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" -msgstr "Пропущенный файл '{path}' уже содержит информацию о REUSE" +#: src/reuse/cli/annotate.py:123 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" +msgstr "" +"Следующие файлы не имеют распознанного расширения. Пожалуйста, используйте --" +"style, --force-dot-license, --fallback-dot-license или --skip-unrecognised:" -#: src/reuse/_annotate.py:151 -#, python-brace-format -msgid "Error: Could not create comment for '{path}'" -msgstr "Ошибка: Не удалось создать комментарий для '{path}'" +#: src/reuse/cli/annotate.py:156 +#, fuzzy, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." +msgstr "" +"'{path}' не поддерживает однострочные комментарии, пожалуйста, не " +"используйте --single-line" -#: src/reuse/_annotate.py:158 -#, python-brace-format +#: src/reuse/cli/annotate.py:163 +#, fuzzy, python-brace-format msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." msgstr "" -"Ошибка: В сгенерированном заголовке комментария для '{path}' отсутствуют " -"строки копирайта или выражения лицензии. Вероятно, шаблон неверен. Не " -"удалось написать новый заголовок." +"'{path}' не поддерживает многострочные комментарии, пожалуйста, не " +"используйте --multi-line" -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 -#, python-brace-format -msgid "Successfully changed header of {path}" -msgstr "Успешно изменен заголовок {path}" +#: src/reuse/cli/annotate.py:209 +#, fuzzy, python-brace-format +msgid "Template '{template}' could not be found." +msgstr "Шаблон {template} не найден" -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" -msgstr "Не удалось разобрать '{expression}'" +#: src/reuse/cli/annotate.py:272 +#, fuzzy +msgid "Add copyright and licensing into the headers of files." +msgstr "" +"добавьте в заголовок файлов информацию об авторских правах и лицензировании" -#: src/reuse/_util.py:384 -#, python-brace-format +#: src/reuse/cli/annotate.py:275 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -"'{path}' содержит выражение SPDX, которое не может быть разобрано, что " -"приводит к пропуску файла" -#: src/reuse/global_licensing.py:120 -#, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -"{attr_name} должно быть {type_name} (получено {value}, которое является " -"{value_class})." -#: src/reuse/global_licensing.py:134 -#, python-brace-format -msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" msgstr "" -"Элемент в коллекции {attr_name} должен быть {type_name} (получил " -"{item_value}, который является {item_class})." -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." -msgstr "{attr_name} не должно быть пустым." +#: src/reuse/cli/annotate.py:296 +#, fuzzy +msgid "Copyright statement, repeatable." +msgstr "заявление об авторских правах, повторяемое" -#: src/reuse/global_licensing.py:170 -#, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" msgstr "" -"{name} должно быть {type} (получено {value}, которое является {value_type})." -#: src/reuse/global_licensing.py:194 -#, python-brace-format -msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" -msgstr "" -"Значение '\"Привилегия\" должно быть одним из {precedence_vals} (получено " -"{received})" +#: src/reuse/cli/annotate.py:305 +#, fuzzy +msgid "SPDX License Identifier, repeatable." +msgstr "Идентификатор SPDX, повторяемый" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" msgstr "" -"В сгенерированном комментарии отсутствуют строки об авторских правах или " -"выражениях лицензии" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" -msgstr "ПЛОХАЯ ЛИЦЕНЗИЯ" +#: src/reuse/cli/annotate.py:313 +#, fuzzy +msgid "File contributor, repeatable." +msgstr "вкладчик файлов, повторяемость" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" -msgstr "'{}' найдено в:" +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" +msgstr "" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" -msgstr "УСТАРЕВШИЕ ЛИЦЕНЗИИ" +#: src/reuse/cli/annotate.py:325 +#, fuzzy +msgid "Year of copyright statement." +msgstr "год утверждения авторского права, необязательно" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" -msgstr "Следующие лицензии устарели в SPDX:" +#: src/reuse/cli/annotate.py:333 +#, fuzzy +msgid "Comment style to use." +msgstr "стиль комментария, который следует использовать, необязательно" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" -msgstr "ЛИЦЕНЗИИ БЕЗ РАСШИРЕНИЯ ФАЙЛА" +#: src/reuse/cli/annotate.py:338 +#, fuzzy +msgid "Copyright prefix to use." +msgstr "используемый префикс авторского права, необязательно" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" -msgstr "Следующие лицензии не имеют расширения файла:" +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" +msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" -msgstr "ОТСУТСТВУЮЩИЕ ЛИЦЕНЗИИ" +#: src/reuse/cli/annotate.py:351 +#, fuzzy +msgid "Name of template to use." +msgstr "имя шаблона, который будет использоваться, необязательно" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" -msgstr "НЕИСПОЛЬЗОВАННЫЕ ЛИЦЕНЗИИ" +#: src/reuse/cli/annotate.py:358 +#, fuzzy +msgid "Do not include year in copyright statement." +msgstr "не указывайте год в отчете" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" -msgstr "Следующие лицензии не используются:" +#: src/reuse/cli/annotate.py:363 +#, fuzzy +msgid "Merge copyright lines if copyright statements are identical." +msgstr "" +"объединить строки с авторскими правами, если заявления об авторских правах " +"идентичны" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" -msgstr "ОШИБКИ ЧТЕНИЯ" +#: src/reuse/cli/annotate.py:370 +#, fuzzy +msgid "Force single-line comment style." +msgstr "стиль однострочных комментариев, необязательно" -#: src/reuse/lint.py:85 -msgid "Could not read:" -msgstr "Не удалось прочитать:" +#: src/reuse/cli/annotate.py:377 +#, fuzzy +msgid "Force multi-line comment style." +msgstr "установить стиль многострочного комментария, необязательно" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" -msgstr "ОТСУТСТВИЕ ИНФОРМАЦИИ ОБ АВТОРСКИХ ПРАВАХ И ЛИЦЕНЗИРОВАНИИ" +#: src/reuse/cli/annotate.py:383 +#, fuzzy +msgid "Add headers to all files under specified directories recursively." +msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" -msgstr "" -"Следующие файлы не содержат информации об авторских правах и лицензировании:" +#: src/reuse/cli/annotate.py:388 +#, fuzzy +msgid "Do not replace the first header in the file; just add a new one." +msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" -msgstr "Следующие файлы не содержат информации об авторских правах:" +#: src/reuse/cli/annotate.py:395 +#, fuzzy +msgid "Always write a .license file instead of a header inside the file." +msgstr "всегда записывайте файл .license вместо заголовка внутри файла" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" -msgstr "Следующие файлы не содержат информации о лицензировании:" +#: src/reuse/cli/annotate.py:402 +#, fuzzy +msgid "Write a .license file to files with unrecognised comment styles." +msgstr "" +"записывать файл .license в файлы с нераспознанными стилями комментариев" -#: src/reuse/lint.py:140 -msgid "SUMMARY" -msgstr "РЕЗЮМЕ" +#: src/reuse/cli/annotate.py:409 +#, fuzzy +msgid "Skip files with unrecognised comment styles." +msgstr "пропускать файлы с нераспознанными стилями комментариев" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" -msgstr "Плохие лицензии:" +#: src/reuse/cli/annotate.py:420 +#, fuzzy +msgid "Skip files that already contain REUSE information." +msgstr "пропускать файлы, которые уже содержат информацию о REUSE" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" -msgstr "Утраченные лицензии:" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" +msgstr "" -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" -msgstr "Лицензии без расширения файла:" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' - двоичный файл, поэтому для заголовка используется '{new_path}'" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" -msgstr "Отсутствующие лицензии:" +#: src/reuse/cli/common.py:58 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" +msgstr "" +"'{path}' не может быть разобран. Мы получили следующее сообщение об ошибке: " +"{message}" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Неиспользованные лицензии:" +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" +msgstr "" -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Используемые лицензии:" +#: src/reuse/cli/common.py:114 +#, fuzzy +msgid "'{}' is not a valid SPDX expression." +msgstr "'{}' не является правильным выражением SPDX, прерывается" -#: src/reuse/lint.py:153 -msgid "Read errors:" -msgstr "Читайте ошибки:" +#: src/reuse/cli/convert_dep5.py:19 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" -#: src/reuse/lint.py:155 -msgid "Files with copyright information:" -msgstr "Файлы с информацией об авторских правах:" +#: src/reuse/cli/convert_dep5.py:31 +#, fuzzy +msgid "No '.reuse/dep5' file." +msgstr "Нет файла '.reuse/dep5'" -#: src/reuse/lint.py:159 -msgid "Files with license information:" -msgstr "Файлы с информацией о лицензии:" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' не является действительным идентификатором лицензии SPDX." -#: src/reuse/lint.py:176 -msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" -msgstr "Поздравляем! Ваш проект соответствует версии {} спецификации REUSE :-)" +#: src/reuse/cli/download.py:59 +#, fuzzy +msgid "Did you mean:" +msgstr "Вы имели в виду:" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:66 msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +"See for a list of valid SPDX License " +"Identifiers." msgstr "" -"К сожалению, ваш проект не соответствует версии {} спецификации REUSE :-(" - -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" -msgstr "РЕКОМЕНДАЦИИ" +"Список допустимых идентификаторов лицензий SPDX см. в ." -#: src/reuse/lint.py:254 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: отсутствует лицензия {lic}\n" +msgid "Error: {spdx_identifier} already exists." +msgstr "Ошибка: {spdx_identifier} уже существует." -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: ошибка чтения\n" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Ошибка: {path} не существует." -#: src/reuse/lint.py:263 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: нет идентификатора лицензии\n" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Ошибка: Не удалось загрузить лицензию." -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: нет уведомления об авторских правах\n" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Работает ли ваше интернет-соединение?" -#: src/reuse/lint.py:294 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: bad license {lic}\n" -msgstr "{path}: плохая лицензия {lic}\n" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Успешно загружен {spdx_identifier}." -#: src/reuse/lint.py:301 -#, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "{lic_path}: устаревшая лицензия\n" +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." -#: src/reuse/lint.py:308 -#, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "{lic_path}: лицензия без расширения файла\n" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "{lic_path}: неиспользуемая лицензия\n" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' покрыт {global_path}" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/download.py:136 +#, fuzzy msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." +msgstr "" +"источник, из которого копируются пользовательские лицензии LicenseRef-, либо " +"каталог, содержащий файл, либо сам файл" + +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "ПЛОХАЯ ЛИЦЕНЗИЯ" + +#: src/reuse/cli/download.py:158 +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." msgstr "" -"'{path}' покрывается исключительно REUSE.toml. Не читать содержимое файла." -#: src/reuse/project.py:275 +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "Невозможно использовать --output с более чем одной лицензией" + +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"'{path}' был обнаружен как двоичный файл; поиск информации о REUSE в его " -"содержимом не производится." -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -"'.reuse/dep5' является устаревшим. Вместо него рекомендуется использовать " -"REUSE.toml. Для преобразования используйте `reuse convert-dep5`." -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -"Найдены оба файла '{new_path}' и '{old_path}'. Вы не можете хранить оба " -"файла одновременно; они несовместимы." -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "определяющий идентификатор '{path}'" +#: src/reuse/cli/lint.py:40 +msgid "- Are there any deprecated licenses in the project?" +msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "У {path} нет расширения файла" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"Не удалось разрешить идентификатор лицензии SPDX {path}, разрешается " -"{identifier}. Убедитесь, что лицензия находится в списке лицензий по адресу " -" или что она начинается с 'LicenseRef-' и имеет " -"расширение файла." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" +msgstr "" + +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" msgstr "" -"{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" +"Следующие файлы не содержат информации об авторских правах и лицензировании:" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "предотвращает выход" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "форматирует вывод в формате JSON" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "Форматирует вывод в виде обычного текста" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "Форматирует вывод в виде ошибок на строку" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -"Проект '{}' не является репозиторием VCS или в нем не установлено " -"необходимое программное обеспечение VCS" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Не удалось прочитать '{path}'" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "Форматирует вывод в виде ошибок на строку" + +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" -#: src/reuse/report.py:155 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "При разборе '{path}' произошла непредвиденная ошибка" +msgid "'{file}' is not inside of '{root}'." +msgstr "" + +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: ошибка: %(message)s\n" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:40 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Исправление недействительных лицензий: По крайней мере одна лицензия в " -"каталоге LICENSES и/или предоставленная тегами 'SPDX-License-Identifier', " -"является недействительной. Они либо не являются действительными " -"идентификаторами лицензий SPDX, либо не начинаются с 'LicenseRef-'. Часто " -"задаваемые вопросы о пользовательских лицензиях: https://reuse.software/faq/" -"#custom-license" - -#: src/reuse/report.py:519 +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" + +#: src/reuse/cli/main.py:47 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " -msgstr "" -"Исправление устаревших лицензий: По крайней мере одна из лицензий в каталоге " -"LICENSES и/или предоставленная тегом 'SPDX-License-Identifier' или в файле '." -"reuse/dep5', была устаревшей в SPDX. Текущий список и рекомендуемые новые " -"идентификаторы можно найти здесь: " - -#: src/reuse/report.py:530 +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -"Исправьте лицензии без расширения файла: По крайней мере один текстовый файл " -"лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. Пожалуйста, " -"переименуйте файл(ы) соответствующим образом." -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:62 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." -msgstr "" -"Исправление отсутствующих лицензий: По крайней мере для одного из " -"идентификаторов лицензий, предоставляемых тегами 'SPDX-License-Identifier', " -"в каталоге 'LICENSES' нет соответствующего текстового файла лицензии. Для " -"идентификаторов лицензий SPDX можно просто выполнить команду 'reuse download " -"--all', чтобы получить все недостающие идентификаторы. Для пользовательских " -"лицензий (начинающихся с 'LicenseRef-') вам нужно добавить эти файлы " -"самостоятельно." - -#: src/reuse/report.py:551 +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse - это инструмент для соблюдения рекомендаций REUSE. Дополнительную " +"информацию см. на сайте , а онлайн-документацию - " +"на сайте ." + +#: src/reuse/cli/main.py:69 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." -msgstr "" -"Исправьте неиспользуемые лицензии: По крайней мере, на один из файлов с " -"текстом лицензии в 'LICENSES' не ссылается ни один файл, например, тег 'SPDX-" -"License-Identifier'. Пожалуйста, убедитесь, что вы либо пометили " -"соответствующие лицензионные файлы должным образом, либо удалили " -"неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " -"фрагмент кода не лицензируется как таковой." - -#: src/reuse/report.py:562 +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "" +"Эта версия повторного использования совместима с версией {} спецификации " +"REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Поддержите работу ФСПО:" + +#: src/reuse/cli/main.py:78 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" -"Исправьте ошибки чтения: По крайней мере один из файлов в вашей директории " -"не может быть прочитан инструментом. Проверьте права доступа к файлам. " -"Затронутые файлы вы найдете в верхней части вывода в виде сообщений об " -"ошибках." +"Пожертвования имеют решающее значение для нашей силы и самостоятельности. " +"Они позволяют нам продолжать работать во имя свободного программного " +"обеспечения везде, где это необходимо. Пожалуйста, рассмотрите возможность " +"сделать пожертвование по адресу ." + +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "включить отладочные операторы" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "скрыть предупреждения об устаревании" -#: src/reuse/report.py:571 +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "не пропускайте подмодули Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "не пропускайте мезонные подпроекты" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "не используйте многопроцессорную обработку" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "определить корень проекта" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "распечатать ведомость материалов проекта в формате SPDX" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." +msgstr "" + +#: src/reuse/cli/spdx.py:39 +#, fuzzy msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Исправление отсутствующей информации об авторских правах/лицензировании: Для " -"одного или нескольких файлов инструмент не может найти информацию об " -"авторских правах и/или лицензировании. Обычно это можно сделать, добавив к " -"каждому файлу теги 'SPDX-FileCopyrightText' и 'SPDX-License-Identifier'. В " -"учебнике описаны дополнительные способы решения этой задачи: " +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" +"заполните поле LicenseConcluded; обратите внимание, что повторное " +"использование не может гарантировать точность поля" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "имя лица, подписавшего отчет SPDX" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "название организации, подписавшей отчет SPDX" + +#: src/reuse/cli/spdx.py:82 +#, fuzzy +msgid "" +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." +msgstr "" +"ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= ИМЯ, " +"если указано --добавить- лицензию- заключенную" + +#: src/reuse/cli/spdx.py:97 +#, python-brace-format +msgid "" +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"'{path}' не соответствует распространенному шаблону файлов SPDX. " +"Предлагаемые соглашения об именовании можно найти здесь: https://spdx.github." +"io/spdx-spec/conformance/#44-standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "список всех поддерживаемых лицензий SPDX" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -537,11 +630,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: ошибка: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -745,166 +833,377 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Пропущен нераспознанный файл '{path}'" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' не распознан; создаем '{path}. лицензия'" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Пропущенный файл '{path}' уже содержит информацию о REUSE" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Ошибка: Не удалось создать комментарий для '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' не поддерживает однострочные комментарии, пожалуйста, не " -#~ "используйте --single-line" +#~ "Ошибка: В сгенерированном заголовке комментария для '{path}' отсутствуют " +#~ "строки копирайта или выражения лицензии. Вероятно, шаблон неверен. Не " +#~ "удалось написать новый заголовок." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Успешно изменен заголовок {path}" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Не удалось разобрать '{expression}'" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' не поддерживает многострочные комментарии, пожалуйста, не " -#~ "используйте --multi-line" +#~ "'{path}' содержит выражение SPDX, которое не может быть разобрано, что " +#~ "приводит к пропуску файла" -#~ msgid "--skip-unrecognised has no effect when used together with --style" +#, python-brace-format +#~ msgid "" +#~ "{attr_name} must be a {type_name} (got {value} that is a {value_class})." #~ msgstr "" -#~ "--skip-unrecognised не имеет эффекта, если используется вместе с --style" +#~ "{attr_name} должно быть {type_name} (получено {value}, которое является " +#~ "{value_class})." -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "Требуется опция --создатель, - авторское право или --лицензия" +#, python-brace-format +#~ msgid "" +#~ "Item in {attr_name} collection must be a {type_name} (got {item_value} " +#~ "that is a {item_class})." +#~ msgstr "" +#~ "Элемент в коллекции {attr_name} должен быть {type_name} (получил " +#~ "{item_value}, который является {item_class})." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "Шаблон {template} не найден" +#~ msgid "{attr_name} must not be empty." +#~ msgstr "{attr_name} не должно быть пустым." -#~ msgid "can't write to '{}'" -#~ msgstr "Невозможно записать в '{}'" +#, python-brace-format +#~ msgid "{name} must be a {type} (got {value} that is a {value_type})." +#~ msgstr "" +#~ "{name} должно быть {type} (получено {value}, которое является " +#~ "{value_type})." +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "The value of 'precedence' must be one of {precedence_vals} (got " +#~ "{received})" +#~ msgstr "" +#~ "Значение '\"Привилегия\" должно быть одним из {precedence_vals} (получено " +#~ "{received})" + +#~ msgid "generated comment is missing copyright lines or license expressions" #~ msgstr "" -#~ "Следующие файлы не имеют распознанного расширения. Пожалуйста, " -#~ "используйте --style, --force-dot-license, --fallback-dot-license или --" -#~ "skip-unrecognised:" +#~ "В сгенерированном комментарии отсутствуют строки об авторских правах или " +#~ "выражениях лицензии" + +#~ msgid "'{}' found in:" +#~ msgstr "'{}' найдено в:" + +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "УСТАРЕВШИЕ ЛИЦЕНЗИИ" + +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Следующие лицензии устарели в SPDX:" + +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "ЛИЦЕНЗИИ БЕЗ РАСШИРЕНИЯ ФАЙЛА" + +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Следующие лицензии не имеют расширения файла:" + +#~ msgid "MISSING LICENSES" +#~ msgstr "ОТСУТСТВУЮЩИЕ ЛИЦЕНЗИИ" + +#~ msgid "UNUSED LICENSES" +#~ msgstr "НЕИСПОЛЬЗОВАННЫЕ ЛИЦЕНЗИИ" + +#~ msgid "The following licenses are not used:" +#~ msgstr "Следующие лицензии не используются:" + +#~ msgid "READ ERRORS" +#~ msgstr "ОШИБКИ ЧТЕНИЯ" -#~ msgid "copyright statement, repeatable" -#~ msgstr "заявление об авторских правах, повторяемое" +#~ msgid "Could not read:" +#~ msgstr "Не удалось прочитать:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Идентификатор SPDX, повторяемый" +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "ОТСУТСТВИЕ ИНФОРМАЦИИ ОБ АВТОРСКИХ ПРАВАХ И ЛИЦЕНЗИРОВАНИИ" -#~ msgid "file contributor, repeatable" -#~ msgstr "вкладчик файлов, повторяемость" +#~ msgid "The following files have no copyright information:" +#~ msgstr "Следующие файлы не содержат информации об авторских правах:" -#~ msgid "year of copyright statement, optional" -#~ msgstr "год утверждения авторского права, необязательно" +#~ msgid "The following files have no licensing information:" +#~ msgstr "Следующие файлы не содержат информации о лицензировании:" -#~ msgid "comment style to use, optional" -#~ msgstr "стиль комментария, который следует использовать, необязательно" +#~ msgid "SUMMARY" +#~ msgstr "РЕЗЮМЕ" -#~ msgid "copyright prefix to use, optional" -#~ msgstr "используемый префикс авторского права, необязательно" +#~ msgid "Bad licenses:" +#~ msgstr "Плохие лицензии:" -#~ msgid "name of template to use, optional" -#~ msgstr "имя шаблона, который будет использоваться, необязательно" +#~ msgid "Deprecated licenses:" +#~ msgstr "Утраченные лицензии:" -#~ msgid "do not include year in statement" -#~ msgstr "не указывайте год в отчете" +#~ msgid "Licenses without file extension:" +#~ msgstr "Лицензии без расширения файла:" -#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgid "Missing licenses:" +#~ msgstr "Отсутствующие лицензии:" + +#~ msgid "Unused licenses:" +#~ msgstr "Неиспользованные лицензии:" + +#~ msgid "Used licenses:" +#~ msgstr "Используемые лицензии:" + +#~ msgid "Read errors:" +#~ msgstr "Читайте ошибки:" + +#~ msgid "Files with copyright information:" +#~ msgstr "Файлы с информацией об авторских правах:" + +#~ msgid "Files with license information:" +#~ msgstr "Файлы с информацией о лицензии:" + +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" #~ msgstr "" -#~ "объединить строки с авторскими правами, если заявления об авторских " -#~ "правах идентичны" +#~ "Поздравляем! Ваш проект соответствует версии {} спецификации REUSE :-)" -#~ msgid "force single-line comment style, optional" -#~ msgstr "стиль однострочных комментариев, необязательно" +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" +#~ msgstr "" +#~ "К сожалению, ваш проект не соответствует версии {} спецификации REUSE :-(" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "установить стиль многострочного комментария, необязательно" +#~ msgid "RECOMMENDATIONS" +#~ msgstr "РЕКОМЕНДАЦИИ" -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" +#, python-brace-format +#~ msgid "{path}: missing license {lic}\n" +#~ msgstr "{path}: отсутствует лицензия {lic}\n" -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" +#, python-brace-format +#~ msgid "{path}: read error\n" +#~ msgstr "{path}: ошибка чтения\n" + +#, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "{path}: нет идентификатора лицензии\n" + +#, python-brace-format +#~ msgid "{path}: no copyright notice\n" +#~ msgstr "{path}: нет уведомления об авторских правах\n" -#~ msgid "always write a .license file instead of a header inside the file" -#~ msgstr "всегда записывайте файл .license вместо заголовка внутри файла" +#, python-brace-format +#~ msgid "{path}: bad license {lic}\n" +#~ msgstr "{path}: плохая лицензия {lic}\n" + +#, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "{lic_path}: устаревшая лицензия\n" + +#, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "{lic_path}: лицензия без расширения файла\n" -#~ msgid "write a .license file to files with unrecognised comment styles" +#, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "{lic_path}: неиспользуемая лицензия\n" + +#, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' покрыт {global_path}" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' is covered exclusively by REUSE.toml. Not reading the file " +#~ "contents." #~ msgstr "" -#~ "записывать файл .license в файлы с нераспознанными стилями комментариев" +#~ "'{path}' покрывается исключительно REUSE.toml. Не читать содержимое файла." -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "пропускать файлы с нераспознанными стилями комментариев" +#, python-brace-format +#~ msgid "" +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." +#~ msgstr "" +#~ "'{path}' был обнаружен как двоичный файл; поиск информации о REUSE в его " +#~ "содержимом не производится." -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "пропускать файлы, которые уже содержат информацию о REUSE" +#~ msgid "" +#~ "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE." +#~ "toml. Use `reuse convert-dep5` to convert." +#~ msgstr "" +#~ "'.reuse/dep5' является устаревшим. Вместо него рекомендуется использовать " +#~ "REUSE.toml. Для преобразования используйте `reuse convert-dep5`." #, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "Found both '{new_path}' and '{old_path}'. You cannot keep both files " +#~ "simultaneously; they are not intercompatible." #~ msgstr "" -#~ "'{path}' - двоичный файл, поэтому для заголовка используется '{new_path}'" +#~ "Найдены оба файла '{new_path}' и '{old_path}'. Вы не можете хранить оба " +#~ "файла одновременно; они несовместимы." -#~ msgid "prevents output" -#~ msgstr "предотвращает выход" +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "определяющий идентификатор '{path}'" -#, fuzzy -#~ msgid "formats output as errors per line (default)" -#~ msgstr "Форматирует вывод в виде ошибок на строку" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "У {path} нет расширения файла" + +#, python-brace-format +#~ msgid "" +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." +#~ msgstr "" +#~ "Не удалось разрешить идентификатор лицензии SPDX {path}, разрешается " +#~ "{identifier}. Убедитесь, что лицензия находится в списке лицензий по " +#~ "адресу или что она начинается с " +#~ "'LicenseRef-' и имеет расширение файла." +#, python-brace-format #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" #~ msgstr "" -#~ "reuse - это инструмент для соблюдения рекомендаций REUSE. Дополнительную " -#~ "информацию см. на сайте , а онлайн-документацию " -#~ "- на сайте ." +#~ "{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" #~ msgstr "" -#~ "Эта версия повторного использования совместима с версией {} спецификации " -#~ "REUSE." +#~ "Проект '{}' не является репозиторием VCS или в нем не установлено " +#~ "необходимое программное обеспечение VCS" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Поддержите работу ФСПО:" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Не удалось прочитать '{path}'" + +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "При разборе '{path}' произошла непредвиденная ошибка" #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" #~ msgstr "" -#~ "Пожертвования имеют решающее значение для нашей силы и самостоятельности. " -#~ "Они позволяют нам продолжать работать во имя свободного программного " -#~ "обеспечения везде, где это необходимо. Пожалуйста, рассмотрите " -#~ "возможность сделать пожертвование по адресу ." +#~ "Исправление недействительных лицензий: По крайней мере одна лицензия в " +#~ "каталоге LICENSES и/или предоставленная тегами 'SPDX-License-Identifier', " +#~ "является недействительной. Они либо не являются действительными " +#~ "идентификаторами лицензий SPDX, либо не начинаются с 'LicenseRef-'. Часто " +#~ "задаваемые вопросы о пользовательских лицензиях: https://reuse.software/" +#~ "faq/#custom-license" -#~ msgid "enable debug statements" -#~ msgstr "включить отладочные операторы" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Исправление устаревших лицензий: По крайней мере одна из лицензий в " +#~ "каталоге LICENSES и/или предоставленная тегом 'SPDX-License-Identifier' " +#~ "или в файле '.reuse/dep5', была устаревшей в SPDX. Текущий список и " +#~ "рекомендуемые новые идентификаторы можно найти здесь: " -#~ msgid "hide deprecation warnings" -#~ msgstr "скрыть предупреждения об устаревании" +#~ msgid "" +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." +#~ msgstr "" +#~ "Исправьте лицензии без расширения файла: По крайней мере один текстовый " +#~ "файл лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. " +#~ "Пожалуйста, переименуйте файл(ы) соответствующим образом." -#~ msgid "do not skip over Git submodules" -#~ msgstr "не пропускайте подмодули Git" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Исправление отсутствующих лицензий: По крайней мере для одного из " +#~ "идентификаторов лицензий, предоставляемых тегами 'SPDX-License-" +#~ "Identifier', в каталоге 'LICENSES' нет соответствующего текстового файла " +#~ "лицензии. Для идентификаторов лицензий SPDX можно просто выполнить " +#~ "команду 'reuse download --all', чтобы получить все недостающие " +#~ "идентификаторы. Для пользовательских лицензий (начинающихся с " +#~ "'LicenseRef-') вам нужно добавить эти файлы самостоятельно." -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "не пропускайте мезонные подпроекты" +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." +#~ msgstr "" +#~ "Исправьте неиспользуемые лицензии: По крайней мере, на один из файлов с " +#~ "текстом лицензии в 'LICENSES' не ссылается ни один файл, например, тег " +#~ "'SPDX-License-Identifier'. Пожалуйста, убедитесь, что вы либо пометили " +#~ "соответствующие лицензионные файлы должным образом, либо удалили " +#~ "неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " +#~ "фрагмент кода не лицензируется как таковой." + +#~ msgid "" +#~ "Fix read errors: At least one of the files in your directory cannot be " +#~ "read by the tool. Please check the file permissions. You will find the " +#~ "affected files at the top of the output as part of the logged error " +#~ "messages." +#~ msgstr "" +#~ "Исправьте ошибки чтения: По крайней мере один из файлов в вашей " +#~ "директории не может быть прочитан инструментом. Проверьте права доступа к " +#~ "файлам. Затронутые файлы вы найдете в верхней части вывода в виде " +#~ "сообщений об ошибках." -#~ msgid "do not use multiprocessing" -#~ msgstr "не используйте многопроцессорную обработку" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Исправление отсутствующей информации об авторских правах/лицензировании: " +#~ "Для одного или нескольких файлов инструмент не может найти информацию об " +#~ "авторских правах и/или лицензировании. Обычно это можно сделать, добавив " +#~ "к каждому файлу теги 'SPDX-FileCopyrightText' и 'SPDX-License-" +#~ "Identifier'. В учебнике описаны дополнительные способы решения этой " +#~ "задачи: " -#~ msgid "define root of project" -#~ msgstr "определить корень проекта" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "" +#~ "--skip-unrecognised не имеет эффекта, если используется вместе с --style" + +#~ msgid "can't write to '{}'" +#~ msgstr "Невозможно записать в '{}'" #~ msgid "show program's version number and exit" #~ msgstr "показать номер версии программы и выйти" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "" -#~ "добавьте в заголовок файлов информацию об авторских правах и " -#~ "лицензировании" - #~ msgid "" #~ "Add copyright and licensing into the header of one or more files.\n" #~ "\n" @@ -927,9 +1226,6 @@ msgstr[2] "" #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." - #~ msgid "list all non-compliant files" #~ msgstr "список всех файлов, не соответствующих требованиям" @@ -977,27 +1273,12 @@ msgstr[2] "" #~ "- Все ли файлы содержат достоверную информацию об авторских правах и " #~ "лицензировании?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "распечатать ведомость материалов проекта в формате SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "распечатать ведомость материалов проекта в формате SPDX" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "список всех поддерживаемых лицензий SPDX" - #~ msgid "convert .reuse/dep5 to REUSE.toml" #~ msgstr "Преобразование .reuse/dep5 в REUSE.toml" -#, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{path}' не может быть разобран. Мы получили следующее сообщение об " -#~ "ошибке: {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' не является файлом" @@ -1010,98 +1291,15 @@ msgstr[2] "" #~ msgid "can't read or write '{}'" #~ msgstr "Невозможно прочитать или записать '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' не является правильным выражением SPDX, прерывается" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' не является действительным идентификатором лицензии SPDX." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Список допустимых идентификаторов лицензий SPDX см. в ." - -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "Нет файла '.reuse/dep5'" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Лицензия SPDX Идентификатор лицензии" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" - -#~ msgid "" -#~ "source from which to copy custom LicenseRef- licenses, either a directory " -#~ "that contains the file or the file itself" -#~ msgstr "" -#~ "источник, из которого копируются пользовательские лицензии LicenseRef-, " -#~ "либо каталог, содержащий файл, либо сам файл" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Ошибка: {spdx_identifier} уже существует." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Ошибка: Не удалось загрузить лицензию." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Работает ли ваше интернет-соединение?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Успешно загружен {spdx_identifier}." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output не имеет эффекта, если используется вместе с --all" #~ msgid "the following arguments are required: license" #~ msgstr "необходимы следующие аргументы: лицензия" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "Невозможно использовать --output с более чем одной лицензией" - -#~ msgid "formats output as JSON" -#~ msgstr "форматирует вывод в формате JSON" - -#, fuzzy -#~ msgid "formats output as plain text (default)" -#~ msgstr "Форматирует вывод в виде обычного текста" - -#~ msgid "formats output as errors per line" -#~ msgstr "Форматирует вывод в виде ошибок на строку" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "заполните поле LicenseConcluded; обратите внимание, что повторное " -#~ "использование не может гарантировать точность поля" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "имя лица, подписавшего отчет SPDX" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "название организации, подписавшей отчет SPDX" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= " -#~ "ИМЯ, если указано --добавить- лицензию- заключенную" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "'{path}' не соответствует распространенному шаблону файлов SPDX. " -#~ "Предлагаемые соглашения об именовании можно найти здесь: https://spdx." -#~ "github.io/spdx-spec/conformance/#44-standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "использование: " diff --git a/po/sv.po b/po/sv.po index e4c214751..94d040650 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-09-19 13:40+0000\n" "Last-Translator: Simon \n" "Language-Team: Swedish for a list of valid SPDX License " +"Identifiers." msgstr "" +"Se för en lista över giltiga SPDX-" +"licensidentifierare." + +#: src/reuse/cli/download.py:75 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Fel: {spdx_identifier} existerar redan." + +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Fel: {path} existerar inte." + +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Fel: Hämtningen av licensen misslyckades." + +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Fungerar din internet-anslutning?" + +#: src/reuse/cli/download.py:96 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Hämtningen av {spdx_identifier} lyckades." -#: src/reuse/lint.py:155 -msgid "Files with copyright information:" +#: src/reuse/cli/download.py:106 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "hämta en licens och placera den i mappen LICENSES/" + +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." msgstr "" -#: src/reuse/lint.py:159 -msgid "Files with license information:" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "ladda ner alla saknade licenser som upptäckts i projektet" + +#: src/reuse/cli/download.py:130 +msgid "Path to download to." msgstr "" -#: src/reuse/lint.py:176 +#: src/reuse/cli/download.py:136 msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -#: src/reuse/lint.py:183 -msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" +#: src/reuse/cli/download.py:142 +msgid "LICENSE" msgstr "" -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" +#: src/reuse/cli/download.py:158 +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." msgstr "" -#: src/reuse/lint.py:254 +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "kan inte använda --output med mer än en licens" + +#: src/reuse/cli/lint.py:27 #, python-brace-format -msgid "{path}: missing license {lic}\n" +msgid "" +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/lint.py:263 -#, python-brace-format -msgid "{path}: no license identifier\n" +#: src/reuse/cli/lint.py:36 +msgid "" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" +#: src/reuse/cli/lint.py:40 +msgid "- Are there any deprecated licenses in the project?" msgstr "" -#: src/reuse/lint.py:294 -#, python-brace-format -msgid "{path}: bad license {lic}\n" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" msgstr "" -#: src/reuse/lint.py:301 -#, python-brace-format -msgid "{lic_path}: deprecated license\n" +#: src/reuse/cli/lint.py:48 +msgid "" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -#: src/reuse/lint.py:308 -#, python-brace-format -msgid "{lic_path}: license without file extension\n" +#: src/reuse/cli/lint.py:53 +msgid "" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" msgstr "" -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" +#: src/reuse/cli/lint.py:59 +msgid "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format -msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +msgid "Prevent output." msgstr "" -#: src/reuse/project.py:275 -#, python-brace-format -msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +#: src/reuse/cli/lint.py:78 +msgid "Format output as JSON." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:86 +msgid "Format output as plain text. (default)" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:94 +msgid "Format output as errors per line." +msgstr "" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" +#: src/reuse/cli/lint_file.py:46 +msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" msgstr "" -#: src/reuse/project.py:434 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +msgid "'{file}' is not inside of '{root}'." msgstr "" -#: src/reuse/project.py:446 -#, python-brace-format -msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, python-format +msgid "%(prog)s, version %(version)s" msgstr "" -#: src/reuse/project.py:485 +#: src/reuse/cli/main.py:40 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" +#: src/reuse/cli/main.py:47 +msgid "" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" +#: src/reuse/cli/main.py:54 +msgid "" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:62 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"reuse är ett verktyg för att följa REUSE-rekommendationerna. Se för mer information och för " +"den web-baserade dokumentationen." -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:69 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"This version of reuse is compatible with version {} of the REUSE " +"Specification." msgstr "" +"Den här versionen av reuse är kompatibel med version {} av REUSE-" +"specifikationen." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Stötta FSFE's arbete:" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:78 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Donationer är avgörande för vår styrka och självständighet. De gör det " +"möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. Vänligen " +"överväg att göra en donation till ." -#: src/reuse/report.py:539 -msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +#: src/reuse/cli/main.py:89 +msgid "Enable debug statements." +msgstr "" + +#: src/reuse/cli/main.py:94 +msgid "Hide deprecation warnings." +msgstr "" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "hoppa inte över undermoduler för Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "hoppa inte över underprojekt för Meson" + +#: src/reuse/cli/main.py:109 +msgid "Do not use multiprocessing." +msgstr "" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "definiera roten av projektet" + +#: src/reuse/cli/spdx.py:23 +msgid "Generate an SPDX bill of materials." +msgstr "" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." msgstr "" -#: src/reuse/report.py:551 +#: src/reuse/cli/spdx.py:39 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." msgstr "" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:51 +msgid "Name of the person signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:55 +msgid "Name of the organization signing off on the SPDX report." +msgstr "" + +#: src/reuse/cli/spdx.py:82 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" msgstr "" +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "lista alla SPDX-licenser som stöds" + #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format msgid "{editor}: Editing failed" @@ -464,11 +567,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, python-format -msgid "%(prog)s, version %(version)s" -msgstr "" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -666,79 +764,30 @@ msgstr[0] "" msgstr[1] "" #, python-brace-format -#~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" -#~ msgstr "" -#~ "'{path}' stöjder inte kommentarer på en rad, använd inte --single-line" +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Hoppar över fil som inte känns igen '{path}'" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' känns inte igen; skapar '{path}.license'" #, python-brace-format -#~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" -#~ msgstr "" -#~ "'{path}' stöjder inte kommentarer på flera rader, använd inte --multi-line" +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Fel: Kunde inte skapa kommentar för '{path}'" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Kunde inte tolka '{expression}'" #~ msgid "can't write to '{}'" #~ msgstr "kan inte skriva till '{}'" -#~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." -#~ msgstr "" -#~ "reuse är ett verktyg för att följa REUSE-rekommendationerna. Se för mer information och " -#~ "för den web-baserade dokumentationen." - -#~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." -#~ msgstr "" -#~ "Den här versionen av reuse är kompatibel med version {} av REUSE-" -#~ "specifikationen." - -#~ msgid "Support the FSFE's work:" -#~ msgstr "Stötta FSFE's arbete:" - -#~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." -#~ msgstr "" -#~ "Donationer är avgörande för vår styrka och självständighet. De gör det " -#~ "möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. " -#~ "Vänligen överväg att göra en donation till ." - -#~ msgid "do not skip over Git submodules" -#~ msgstr "hoppa inte över undermoduler för Git" - -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "hoppa inte över underprojekt för Meson" - -#~ msgid "define root of project" -#~ msgstr "definiera roten av projektet" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "hämta en licens och placera den i mappen LICENSES/" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "hämta en licens och placera den i mappen LICENSES/" - #~ msgid "list all non-compliant files" #~ msgstr "lista alla filer som inte uppfyller kraven" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "lista alla SPDX-licenser som stöds" - -#, fuzzy, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' är inte en fil" @@ -751,43 +800,9 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "kan inte läsa eller skriva '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' är inte ett giltigt SPDX-uttryck, avbryter" - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Se för en lista över giltiga SPDX-" -#~ "licensidentifierare." - -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "ladda ner alla saknade licenser som upptäckts i projektet" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Fel: {spdx_identifier} existerar redan." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Fel: Hämtningen av licensen misslyckades." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Fungerar din internet-anslutning?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Hämtningen av {spdx_identifier} lyckades." - #~ msgid "the following arguments are required: license" #~ msgstr "följande argument behövs: licens" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "kan inte använda --output med mer än en licens" - -#, fuzzy, python-brace-format -#~ msgid "'{path}' could not be decoded as UTF-8." -#~ msgstr "'{dep5}' kunde inte avkodas som UTF-8." - #~ msgid "initialize REUSE project" #~ msgstr "initialisera REUSE-projektet" diff --git a/po/tr.po b/po/tr.po index c09f7564d..395656404 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for a list of valid SPDX License " +"Identifiers." msgstr "" +"Geçerli SPDX Lisans Kimlikleri listesi için " +"adresine bakın." -#: src/reuse/lint.py:259 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: read error\n" -msgstr "" +msgid "Error: {spdx_identifier} already exists." +msgstr "Hata: {spdx_identifier} halihazırda mevcut." -#: src/reuse/lint.py:263 +#: src/reuse/cli/download.py:82 #, fuzzy, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." +msgid "Error: {path} does not exist." +msgstr "'{path}' .spdx ile bitmiyor" -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Hata: lisans indirme başarısız oldu." -#: src/reuse/lint.py:294 +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "İnternet bağlantınız çalışıyor mu?" + +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: bad license {lic}\n" -msgstr "" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "{spdx_identifier} başarılı bir şekilde indirildi." -#: src/reuse/lint.py:301 -#, fuzzy, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "Modası geçmiş lisanslar:" +#: src/reuse/cli/download.py:106 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/lint.py:308 -#, fuzzy, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "Dosya uzantısı olmayan lisanslar:" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:317 -#, fuzzy, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "Kullanılmayan lisanslar:" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "projede tespit edilen bütün eksik lisansları indir" -#: src/reuse/project.py:260 -#, fuzzy, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' .reuse/dep5 ile kapsanıyor" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/download.py:136 msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." msgstr "" -#: src/reuse/project.py:275 +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "KÖTÜ LİSANSLAR" + +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "--single-line ve --multi-line seçeneklerinden biri olmalıdır" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "--output birden fazla lisansla birlikte kullanılamıyor" + +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "'{path}' kimliği belirleniyor" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Projenin İnternet adresi nedir?" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} dosya uzantısına sahip değil" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"{path} için, {identifier} olarak çözümlenen SPDX Lisans Kimliği " -"anlaşılamadı. Lisansın listesinde bulunduğundan " -"veya 'LicenseRef-' ile başladığından ve bir dosya uzantısına sahip " -"olduğundan emin olun." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -"{identifier} hem {path} hem de {other_path} için SPDX Lisans Kimliğidir" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "Şu dosyalarda telif hakkı ve lisans bilgisi yok:" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "çıktıyı önler" + +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "çıktıyı JSON olarak biçimlendirir" + +#: src/reuse/cli/lint.py:86 #, fuzzy +msgid "Format output as plain text. (default)" +msgstr "çıktıyı düz metin olarak biçimlendirir" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "çıktıyı düz metin olarak biçimlendirir" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" -msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." +msgstr "" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "'{path}' okunamıyor" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "çıktıyı düz metin olarak biçimlendirir" + +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" -#: src/reuse/report.py:155 +#: src/reuse/cli/lint_file.py:64 #, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" +msgid "'{file}' is not inside of '{root}'." +msgstr "" + +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: hata: %(message)s\n" + +#: src/reuse/cli/main.py:40 +msgid "" +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:47 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." msgstr "" -#: src/reuse/report.py:519 +#: src/reuse/cli/main.py:54 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -#: src/reuse/report.py:530 +#: src/reuse/cli/main.py:62 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." msgstr "" +"reuse, REUSE önerileriyle uyum için bir araçtır. Daha fazla bilgi için " +" sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:69 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "FSFE'nin çalışmalarını destekleyin:" + +#: src/reuse/cli/main.py:78 +msgid "" +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" +"Gücümüz ve özerkliğimiz için bağışlar oldukça önemli. Gereken her yerde " +"Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." -#: src/reuse/report.py:551 +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "hata ayıklama cümlelerini etkinleştirir" + +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "kullanımdan kaldırma uyarılarını gizle" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "Git alt modüllerini atlamaz" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "Meson alt projelerini atlamaz" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "çoklu işlem kullanmaz" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "projenin kökünü tanımlar" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" + +#: src/reuse/cli/spdx.py:33 +msgid "File to write to." +msgstr "" + +#: src/reuse/cli/spdx.py:39 +#, fuzzy msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." msgstr "" +"LicenseConcluded sahasını doldur; lütfen reuse bu sahanın doğru olduğunu " +"güvence edemeyeceğini dikkate alın" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "SPDX raporunu imzalayan kişinin ismi" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "SPDX raporunu imzalayan kuruluşun ismi" -#: src/reuse/report.py:562 +#: src/reuse/cli/spdx.py:82 +#, fuzzy msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." msgstr "" +"hata: --add-license-concluded verildiğinde --creator-person=İSİM veya --" +"creator-organization=İSİM gereklidir" -#: src/reuse/report.py:571 +#: src/reuse/cli/spdx.py:97 +#, python-brace-format msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" msgstr "" +"'{path}' yaygın SPDX dosya deseniyle eşleşmiyor. Önerilen adlandırma " +"kurallarına şuradan bakabilirsiniz: https://spdx.github.io/spdx-spec/" +"conformance/#44-standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "tüm desteklenen SPDK lisanslarını listeler" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -475,11 +615,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: hata: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -678,170 +813,199 @@ msgid_plural "{len_type} values are required, but {len_value} were given." msgstr[0] "" msgstr[1] "" +#, fuzzy, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Tanınmayan {path} dosyası atlandı" + #, python-brace-format -#~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" -#~ msgstr "" -#~ "'{path}' tek satırlık yorumları desteklemiyor, lütfen --single-line " -#~ "kullanmayın" +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Halihazırda REUSE bilgisi içeren '{path}' dosyası atlanıyor" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Hata: '{path}' için yorum oluşturulamıyor" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' çok satırlı yorumları desteklemiyor, lütfen --multi-line " -#~ "kullanmayın" - -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--skip-unrecognised, --style ile kullanıldığında etkisizdir" - -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "--contributor, --copyright veya --license seçenekleri gereklidir" +#~ "Hata: '{path}' için üretilen başlık yorumu telif hakkı satırlarını veya " +#~ "lisans ifadelerini içermiyor. Şablon hatalı olabilir. Yeni başlık " +#~ "yazılmadı." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "{template} şablonu bulunamıyor" +#~ msgid "Successfully changed header of {path}" +#~ msgstr "{path} başlığı başarılı bir şekilde değiştirildi" -#~ msgid "can't write to '{}'" -#~ msgstr "'{}' yazılamıyor" +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "'{expression}' çözümlenemiyor" -#, fuzzy +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +#~ msgstr "'{path}' çözümlenemeyen bir SPDX ifadesine sahip, dosya atlanıyor" + +#~ msgid "generated comment is missing copyright lines or license expressions" #~ msgstr "" -#~ "Aşağıdaki dosya bilinen bir dosya uzantısına sahip değil. Lütfen --style, " -#~ "--force-dot-license veya --skip-unrecognised kullanın:" +#~ "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" -#~ msgid "copyright statement, repeatable" -#~ msgstr "telif hakkı ifadesi, tekrarlanabilir" +#~ msgid "'{}' found in:" +#~ msgstr "'{}' şurada mevcut:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Kimliği, tekrarlanabilir" +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "MODASI GEÇMİŞ LİSANSLAR" -#~ msgid "file contributor, repeatable" -#~ msgstr "dosyaya katkı veren, tekrarlanabilir" +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "Şu lisanslar artık SPDX tarafından kullanılmıyor:" -#~ msgid "year of copyright statement, optional" -#~ msgstr "telif hakkı ifadesi, isteğe bağlı" +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "DOSYA UZANTISI OLMAYAN LİSANSLAR" -#~ msgid "comment style to use, optional" -#~ msgstr "kullanılacak yorum biçimi, isteğe bağlı" +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Şu lisansların dosya uzantısı yok:" -#, fuzzy -#~ msgid "copyright prefix to use, optional" -#~ msgstr "kullanılacak telif hakkı biçimi, isteğe bağlı" +#~ msgid "MISSING LICENSES" +#~ msgstr "EKSİK LİSANSLAR" -#~ msgid "name of template to use, optional" -#~ msgstr "kullanılacak şablon ismi, isteğe bağlı" +#~ msgid "UNUSED LICENSES" +#~ msgstr "KULLANILMAYAN LİSANSLAR" -#~ msgid "do not include year in statement" -#~ msgstr "ifadede yıl içerme" +#~ msgid "The following licenses are not used:" +#~ msgstr "Şu lisanslar kullanılmıyor:" -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "" -#~ "eğer telif hakkı ifadeleri aynıysa telif hakkı satırlarını birleştir" +#~ msgid "READ ERRORS" +#~ msgstr "OKUMA HATALARI" -#~ msgid "force single-line comment style, optional" -#~ msgstr "tek satırlı yorum biçimi kullan, isteğe bağlı" +#~ msgid "Could not read:" +#~ msgstr "Okunamıyor:" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "çok satırlı yorum biçimi kullan, isteğe bağlı" +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "EKSİK TELİF HAKKI VE LİSANS BİLGİSİ" -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "" -#~ "başlıkları belirlenen dizinlerin altındaki tüm dosyalara yinelemeli " -#~ "olarak ekle" +#~ msgid "The following files have no copyright information:" +#~ msgstr "Şu dosyalarda telif hakkı bilgisi yok:" -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "dosyadaki ilk başlığı değiştirme; sadece yeni bir tane ekle" +#~ msgid "The following files have no licensing information:" +#~ msgstr "Şu dosyalarda lisans bilgisi yok:" -#, fuzzy -#~ msgid "always write a .license file instead of a header inside the file" -#~ msgstr "dosyanın başlığına yazmak yerine bir .license yazar" +#~ msgid "SUMMARY" +#~ msgstr "ÖZET" -#, fuzzy -#~ msgid "write a .license file to files with unrecognised comment styles" -#~ msgstr "tanımlanamayan yorum biçimleri içeren dosyaları atla" +#~ msgid "Bad licenses:" +#~ msgstr "Kötü lisanslar:" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "tanımlanamayan yorum biçimleri içeren dosyaları atla" +#~ msgid "Deprecated licenses:" +#~ msgstr "Modası geçmiş lisanslar:" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "halihazırda REUSE bilgisi içeren dosyaları atla" +#~ msgid "Licenses without file extension:" +#~ msgstr "Dosya uzantısı olmayan lisanslar:" -#, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' ikili bir dosya, bu nedenle başlık için '{new_path}' kullanılacak" +#~ msgid "Missing licenses:" +#~ msgstr "Eksik lisanslar:" + +#~ msgid "Unused licenses:" +#~ msgstr "Kullanılmayan lisanslar:" -#~ msgid "prevents output" -#~ msgstr "çıktıyı önler" +#~ msgid "Used licenses:" +#~ msgstr "Kullanılan lisanslar:" + +#~ msgid "Read errors:" +#~ msgstr "Okuma hataları:" + +#, fuzzy +#~ msgid "Files with copyright information:" +#~ msgstr "Telif hakkı içeren dosyalar:" #, fuzzy -#~ msgid "formats output as errors per line (default)" -#~ msgstr "çıktıyı düz metin olarak biçimlendirir" +#~ msgid "Files with license information:" +#~ msgstr "Lisans bilgisi içeren dosyalar:" #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." -#~ msgstr "" -#~ "reuse, REUSE önerileriyle uyum için bir araçtır. Daha fazla bilgi için " -#~ " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" +#~ msgstr "Tebrikler! Projeniz REUSE Belirtiminin {} sürümüyle uyumlu :-)" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." -#~ msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" +#~ msgstr "Maalesef, projeniz REUSE Belirtiminin {} sürümüyle uyumlu değil :-(" -#~ msgid "Support the FSFE's work:" -#~ msgstr "FSFE'nin çalışmalarını destekleyin:" +#, fuzzy, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "Modası geçmiş lisanslar:" +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "Dosya uzantısı olmayan lisanslar:" + +#, fuzzy, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "Kullanılmayan lisanslar:" + +#, fuzzy, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' .reuse/dep5 ile kapsanıyor" + +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "'{path}' kimliği belirleniyor" + +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} dosya uzantısına sahip değil" + +#, python-brace-format #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." #~ msgstr "" -#~ "Gücümüz ve özerkliğimiz için bağışlar oldukça önemli. Gereken her yerde " -#~ "Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." +#~ "{path} için, {identifier} olarak çözümlenen SPDX Lisans Kimliği " +#~ "anlaşılamadı. Lisansın listesinde " +#~ "bulunduğundan veya 'LicenseRef-' ile başladığından ve bir dosya " +#~ "uzantısına sahip olduğundan emin olun." -#~ msgid "enable debug statements" -#~ msgstr "hata ayıklama cümlelerini etkinleştirir" +#, python-brace-format +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} hem {path} hem de {other_path} için SPDX Lisans Kimliğidir" -#~ msgid "hide deprecation warnings" -#~ msgstr "kullanımdan kaldırma uyarılarını gizle" +#, fuzzy +#~ msgid "" +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" +#~ msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" -#~ msgid "do not skip over Git submodules" -#~ msgstr "Git alt modüllerini atlamaz" +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "'{path}' okunamıyor" -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "Meson alt projelerini atlamaz" +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" -#~ msgid "do not use multiprocessing" -#~ msgstr "çoklu işlem kullanmaz" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--skip-unrecognised, --style ile kullanıldığında etkisizdir" -#~ msgid "define root of project" -#~ msgstr "projenin kökünü tanımlar" +#~ msgid "can't write to '{}'" +#~ msgstr "'{}' yazılamıyor" #~ msgid "show program's version number and exit" #~ msgstr "programın sürüm numarasını gösterip çıkar" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" - #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#, fuzzy -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" - #~ msgid "list all non-compliant files" #~ msgstr "bütün uyumsuz dosyaları listeler" @@ -887,16 +1051,9 @@ msgstr[1] "" #~ "\n" #~ "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "tüm desteklenen SPDK lisanslarını listeler" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' bir dosya değil" @@ -909,93 +1066,15 @@ msgstr[1] "" #~ msgid "can't read or write '{}'" #~ msgstr "'{}' okunamıyor veya yazılamıyor" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Geçerli SPDX Lisans Kimlikleri listesi için " -#~ "adresine bakın." - -#, fuzzy -#~ msgid "no '.reuse/dep5' file" -#~ msgstr ".reuse/dep5 oluşturuluyor" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Lisansın SPDX Lisans Kimliği" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "projede tespit edilen bütün eksik lisansları indir" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Hata: {spdx_identifier} halihazırda mevcut." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Hata: lisans indirme başarısız oldu." - -#~ msgid "Is your internet connection working?" -#~ msgstr "İnternet bağlantınız çalışıyor mu?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "{spdx_identifier} başarılı bir şekilde indirildi." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--all ile birlikte kullanıldığında --output'un bir etkisi yok" #~ msgid "the following arguments are required: license" #~ msgstr "şu değişkenler gerekiyor: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "--output birden fazla lisansla birlikte kullanılamıyor" - -#~ msgid "formats output as JSON" -#~ msgstr "çıktıyı JSON olarak biçimlendirir" - -#, fuzzy -#~ msgid "formats output as plain text (default)" -#~ msgstr "çıktıyı düz metin olarak biçimlendirir" - -#, fuzzy -#~ msgid "formats output as errors per line" -#~ msgstr "çıktıyı düz metin olarak biçimlendirir" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "LicenseConcluded sahasını doldur; lütfen reuse bu sahanın doğru olduğunu " -#~ "güvence edemeyeceğini dikkate alın" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "SPDX raporunu imzalayan kişinin ismi" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "SPDX raporunu imzalayan kuruluşun ismi" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "hata: --add-license-concluded verildiğinde --creator-person=İSİM veya --" -#~ "creator-organization=İSİM gereklidir" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "'{path}' yaygın SPDX dosya deseniyle eşleşmiyor. Önerilen adlandırma " -#~ "kurallarına şuradan bakabilirsiniz: https://spdx.github.io/spdx-spec/" -#~ "conformance/#44-standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "kullanım: " @@ -1148,9 +1227,6 @@ msgstr[1] "" #~ msgid "What is the name of the project?" #~ msgstr "Projenin ismi nedir?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Projenin İnternet adresi nedir?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Bakımcının adı nedir?" @@ -1271,9 +1347,6 @@ msgstr[1] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "--exclude-year ve --year seçeneklerinden biri olmalıdır" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "--single-line ve --multi-line seçeneklerinden biri olmalıdır" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "" diff --git a/po/uk.po b/po/uk.po index 58212f46b..faa636da2 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:26+0000\n" +"POT-Creation-Date: 2024-10-10 16:33+0000\n" "PO-Revision-Date: 2024-09-11 19:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/_annotate.py:95 -#, python-brace-format -msgid "Skipped unrecognised file '{path}'" -msgstr "Пропущено нерозпізнаний файл '{path}'" - -#: src/reuse/_annotate.py:101 -#, python-brace-format -msgid "'{path}' is not recognised; creating '{path}.license'" -msgstr "'{path}' не розпізнано; створення '{path}.license'" +#: src/reuse/cli/annotate.py:62 +#, fuzzy +msgid "Option '--copyright', '--license', or '--contributor' is required." +msgstr "потрібен параметр --contributor, --copyright або --license" -#: src/reuse/_annotate.py:117 -#, python-brace-format -msgid "Skipped file '{path}' already containing REUSE information" -msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" +#: src/reuse/cli/annotate.py:123 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use '--" +"style', '--force-dot-license', '--fallback-dot-license', or '--skip-" +"unrecognised':" +msgstr "" +"Ці файли не мають розпізнаного файлового розширення. Використовуйте --style, " +"--force-dot-license, --fallback-dot-license або --skip-unrecognised:" -#: src/reuse/_annotate.py:151 -#, python-brace-format -msgid "Error: Could not create comment for '{path}'" -msgstr "Помилка: не вдалося створити коментар для '{path}'" +#: src/reuse/cli/annotate.py:156 +#, fuzzy, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use '--single-" +"line'." +msgstr "" +"'{path}' не підтримує однорядкові коментарі, не використовуйте --single-line" -#: src/reuse/_annotate.py:158 -#, python-brace-format +#: src/reuse/cli/annotate.py:163 +#, fuzzy, python-brace-format msgid "" -"Error: Generated comment header for '{path}' is missing copyright lines or " -"license expressions. The template is probably incorrect. Did not write new " -"header." +"'{path}' does not support multi-line comments, please do not use '--multi-" +"line'." msgstr "" -"Помилка: у згенерованому заголовку коментаря для '{path}' відсутні рядки " -"авторських прав або вирази ліцензії. Шаблон, ймовірно, неправильний. Не " -"записано новий заголовок." +"'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-line" -#. TODO: This may need to be rephrased more elegantly. -#: src/reuse/_annotate.py:169 -#, python-brace-format -msgid "Successfully changed header of {path}" -msgstr "Успішно змінено заголовок {path}" +#: src/reuse/cli/annotate.py:209 +#, fuzzy, python-brace-format +msgid "Template '{template}' could not be found." +msgstr "не вдалося знайти шаблон {template}" -#: src/reuse/_util.py:328 src/reuse/global_licensing.py:233 -#, python-brace-format -msgid "Could not parse '{expression}'" -msgstr "Не вдалося проаналізувати '{expression}'" +#: src/reuse/cli/annotate.py:272 +#, fuzzy +msgid "Add copyright and licensing into the headers of files." +msgstr "додати авторські права та ліцензії в заголовок файлів" -#: src/reuse/_util.py:384 -#, python-brace-format +#: src/reuse/cli/annotate.py:275 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files." msgstr "" -"'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" -#: src/reuse/global_licensing.py:120 -#, python-brace-format +#: src/reuse/cli/annotate.py:281 msgid "" -"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." msgstr "" -"{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/global_licensing.py:134 -#, python-brace-format -msgid "" -"Item in {attr_name} collection must be a {type_name} (got {item_value} that " -"is a {item_class})." +#: src/reuse/cli/annotate.py:293 +msgid "COPYRIGHT" msgstr "" -"Елемент у колекції {attr_name} має бути {type_name} (отримано {item_value}, " -"що є {item_class})." -#: src/reuse/global_licensing.py:146 -#, python-brace-format -msgid "{attr_name} must not be empty." -msgstr "{attr_name} не повинне бути порожнім." - -#: src/reuse/global_licensing.py:170 -#, python-brace-format -msgid "{name} must be a {type} (got {value} that is a {value_type})." -msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." +#: src/reuse/cli/annotate.py:296 +#, fuzzy +msgid "Copyright statement, repeatable." +msgstr "оголошення авторського права, повторюване" -#: src/reuse/global_licensing.py:194 -#, python-brace-format -msgid "" -"The value of 'precedence' must be one of {precedence_vals} (got {received})" +#: src/reuse/cli/annotate.py:302 +msgid "SPDX_IDENTIFIER" msgstr "" -"Значення 'precedence' має бути одним з {precedence_vals} (отримано " -"{received})" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" +#: src/reuse/cli/annotate.py:305 +#, fuzzy +msgid "SPDX License Identifier, repeatable." +msgstr "Ідентифікатор SPDX, повторюваний" + +#: src/reuse/cli/annotate.py:310 +msgid "CONTRIBUTOR" msgstr "" -"у згенерованому коментарі відсутні рядки про авторські права або вирази " -"ліцензії" -#: src/reuse/lint.py:38 -msgid "BAD LICENSES" -msgstr "ПОГАНІ ЛІЦЕНЗІЇ" +#: src/reuse/cli/annotate.py:313 +#, fuzzy +msgid "File contributor, repeatable." +msgstr "співавтор файлу, повторюваний" -#: src/reuse/lint.py:40 src/reuse/lint.py:69 -msgid "'{}' found in:" -msgstr "'{}' знайдено в:" +#: src/reuse/cli/annotate.py:319 +msgid "YEAR" +msgstr "" -#: src/reuse/lint.py:47 -msgid "DEPRECATED LICENSES" -msgstr "ЗАСТАРІЛІ ЛІЦЕНЗІЇ" +#: src/reuse/cli/annotate.py:325 +#, fuzzy +msgid "Year of copyright statement." +msgstr "рік оголошення авторського права, необов'язково" -#: src/reuse/lint.py:49 -msgid "The following licenses are deprecated by SPDX:" -msgstr "У SPDX застаріли такі ліцензії:" +#: src/reuse/cli/annotate.py:333 +#, fuzzy +msgid "Comment style to use." +msgstr "використовуваний стиль коментарів, необов'язковий" -#: src/reuse/lint.py:57 -msgid "LICENSES WITHOUT FILE EXTENSION" -msgstr "ЛІЦЕНЗІЇ БЕЗ РОЗШИРЕННЯ ФАЙЛУ" +#: src/reuse/cli/annotate.py:338 +#, fuzzy +msgid "Copyright prefix to use." +msgstr "префікс авторського права для користування, опціонально" -#: src/reuse/lint.py:59 -msgid "The following licenses have no file extension:" -msgstr "Ці ліцензії не мають розширення файлу:" +#: src/reuse/cli/annotate.py:349 +msgid "TEMPLATE" +msgstr "" -#: src/reuse/lint.py:67 -msgid "MISSING LICENSES" -msgstr "ВІДСУТНІ ЛІЦЕНЗІЇ" +#: src/reuse/cli/annotate.py:351 +#, fuzzy +msgid "Name of template to use." +msgstr "використовувана назва шаблону, необов'язково" -#: src/reuse/lint.py:76 -msgid "UNUSED LICENSES" -msgstr "НЕВИКОРИСТАНІ ЛІЦЕНЗІЇ" +#: src/reuse/cli/annotate.py:358 +#, fuzzy +msgid "Do not include year in copyright statement." +msgstr "не включати рік в оголошення" -#: src/reuse/lint.py:77 -msgid "The following licenses are not used:" -msgstr "Не використовуються такі ліцензії:" +#: src/reuse/cli/annotate.py:363 +#, fuzzy +msgid "Merge copyright lines if copyright statements are identical." +msgstr "" +"об’єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні" -#: src/reuse/lint.py:84 -msgid "READ ERRORS" -msgstr "ПОМИЛКИ ЧИТАННЯ" +#: src/reuse/cli/annotate.py:370 +#, fuzzy +msgid "Force single-line comment style." +msgstr "примусовий однорядковий стиль коментаря, необов'язково" -#: src/reuse/lint.py:85 -msgid "Could not read:" -msgstr "Не вдалося прочитати:" +#: src/reuse/cli/annotate.py:377 +#, fuzzy +msgid "Force multi-line comment style." +msgstr "примусовий багаторядковий стиль коментарів, необов'язково" -#: src/reuse/lint.py:106 -msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" -msgstr "ВІДСУТНІ ВІДОМОСТІ ПРО АВТОРСЬКІ ПРАВА ТА ЛІЦЕНЗУВАННЯ" +#: src/reuse/cli/annotate.py:383 +#, fuzzy +msgid "Add headers to all files under specified directories recursively." +msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" -#: src/reuse/lint.py:112 -msgid "The following files have no copyright and licensing information:" -msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" +#: src/reuse/cli/annotate.py:388 +#, fuzzy +msgid "Do not replace the first header in the file; just add a new one." +msgstr "не замінювати перший заголовок у файлі; просто додавати новий" -#: src/reuse/lint.py:123 -msgid "The following files have no copyright information:" -msgstr "Такі файли не містять відомостей про авторські права:" +#: src/reuse/cli/annotate.py:395 +#, fuzzy +msgid "Always write a .license file instead of a header inside the file." +msgstr "завжди записуйте файл .license замість заголовка всередині файлу" -#: src/reuse/lint.py:132 -msgid "The following files have no licensing information:" -msgstr "Такі файли не мають відомостей про ліцензування:" +#: src/reuse/cli/annotate.py:402 +#, fuzzy +msgid "Write a .license file to files with unrecognised comment styles." +msgstr "дописати файл .license до файлів з нерозпізнаними стилями коментарів" -#: src/reuse/lint.py:140 -msgid "SUMMARY" -msgstr "ПІДСУМОК" +#: src/reuse/cli/annotate.py:409 +#, fuzzy +msgid "Skip files with unrecognised comment styles." +msgstr "пропускати файли з нерозпізнаними стилями коментарів" -#: src/reuse/lint.py:145 -msgid "Bad licenses:" -msgstr "Погані ліцензії:" +#: src/reuse/cli/annotate.py:420 +#, fuzzy +msgid "Skip files that already contain REUSE information." +msgstr "пропускати файли, які вже містять інформацію REUSE" -#: src/reuse/lint.py:146 -msgid "Deprecated licenses:" -msgstr "Застарілі ліцензії:" +#: src/reuse/cli/annotate.py:424 +msgid "PATH" +msgstr "" -#: src/reuse/lint.py:147 -msgid "Licenses without file extension:" -msgstr "Ліцензії без розширення файлу:" +#: src/reuse/cli/annotate.py:474 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' — це двійковий файл, тому для заголовка використовується " +"'{new_path}'" -#: src/reuse/lint.py:150 -msgid "Missing licenses:" -msgstr "Відсутні ліцензії:" +#: src/reuse/cli/common.py:58 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" +msgstr "" +"'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " +"{message}" -#: src/reuse/lint.py:151 -msgid "Unused licenses:" -msgstr "Невикористані ліцензії:" +#: src/reuse/cli/common.py:97 +#, python-brace-format +msgid "'{name}' is mutually exclusive with: {opts}" +msgstr "" -#: src/reuse/lint.py:152 -msgid "Used licenses:" -msgstr "Використані ліцензії:" +#: src/reuse/cli/common.py:114 +#, fuzzy +msgid "'{}' is not a valid SPDX expression." +msgstr "'{}' не є дійсним виразом SPDX, переривання" -#: src/reuse/lint.py:153 -msgid "Read errors:" -msgstr "Помилки читання:" +#: src/reuse/cli/convert_dep5.py:19 +msgid "" +"Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " +"the project root and is semantically identical. The .reuse/dep5 file is " +"subsequently deleted." +msgstr "" -#: src/reuse/lint.py:155 -msgid "Files with copyright information:" -msgstr "Файли з інформацією про авторські права:" +#: src/reuse/cli/convert_dep5.py:31 +#, fuzzy +msgid "No '.reuse/dep5' file." +msgstr "немає файлу '.reuse/dep5" -#: src/reuse/lint.py:159 -msgid "Files with license information:" -msgstr "Файли з інформацією про ліцензію:" +#: src/reuse/cli/download.py:52 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." -#: src/reuse/lint.py:176 -msgid "" -"Congratulations! Your project is compliant with version {} of the REUSE " -"Specification :-)" -msgstr "Вітаємо! Ваш проєкт відповідає версії {} специфікації REUSE :-)" +#: src/reuse/cli/download.py:59 +#, fuzzy +msgid "Did you mean:" +msgstr "Ви мали на увазі:" -#: src/reuse/lint.py:183 +#: src/reuse/cli/download.py:66 msgid "" -"Unfortunately, your project is not compliant with version {} of the REUSE " -"Specification :-(" -msgstr "На жаль, ваш проєкт не сумісний із версією {} специфікації REUSE :-(" - -#: src/reuse/lint.py:190 -msgid "RECOMMENDATIONS" -msgstr "РЕКОМЕНДАЦІЇ" +"See for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Перегляньте список дійсних ідентифікаторів " +"ліцензії SPDX." -#: src/reuse/lint.py:254 +#: src/reuse/cli/download.py:75 #, python-brace-format -msgid "{path}: missing license {lic}\n" -msgstr "{path}: пропущена ліцензія {lic}\n" +msgid "Error: {spdx_identifier} already exists." +msgstr "Помилка: {spdx_identifier} вже існує." -#: src/reuse/lint.py:259 -#, python-brace-format -msgid "{path}: read error\n" -msgstr "{path}: помилка читання\n" +#: src/reuse/cli/download.py:82 +#, fuzzy, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Помилка: {path} не існує." -#: src/reuse/lint.py:263 -#, python-brace-format -msgid "{path}: no license identifier\n" -msgstr "{path}: немає ідентифікатора ліцензії\n" +#: src/reuse/cli/download.py:86 +msgid "Error: Failed to download license." +msgstr "Помилка: не вдалося завантажити ліцензію." -#: src/reuse/lint.py:267 -#, python-brace-format -msgid "{path}: no copyright notice\n" -msgstr "{path}: без повідомлення про авторське право\n" +#: src/reuse/cli/download.py:91 +msgid "Is your internet connection working?" +msgstr "Чи працює ваше інтернет-з'єднання?" -#: src/reuse/lint.py:294 +#: src/reuse/cli/download.py:96 #, python-brace-format -msgid "{path}: bad license {lic}\n" -msgstr "{path}: погана ліцензія {lic}\n" +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Успішно завантажено {spdx_identifier}." -#: src/reuse/lint.py:301 -#, python-brace-format -msgid "{lic_path}: deprecated license\n" -msgstr "{lic_path}: застаріла ліцензія\n" +#: src/reuse/cli/download.py:106 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." -#: src/reuse/lint.py:308 -#, python-brace-format -msgid "{lic_path}: license without file extension\n" -msgstr "{lic_path}: ліцензія без розширення файлу\n" +#: src/reuse/cli/download.py:109 +msgid "" +"LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " +"multiple times to download multiple licenses." +msgstr "" -#: src/reuse/lint.py:317 -#, python-brace-format -msgid "{lic_path}: unused license\n" -msgstr "{lic_path}: невикористана ліцензія\n" +#: src/reuse/cli/download.py:122 +#, fuzzy +msgid "Download all missing licenses detected in the project." +msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" -#: src/reuse/project.py:260 -#, python-brace-format -msgid "'{path}' covered by {global_path}" -msgstr "'{path}' покрито за рахунок {global_path}" +#: src/reuse/cli/download.py:130 +msgid "Path to download to." +msgstr "" -#: src/reuse/project.py:268 -#, python-brace-format +#: src/reuse/cli/download.py:136 +#, fuzzy msgid "" -"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." -msgstr "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." +"Source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself." +msgstr "" +"джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " +"каталог, який містить файл, або сам файл" + +#: src/reuse/cli/download.py:142 +#, fuzzy +msgid "LICENSE" +msgstr "ПОГАНІ ЛІЦЕНЗІЇ" -#: src/reuse/project.py:275 +#: src/reuse/cli/download.py:158 +#, fuzzy +msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." +msgstr "параметр --single-line і --multi-line взаємосуперечливі" + +#: src/reuse/cli/download.py:172 +#, fuzzy +msgid "Cannot use '--output' with more than one license." +msgstr "не можна використовувати --output з кількома ліцензіями" + +#: src/reuse/cli/lint.py:27 #, python-brace-format msgid "" -"'{path}' was detected as a binary file; not searching its contents for REUSE " -"information." +"Lint the project directory for REUSE compliance. This version of the tool " +"checks against version {reuse_version} of the REUSE Specification. You can " +"find the latest version of the specification at ." msgstr "" -"'{path}' виявлено як двійковий файл або його розширення позначено таким, що " -"не коментується; пошук інформації у його вмісті для REUSE не виконується." -#: src/reuse/project.py:336 -msgid "" -"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " -"Use `reuse convert-dep5` to convert." +#: src/reuse/cli/lint.py:33 +msgid "Specifically, the following criteria are checked:" msgstr "" -"'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " -"REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." -#: src/reuse/project.py:357 -#, python-brace-format +#: src/reuse/cli/lint.py:36 msgid "" -"Found both '{new_path}' and '{old_path}'. You cannot keep both files " -"simultaneously; they are not intercompatible." +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?" msgstr "" -"Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати обидва " -"файли одночасно, вони несумісні." -#: src/reuse/project.py:416 -#, python-brace-format -msgid "determining identifier of '{path}'" -msgstr "визначення ідентифікатора '{path}'" +#: src/reuse/cli/lint.py:40 +#, fuzzy +msgid "- Are there any deprecated licenses in the project?" +msgstr "Яка інтернет-адреса проєкту?" -#: src/reuse/project.py:424 -#, python-brace-format -msgid "{path} does not have a file extension" -msgstr "{path} не має розширення файлу" +#: src/reuse/cli/lint.py:43 +msgid "" +"- Are there any license files in the LICENSES/ directory without file " +"extension?" +msgstr "" -#: src/reuse/project.py:434 -#, python-brace-format +#: src/reuse/cli/lint.py:48 msgid "" -"Could not resolve SPDX License Identifier of {path}, resolving to " -"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " -"file extension." +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?" msgstr "" -"Не вдалося розпізнати ідентифікатор ліцензії SPDX {path}. Його розв'язано як " -"{identifier}. Переконайтеся, що ліцензія є у списку ліцензій на або що вона починається з 'LicenseRef-' і має розширення " -"файлу." -#: src/reuse/project.py:446 -#, python-brace-format +#: src/reuse/cli/lint.py:53 msgid "" -"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?" +msgstr "" + +#: src/reuse/cli/lint.py:57 +msgid "- Are there any read errors?" msgstr "" -"{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" -#: src/reuse/project.py:485 +#: src/reuse/cli/lint.py:59 +#, fuzzy +msgid "- Do all files have valid copyright and licensing information?" +msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" + +#: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 +#, fuzzy +msgid "Prevent output." +msgstr "запобігає виводу" + +#: src/reuse/cli/lint.py:78 +#, fuzzy +msgid "Format output as JSON." +msgstr "форматує вивід як JSON" + +#: src/reuse/cli/lint.py:86 +#, fuzzy +msgid "Format output as plain text. (default)" +msgstr "форматує вивід як звичайний текст (усталено)" + +#: src/reuse/cli/lint.py:94 +#, fuzzy +msgid "Format output as errors per line." +msgstr "форматує вивід у вигляді помилок на рядок" + +#: src/reuse/cli/lint_file.py:25 msgid "" -"project '{}' is not a VCS repository or required VCS software is not " -"installed" +"Lint individual files for REUSE compliance. The specified FILEs are checked " +"for the presence of copyright and licensing information, and whether the " +"found licenses are included in the LICENSES/ directory." msgstr "" -"проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS не " -"встановлено" -#: src/reuse/report.py:150 -#, python-brace-format -msgid "Could not read '{path}'" -msgstr "Не вдалося прочитати '{path}'" +#: src/reuse/cli/lint_file.py:46 +#, fuzzy +msgid "Format output as errors per line. (default)" +msgstr "форматує вивід у вигляді помилок на рядок (усталено)" -#: src/reuse/report.py:155 -#, python-brace-format -msgid "Unexpected error occurred while parsing '{path}'" -msgstr "Під час аналізу '{path}' сталася неочікувана помилка" +#: src/reuse/cli/lint_file.py:50 +msgid "FILE" +msgstr "" + +#: src/reuse/cli/lint_file.py:64 +#, fuzzy, python-brace-format +msgid "'{file}' is not inside of '{root}'." +msgstr "'{file}' не розміщено в '{root}'" + +#: src/reuse/cli/main.py:37 +#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 +#, fuzzy, python-format +msgid "%(prog)s, version %(version)s" +msgstr "%(prog)s: помилка: %(message)s\n" -#: src/reuse/report.py:508 +#: src/reuse/cli/main.py:40 msgid "" -"Fix bad licenses: At least one license in the LICENSES directory and/or " -"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " -"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " -"custom licenses: https://reuse.software/faq/#custom-license" -msgstr "" -"Виправте недійсні ліцензії: Принаймні одна ліцензія в директорії LICENSES та/" -"або вказана у тегах 'SPDX-License-Identifier' недійсна. Вони або не мають " -"дійсних ідентифікаторів ліцензій SPDX, або не починаються з 'LicenseRef-'. " -"Часті запитання про користувацькі ліцензії: https://reuse.software/faq/" -"#custom-license" - -#: src/reuse/report.py:519 +"This program is free software: you can redistribute it and/or modify it " +"under the terms of the GNU General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version." +msgstr "" + +#: src/reuse/cli/main.py:47 msgid "" -"Fix deprecated licenses: At least one of the licenses in the LICENSES " -"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" -"dep5' has been deprecated by SPDX. The current list and their respective " -"recommended new identifiers can be found here: " -msgstr "" -"Виправте застарілі ліцензії: Принаймні одна з ліцензій у каталозі LICENSES " -"та/або зазначена у тезі 'SPDX-License-Identifier' або у файлі '.reuse/dep5' " -"застаріла для SPDX. Поточний список і відповідні рекомендовані нові " -"ідентифікатори можна знайти тут: " - -#: src/reuse/report.py:530 +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details." +msgstr "" + +#: src/reuse/cli/main.py:54 msgid "" -"Fix licenses without file extension: At least one license text file in the " -"'LICENSES' directory does not have a '.txt' file extension. Please rename " -"the file(s) accordingly." +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see ." msgstr "" -"Виправте ліцензії без розширення файлів: Принаймні один текстовий файл " -"ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " -"файл(и) відповідно." -#: src/reuse/report.py:539 +#: src/reuse/cli/main.py:62 msgid "" -"Fix missing licenses: For at least one of the license identifiers provided " -"by the 'SPDX-License-Identifier' tags, there is no corresponding license " -"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " -"simply run 'reuse download --all' to get any missing ones. For custom " -"licenses (starting with 'LicenseRef-'), you need to add these files yourself." -msgstr "" -"Виправте відсутні ліцензії: Принаймні для одного з ідентифікаторів ліцензій, " -"зазначених у тегах 'SPDX-License-Identifier', у директорії 'LICENSES' " -"відсутній відповідний текстовий файл ліцензії. Для ідентифікаторів ліцензій " -"SPDX ви можете просто виконати команду 'reuse download --all', щоб отримати " -"будь-які відсутні ідентифікатори. Для користувацьких ліцензій (починаючи з " -"'LicenseRef-') вам потрібно додати ці файли самостійно." - -#: src/reuse/report.py:551 +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse — це засіб для дотримання порад REUSE. Перегляньте для отримання додаткових відомостей і перегляду онлайн-документації." + +#: src/reuse/cli/main.py:69 msgid "" -"Fix unused licenses: At least one of the license text files in 'LICENSES' is " -"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " -"make sure that you either tag the accordingly licensed files properly, or " -"delete the unused license text if you are sure that no file or code snippet " -"is licensed as such." -msgstr "" -"Виправте невикористані ліцензії: Принаймні на один з файлів з текстом " -"ліцензії у 'LICENSES' немає жодного посилання, наприклад, за допомогою тегу " -"'SPDX-License-Identifier'. Переконайтеся, що ви або правильно позначили " -"відповідні ліцензовані файли, або видаліть невикористаний текст ліцензії, " -"якщо ви впевнені, що жоден файл або фрагмент коду не ліцензований як такий." - -#: src/reuse/report.py:562 +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." + +#: src/reuse/cli/main.py:73 +msgid "Support the FSFE's work:" +msgstr "Підтримати роботу FSFE:" + +#: src/reuse/cli/main.py:78 msgid "" -"Fix read errors: At least one of the files in your directory cannot be read " -"by the tool. Please check the file permissions. You will find the affected " -"files at the top of the output as part of the logged error messages." +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." msgstr "" -"Виправте помилки читання: Принаймні один з файлів у вашій директорії не може " -"бути прочитаний інструментом. Перевірте права доступу до файлів. Ви знайдете " -"відповідні файли у верхній частині виводу як частину зареєстрованих " -"повідомлень про помилки." +"Внески мають вирішальне значення для нашої стійкості й незалежності. Вони " +"дають нам змогу продовжувати працювати над вільним програмним забезпеченням, " +"де це необхідно. Будь ласка, розгляньте можливість підтримати нас на " +"." + +#: src/reuse/cli/main.py:89 +#, fuzzy +msgid "Enable debug statements." +msgstr "увімкнути інструкції налагодження" -#: src/reuse/report.py:571 +#: src/reuse/cli/main.py:94 +#, fuzzy +msgid "Hide deprecation warnings." +msgstr "сховати попередження про застарілість" + +#: src/reuse/cli/main.py:99 +#, fuzzy +msgid "Do not skip over Git submodules." +msgstr "не пропускати підмодулі Git" + +#: src/reuse/cli/main.py:104 +#, fuzzy +msgid "Do not skip over Meson subprojects." +msgstr "не пропускати підпроєкти Meson" + +#: src/reuse/cli/main.py:109 +#, fuzzy +msgid "Do not use multiprocessing." +msgstr "не використовувати багатопроцесорність" + +#: src/reuse/cli/main.py:119 +#, fuzzy +msgid "Define root of project." +msgstr "визначити кореневий каталог проєкту" + +#: src/reuse/cli/spdx.py:23 +#, fuzzy +msgid "Generate an SPDX bill of materials." +msgstr "друкувати опис матеріалів проєкту у форматі SPDX" + +#: src/reuse/cli/spdx.py:33 +#, fuzzy +msgid "File to write to." +msgstr "файли для перевірки" + +#: src/reuse/cli/spdx.py:39 +#, fuzzy msgid "" -"Fix missing copyright/licensing information: For one or more files, the tool " -"cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " -"file. The tutorial explains additional ways to do this: " -msgstr "" -"Виправте відсутню інформацію про авторські права/ліцензування: Для одного " -"або кількох файлів інструмент не може знайти інформацію про авторські права " -"та/або ліцензування. Зазвичай це можна зробити, додавши до кожного файлу " -"теги 'SPDX-FileCopyrightText' і 'SPDX-License-Identifier'. У довіднику " -"описано інші способи зробити це: " +"Populate the LicenseConcluded field; note that reuse cannot guarantee that " +"the field is accurate." +msgstr "" +"заповніть поле LicenseConcluded; зауважте, що повторне використання не може " +"гарантувати точність поля" + +#: src/reuse/cli/spdx.py:51 +#, fuzzy +msgid "Name of the person signing off on the SPDX report." +msgstr "ім'я особи, яка підписує звіт SPDX" + +#: src/reuse/cli/spdx.py:55 +#, fuzzy +msgid "Name of the organization signing off on the SPDX report." +msgstr "назва організації, яка підписує звіт SPDX" + +#: src/reuse/cli/spdx.py:82 +#, fuzzy +msgid "" +"'--creator-person' or '--creator-organization' is required when '--add-" +"license-concluded' is provided." +msgstr "" +"помилка: --creator-person=NAME або --creator-organization=NAME вимагається, " +"якщо надається --add-license-concluded" + +#: src/reuse/cli/spdx.py:97 +#, python-brace-format +msgid "" +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"'{path}' не відповідає загальному шаблону файлу SPDX. Знайдіть запропоновані " +"правила іменування тут: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" + +#: src/reuse/cli/supported_licenses.py:15 +#, fuzzy +msgid "List all licenses on the SPDX License List." +msgstr "список всіх підтримуваних ліцензій SPDX" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -528,11 +627,6 @@ msgstr "" msgid "required" msgstr "" -#: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format -msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: помилка: %(message)s\n" - #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 #, fuzzy msgid "Show the version and exit." @@ -736,168 +830,371 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#, python-brace-format +#~ msgid "Skipped unrecognised file '{path}'" +#~ msgstr "Пропущено нерозпізнаний файл '{path}'" + +#, python-brace-format +#~ msgid "'{path}' is not recognised; creating '{path}.license'" +#~ msgstr "'{path}' не розпізнано; створення '{path}.license'" + +#, python-brace-format +#~ msgid "Skipped file '{path}' already containing REUSE information" +#~ msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" + +#, python-brace-format +#~ msgid "Error: Could not create comment for '{path}'" +#~ msgstr "Помилка: не вдалося створити коментар для '{path}'" + #, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Error: Generated comment header for '{path}' is missing copyright lines " +#~ "or license expressions. The template is probably incorrect. Did not write " +#~ "new header." #~ msgstr "" -#~ "'{path}' не підтримує однорядкові коментарі, не використовуйте --single-" -#~ "line" +#~ "Помилка: у згенерованому заголовку коментаря для '{path}' відсутні рядки " +#~ "авторських прав або вирази ліцензії. Шаблон, ймовірно, неправильний. Не " +#~ "записано новий заголовок." + +#, python-brace-format +#~ msgid "Successfully changed header of {path}" +#~ msgstr "Успішно змінено заголовок {path}" + +#, python-brace-format +#~ msgid "Could not parse '{expression}'" +#~ msgstr "Не вдалося проаналізувати '{expression}'" #, python-brace-format #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" #~ msgstr "" -#~ "'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-" -#~ "line" +#~ "'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--skip-unrecognised не працює разом із --style" +#, python-brace-format +#~ msgid "" +#~ "{attr_name} must be a {type_name} (got {value} that is a {value_class})." +#~ msgstr "" +#~ "{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "потрібен параметр --contributor, --copyright або --license" +#, python-brace-format +#~ msgid "" +#~ "Item in {attr_name} collection must be a {type_name} (got {item_value} " +#~ "that is a {item_class})." +#~ msgstr "" +#~ "Елемент у колекції {attr_name} має бути {type_name} (отримано " +#~ "{item_value}, що є {item_class})." #, python-brace-format -#~ msgid "template {template} could not be found" -#~ msgstr "не вдалося знайти шаблон {template}" +#~ msgid "{attr_name} must not be empty." +#~ msgstr "{attr_name} не повинне бути порожнім." -#~ msgid "can't write to '{}'" -#~ msgstr "неможливо записати в '{}'" +#, python-brace-format +#~ msgid "{name} must be a {type} (got {value} that is a {value_type})." +#~ msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." +#, python-brace-format #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license, --fallback-dot-license, or --skip-" -#~ "unrecognised:" +#~ "The value of 'precedence' must be one of {precedence_vals} (got " +#~ "{received})" #~ msgstr "" -#~ "Ці файли не мають розпізнаного файлового розширення. Використовуйте --" -#~ "style, --force-dot-license, --fallback-dot-license або --skip-" -#~ "unrecognised:" +#~ "Значення 'precedence' має бути одним з {precedence_vals} (отримано " +#~ "{received})" + +#~ msgid "generated comment is missing copyright lines or license expressions" +#~ msgstr "" +#~ "у згенерованому коментарі відсутні рядки про авторські права або вирази " +#~ "ліцензії" + +#~ msgid "'{}' found in:" +#~ msgstr "'{}' знайдено в:" + +#~ msgid "DEPRECATED LICENSES" +#~ msgstr "ЗАСТАРІЛІ ЛІЦЕНЗІЇ" + +#~ msgid "The following licenses are deprecated by SPDX:" +#~ msgstr "У SPDX застаріли такі ліцензії:" + +#~ msgid "LICENSES WITHOUT FILE EXTENSION" +#~ msgstr "ЛІЦЕНЗІЇ БЕЗ РОЗШИРЕННЯ ФАЙЛУ" + +#~ msgid "The following licenses have no file extension:" +#~ msgstr "Ці ліцензії не мають розширення файлу:" + +#~ msgid "MISSING LICENSES" +#~ msgstr "ВІДСУТНІ ЛІЦЕНЗІЇ" + +#~ msgid "UNUSED LICENSES" +#~ msgstr "НЕВИКОРИСТАНІ ЛІЦЕНЗІЇ" + +#~ msgid "The following licenses are not used:" +#~ msgstr "Не використовуються такі ліцензії:" + +#~ msgid "READ ERRORS" +#~ msgstr "ПОМИЛКИ ЧИТАННЯ" + +#~ msgid "Could not read:" +#~ msgstr "Не вдалося прочитати:" + +#~ msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +#~ msgstr "ВІДСУТНІ ВІДОМОСТІ ПРО АВТОРСЬКІ ПРАВА ТА ЛІЦЕНЗУВАННЯ" + +#~ msgid "The following files have no copyright information:" +#~ msgstr "Такі файли не містять відомостей про авторські права:" + +#~ msgid "The following files have no licensing information:" +#~ msgstr "Такі файли не мають відомостей про ліцензування:" + +#~ msgid "SUMMARY" +#~ msgstr "ПІДСУМОК" + +#~ msgid "Bad licenses:" +#~ msgstr "Погані ліцензії:" -#~ msgid "copyright statement, repeatable" -#~ msgstr "оголошення авторського права, повторюване" +#~ msgid "Deprecated licenses:" +#~ msgstr "Застарілі ліцензії:" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Ідентифікатор SPDX, повторюваний" +#~ msgid "Licenses without file extension:" +#~ msgstr "Ліцензії без розширення файлу:" -#~ msgid "file contributor, repeatable" -#~ msgstr "співавтор файлу, повторюваний" +#~ msgid "Missing licenses:" +#~ msgstr "Відсутні ліцензії:" -#~ msgid "year of copyright statement, optional" -#~ msgstr "рік оголошення авторського права, необов'язково" +#~ msgid "Unused licenses:" +#~ msgstr "Невикористані ліцензії:" -#~ msgid "comment style to use, optional" -#~ msgstr "використовуваний стиль коментарів, необов'язковий" +#~ msgid "Used licenses:" +#~ msgstr "Використані ліцензії:" -#~ msgid "copyright prefix to use, optional" -#~ msgstr "префікс авторського права для користування, опціонально" +#~ msgid "Read errors:" +#~ msgstr "Помилки читання:" -#~ msgid "name of template to use, optional" -#~ msgstr "використовувана назва шаблону, необов'язково" +#~ msgid "Files with copyright information:" +#~ msgstr "Файли з інформацією про авторські права:" -#~ msgid "do not include year in statement" -#~ msgstr "не включати рік в оголошення" +#~ msgid "Files with license information:" +#~ msgstr "Файли з інформацією про ліцензію:" -#~ msgid "merge copyright lines if copyright statements are identical" +#~ msgid "" +#~ "Congratulations! Your project is compliant with version {} of the REUSE " +#~ "Specification :-)" +#~ msgstr "Вітаємо! Ваш проєкт відповідає версії {} специфікації REUSE :-)" + +#~ msgid "" +#~ "Unfortunately, your project is not compliant with version {} of the REUSE " +#~ "Specification :-(" #~ msgstr "" -#~ "об’єднувати рядки авторських прав, якщо оголошення авторських прав " -#~ "ідентичні" +#~ "На жаль, ваш проєкт не сумісний із версією {} специфікації REUSE :-(" -#~ msgid "force single-line comment style, optional" -#~ msgstr "примусовий однорядковий стиль коментаря, необов'язково" +#~ msgid "RECOMMENDATIONS" +#~ msgstr "РЕКОМЕНДАЦІЇ" + +#, python-brace-format +#~ msgid "{path}: missing license {lic}\n" +#~ msgstr "{path}: пропущена ліцензія {lic}\n" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "примусовий багаторядковий стиль коментарів, необов'язково" +#, python-brace-format +#~ msgid "{path}: read error\n" +#~ msgstr "{path}: помилка читання\n" -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" +#, python-brace-format +#~ msgid "{path}: no license identifier\n" +#~ msgstr "{path}: немає ідентифікатора ліцензії\n" -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "не замінювати перший заголовок у файлі; просто додавати новий" +#, python-brace-format +#~ msgid "{path}: no copyright notice\n" +#~ msgstr "{path}: без повідомлення про авторське право\n" -#~ msgid "always write a .license file instead of a header inside the file" -#~ msgstr "завжди записуйте файл .license замість заголовка всередині файлу" +#, python-brace-format +#~ msgid "{path}: bad license {lic}\n" +#~ msgstr "{path}: погана ліцензія {lic}\n" -#~ msgid "write a .license file to files with unrecognised comment styles" +#, python-brace-format +#~ msgid "{lic_path}: deprecated license\n" +#~ msgstr "{lic_path}: застаріла ліцензія\n" + +#, python-brace-format +#~ msgid "{lic_path}: license without file extension\n" +#~ msgstr "{lic_path}: ліцензія без розширення файлу\n" + +#, python-brace-format +#~ msgid "{lic_path}: unused license\n" +#~ msgstr "{lic_path}: невикористана ліцензія\n" + +#, python-brace-format +#~ msgid "'{path}' covered by {global_path}" +#~ msgstr "'{path}' покрито за рахунок {global_path}" + +#, python-brace-format +#~ msgid "" +#~ "'{path}' is covered exclusively by REUSE.toml. Not reading the file " +#~ "contents." #~ msgstr "" -#~ "дописати файл .license до файлів з нерозпізнаними стилями коментарів" +#~ "'{path}' покрито виключно файлом REUSE.toml. Зміст файлу не читається." -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "пропускати файли з нерозпізнаними стилями коментарів" +#, python-brace-format +#~ msgid "" +#~ "'{path}' was detected as a binary file; not searching its contents for " +#~ "REUSE information." +#~ msgstr "" +#~ "'{path}' виявлено як двійковий файл або його розширення позначено таким, " +#~ "що не коментується; пошук інформації у його вмісті для REUSE не " +#~ "виконується." -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "пропускати файли, які вже містять інформацію REUSE" +#~ msgid "" +#~ "'.reuse/dep5' is deprecated. You are recommended to instead use REUSE." +#~ "toml. Use `reuse convert-dep5` to convert." +#~ msgstr "" +#~ "'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " +#~ "REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." #, python-brace-format -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +#~ msgid "" +#~ "Found both '{new_path}' and '{old_path}'. You cannot keep both files " +#~ "simultaneously; they are not intercompatible." #~ msgstr "" -#~ "'{path}' — це двійковий файл, тому для заголовка використовується " -#~ "'{new_path}'" +#~ "Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати " +#~ "обидва файли одночасно, вони несумісні." -#~ msgid "prevents output" -#~ msgstr "запобігає виводу" +#, python-brace-format +#~ msgid "determining identifier of '{path}'" +#~ msgstr "визначення ідентифікатора '{path}'" -#~ msgid "formats output as errors per line (default)" -#~ msgstr "форматує вивід у вигляді помилок на рядок (усталено)" +#, python-brace-format +#~ msgid "{path} does not have a file extension" +#~ msgstr "{path} не має розширення файлу" -#~ msgid "files to lint" -#~ msgstr "файли для перевірки" +#, python-brace-format +#~ msgid "" +#~ "Could not resolve SPDX License Identifier of {path}, resolving to " +#~ "{identifier}. Make sure the license is in the license list found at " +#~ " or that it starts with 'LicenseRef-', and " +#~ "that it has a file extension." +#~ msgstr "" +#~ "Не вдалося розпізнати ідентифікатор ліцензії SPDX {path}. Його розв'язано " +#~ "як {identifier}. Переконайтеся, що ліцензія є у списку ліцензій на " +#~ " або що вона починається з 'LicenseRef-' і " +#~ "має розширення файлу." #, python-brace-format -#~ msgid "'{file}' is not inside of '{root}'" -#~ msgstr "'{file}' не розміщено в '{root}'" +#~ msgid "" +#~ "{identifier} is the SPDX License Identifier of both {path} and " +#~ "{other_path}" +#~ msgstr "" +#~ "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" #~ msgid "" -#~ "reuse is a tool for compliance with the REUSE recommendations. See " -#~ " for more information, and for the online documentation." +#~ "project '{}' is not a VCS repository or required VCS software is not " +#~ "installed" #~ msgstr "" -#~ "reuse — це засіб для дотримання порад REUSE. Перегляньте для отримання додаткових відомостей і перегляду онлайн-документації." +#~ "проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS " +#~ "не встановлено" + +#, python-brace-format +#~ msgid "Could not read '{path}'" +#~ msgstr "Не вдалося прочитати '{path}'" + +#, python-brace-format +#~ msgid "Unexpected error occurred while parsing '{path}'" +#~ msgstr "Під час аналізу '{path}' сталася неочікувана помилка" #~ msgid "" -#~ "This version of reuse is compatible with version {} of the REUSE " -#~ "Specification." -#~ msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." +#~ "Fix bad licenses: At least one license in the LICENSES directory and/or " +#~ "provided by 'SPDX-License-Identifier' tags is invalid. They are either " +#~ "not valid SPDX License Identifiers or do not start with 'LicenseRef-'. " +#~ "FAQ about custom licenses: https://reuse.software/faq/#custom-license" +#~ msgstr "" +#~ "Виправте недійсні ліцензії: Принаймні одна ліцензія в директорії LICENSES " +#~ "та/або вказана у тегах 'SPDX-License-Identifier' недійсна. Вони або не " +#~ "мають дійсних ідентифікаторів ліцензій SPDX, або не починаються з " +#~ "'LicenseRef-'. Часті запитання про користувацькі ліцензії: https://reuse." +#~ "software/faq/#custom-license" -#~ msgid "Support the FSFE's work:" -#~ msgstr "Підтримати роботу FSFE:" +#~ msgid "" +#~ "Fix deprecated licenses: At least one of the licenses in the LICENSES " +#~ "directory and/or provided by an 'SPDX-License-Identifier' tag or in '." +#~ "reuse/dep5' has been deprecated by SPDX. The current list and their " +#~ "respective recommended new identifiers can be found here: " +#~ msgstr "" +#~ "Виправте застарілі ліцензії: Принаймні одна з ліцензій у каталозі " +#~ "LICENSES та/або зазначена у тезі 'SPDX-License-Identifier' або у файлі '." +#~ "reuse/dep5' застаріла для SPDX. Поточний список і відповідні " +#~ "рекомендовані нові ідентифікатори можна знайти тут: " #~ msgid "" -#~ "Donations are critical to our strength and autonomy. They enable us to " -#~ "continue working for Free Software wherever necessary. Please consider " -#~ "making a donation at ." +#~ "Fix licenses without file extension: At least one license text file in " +#~ "the 'LICENSES' directory does not have a '.txt' file extension. Please " +#~ "rename the file(s) accordingly." #~ msgstr "" -#~ "Внески мають вирішальне значення для нашої стійкості й незалежності. Вони " -#~ "дають нам змогу продовжувати працювати над вільним програмним " -#~ "забезпеченням, де це необхідно. Будь ласка, розгляньте можливість " -#~ "підтримати нас на ." +#~ "Виправте ліцензії без розширення файлів: Принаймні один текстовий файл " +#~ "ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " +#~ "файл(и) відповідно." -#~ msgid "enable debug statements" -#~ msgstr "увімкнути інструкції налагодження" +#~ msgid "" +#~ "Fix missing licenses: For at least one of the license identifiers " +#~ "provided by the 'SPDX-License-Identifier' tags, there is no corresponding " +#~ "license text file in the 'LICENSES' directory. For SPDX license " +#~ "identifiers, you can simply run 'reuse download --all' to get any missing " +#~ "ones. For custom licenses (starting with 'LicenseRef-'), you need to add " +#~ "these files yourself." +#~ msgstr "" +#~ "Виправте відсутні ліцензії: Принаймні для одного з ідентифікаторів " +#~ "ліцензій, зазначених у тегах 'SPDX-License-Identifier', у директорії " +#~ "'LICENSES' відсутній відповідний текстовий файл ліцензії. Для " +#~ "ідентифікаторів ліцензій SPDX ви можете просто виконати команду 'reuse " +#~ "download --all', щоб отримати будь-які відсутні ідентифікатори. Для " +#~ "користувацьких ліцензій (починаючи з 'LicenseRef-') вам потрібно додати " +#~ "ці файли самостійно." -#~ msgid "hide deprecation warnings" -#~ msgstr "сховати попередження про застарілість" +#~ msgid "" +#~ "Fix unused licenses: At least one of the license text files in 'LICENSES' " +#~ "is not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. " +#~ "Please make sure that you either tag the accordingly licensed files " +#~ "properly, or delete the unused license text if you are sure that no file " +#~ "or code snippet is licensed as such." +#~ msgstr "" +#~ "Виправте невикористані ліцензії: Принаймні на один з файлів з текстом " +#~ "ліцензії у 'LICENSES' немає жодного посилання, наприклад, за допомогою " +#~ "тегу 'SPDX-License-Identifier'. Переконайтеся, що ви або правильно " +#~ "позначили відповідні ліцензовані файли, або видаліть невикористаний текст " +#~ "ліцензії, якщо ви впевнені, що жоден файл або фрагмент коду не " +#~ "ліцензований як такий." -#~ msgid "do not skip over Git submodules" -#~ msgstr "не пропускати підмодулі Git" +#~ msgid "" +#~ "Fix read errors: At least one of the files in your directory cannot be " +#~ "read by the tool. Please check the file permissions. You will find the " +#~ "affected files at the top of the output as part of the logged error " +#~ "messages." +#~ msgstr "" +#~ "Виправте помилки читання: Принаймні один з файлів у вашій директорії не " +#~ "може бути прочитаний інструментом. Перевірте права доступу до файлів. Ви " +#~ "знайдете відповідні файли у верхній частині виводу як частину " +#~ "зареєстрованих повідомлень про помилки." -#~ msgid "do not skip over Meson subprojects" -#~ msgstr "не пропускати підпроєкти Meson" +#~ msgid "" +#~ "Fix missing copyright/licensing information: For one or more files, the " +#~ "tool cannot find copyright and/or licensing information. You typically do " +#~ "this by adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' " +#~ "tags to each file. The tutorial explains additional ways to do this: " +#~ "" +#~ msgstr "" +#~ "Виправте відсутню інформацію про авторські права/ліцензування: Для одного " +#~ "або кількох файлів інструмент не може знайти інформацію про авторські " +#~ "права та/або ліцензування. Зазвичай це можна зробити, додавши до кожного " +#~ "файлу теги 'SPDX-FileCopyrightText' і 'SPDX-License-Identifier'. У " +#~ "довіднику описано інші способи зробити це: " -#~ msgid "do not use multiprocessing" -#~ msgstr "не використовувати багатопроцесорність" +#~ msgid "--skip-unrecognised has no effect when used together with --style" +#~ msgstr "--skip-unrecognised не працює разом із --style" -#~ msgid "define root of project" -#~ msgstr "визначити кореневий каталог проєкту" +#~ msgid "can't write to '{}'" +#~ msgstr "неможливо записати в '{}'" #~ msgid "show program's version number and exit" #~ msgstr "показати номер версії програми та вийти" -#~ msgid "add copyright and licensing into the header of files" -#~ msgstr "додати авторські права та ліцензії в заголовок файлів" - #~ msgid "" #~ "Add copyright and licensing into the header of one or more files.\n" #~ "\n" @@ -919,9 +1216,6 @@ msgstr[2] "" #~ msgid "download a license and place it in the LICENSES/ directory" #~ msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" -#~ msgid "Download a license and place it in the LICENSES/ directory." -#~ msgstr "Завантажте ліцензію та помістіть її в директорію LICENSES/." - #~ msgid "list all non-compliant files" #~ msgstr "список усіх несумісних файлів" @@ -970,27 +1264,12 @@ msgstr[2] "" #~ msgid "list non-compliant files from specified list of files" #~ msgstr "список невідповідних файлів із вказаного списку файлів" -#, fuzzy -#~ msgid "Generate an SPDX bill of materials in RDF format." -#~ msgstr "друкувати опис матеріалів проєкту у форматі SPDX" - #~ msgid "print the project's bill of materials in SPDX format" #~ msgstr "друкувати опис матеріалів проєкту у форматі SPDX" -#~ msgid "list all supported SPDX licenses" -#~ msgstr "список всіх підтримуваних ліцензій SPDX" - #~ msgid "convert .reuse/dep5 to REUSE.toml" #~ msgstr "конвертувати .reuse/dep5 у REUSE.toml" -#, python-brace-format -#~ msgid "" -#~ "'{path}' could not be parsed. We received the following error message: " -#~ "{message}" -#~ msgstr "" -#~ "'{path}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " -#~ "{message}" - #~ msgid "'{}' is not a file" #~ msgstr "'{}' не є файлом" @@ -1003,97 +1282,15 @@ msgstr[2] "" #~ msgid "can't read or write '{}'" #~ msgstr "неможливо прочитати чи записати '{}'" -#~ msgid "'{}' is not a valid SPDX expression, aborting" -#~ msgstr "'{}' не є дійсним виразом SPDX, переривання" - -#~ msgid "'{}' is not a valid SPDX License Identifier." -#~ msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." - -#~ msgid "" -#~ "See for a list of valid SPDX License " -#~ "Identifiers." -#~ msgstr "" -#~ "Перегляньте список дійсних ідентифікаторів " -#~ "ліцензії SPDX." - -#~ msgid "no '.reuse/dep5' file" -#~ msgstr "немає файлу '.reuse/dep5" - #~ msgid "SPDX License Identifier of license" #~ msgstr "Ідентифікатор ліцензії SPDX" -#~ msgid "download all missing licenses detected in the project" -#~ msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" - -#~ msgid "" -#~ "source from which to copy custom LicenseRef- licenses, either a directory " -#~ "that contains the file or the file itself" -#~ msgstr "" -#~ "джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " -#~ "каталог, який містить файл, або сам файл" - -#, python-brace-format -#~ msgid "Error: {spdx_identifier} already exists." -#~ msgstr "Помилка: {spdx_identifier} вже існує." - -#~ msgid "Error: Failed to download license." -#~ msgstr "Помилка: не вдалося завантажити ліцензію." - -#~ msgid "Is your internet connection working?" -#~ msgstr "Чи працює ваше інтернет-з'єднання?" - -#, python-brace-format -#~ msgid "Successfully downloaded {spdx_identifier}." -#~ msgstr "Успішно завантажено {spdx_identifier}." - #~ msgid "--output has no effect when used together with --all" #~ msgstr "--output не працює разом з --all" #~ msgid "the following arguments are required: license" #~ msgstr "необхідні такі аргументи: license" -#~ msgid "cannot use --output with more than one license" -#~ msgstr "не можна використовувати --output з кількома ліцензіями" - -#~ msgid "formats output as JSON" -#~ msgstr "форматує вивід як JSON" - -#~ msgid "formats output as plain text (default)" -#~ msgstr "форматує вивід як звичайний текст (усталено)" - -#~ msgid "formats output as errors per line" -#~ msgstr "форматує вивід у вигляді помилок на рядок" - -#~ msgid "" -#~ "populate the LicenseConcluded field; note that reuse cannot guarantee the " -#~ "field is accurate" -#~ msgstr "" -#~ "заповніть поле LicenseConcluded; зауважте, що повторне використання не " -#~ "може гарантувати точність поля" - -#~ msgid "name of the person signing off on the SPDX report" -#~ msgstr "ім'я особи, яка підписує звіт SPDX" - -#~ msgid "name of the organization signing off on the SPDX report" -#~ msgstr "назва організації, яка підписує звіт SPDX" - -#~ msgid "" -#~ "error: --creator-person=NAME or --creator-organization=NAME required when " -#~ "--add-license-concluded is provided" -#~ msgstr "" -#~ "помилка: --creator-person=NAME або --creator-organization=NAME " -#~ "вимагається, якщо надається --add-license-concluded" - -#, python-brace-format -#~ msgid "" -#~ "'{path}' does not match a common SPDX file pattern. Find the suggested " -#~ "naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" -#~ "standard-data-format-requirements" -#~ msgstr "" -#~ "'{path}' не відповідає загальному шаблону файлу SPDX. Знайдіть " -#~ "запропоновані правила іменування тут: https://spdx.github.io/spdx-spec/" -#~ "conformance/#44-standard-data-format-requirements" - #~ msgid "usage: " #~ msgstr "використання: " @@ -1252,9 +1449,6 @@ msgstr[2] "" #~ msgid "What is the name of the project?" #~ msgstr "Як називається проєкт?" -#~ msgid "What is the internet address of the project?" -#~ msgstr "Яка інтернет-адреса проєкту?" - #~ msgid "What is the name of the maintainer?" #~ msgstr "Як звуть супроводжувача?" @@ -1385,9 +1579,6 @@ msgstr[2] "" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "параметр --exclude-year і --year взаємосуперечливі" -#~ msgid "option --single-line and --multi-line are mutually exclusive" -#~ msgstr "параметр --single-line і --multi-line взаємосуперечливі" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license замінено на --force-dot-license" From 971c91babd53be1f7eb377fea4213627c6388ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Sat, 12 Oct 2024 01:14:05 +0000 Subject: [PATCH 094/156] Translated using Weblate (Czech) Currently translated at 22.5% (34 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 62 ++++++++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/po/cs.po b/po/cs.po index 1d8e1205f..033f52199 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-10 16:33+0000\n" -"PO-Revision-Date: 2024-09-14 10:09+0000\n" +"PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -21,112 +21,108 @@ msgstr "" "X-Generator: Weblate 5.8-dev\n" #: src/reuse/cli/annotate.py:62 -#, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." -msgstr "je vyžadována možnost --contributor, --copyright nebo --license" +msgstr "Je vyžadována možnost „--copyright“, „--licence“ nebo „--contributor“." #: src/reuse/cli/annotate.py:123 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" "unrecognised':" msgstr "" -"Následující soubory nemají rozpoznanou příponu. Použijte --style, --force-" -"dot-license, --fallback-dot-license nebo --skip-unrecognised:" +"Následující soubory nemají rozpoznanou příponu souboru. Použijte prosím " +"„--style“, „--force-dot-license“, „--fallback-dot-license“ nebo „--skip-" +"unrecognised“:" #: src/reuse/cli/annotate.py:156 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" "'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" -"line" +"line." #: src/reuse/cli/annotate.py:163 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." -msgstr "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" +msgstr "" +"'{path}' nepodporuje víceřádkové komentáře, nepoužívejte prosím --multi-line." #: src/reuse/cli/annotate.py:209 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Template '{template}' could not be found." -msgstr "šablonu {template} se nepodařilo najít" +msgstr "Šablonu {template} se nepodařilo najít." #: src/reuse/cli/annotate.py:272 -#, fuzzy msgid "Add copyright and licensing into the headers of files." -msgstr "přidání autorských práv a licencí do záhlaví souborů" +msgstr "Přidání autorských práv a licencí do záhlaví souborů." #: src/reuse/cli/annotate.py:275 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" +"Pomocí --copyright a --license můžete určit, které držitele autorských práv " +"a licence přidat do záhlaví daných souborů." #: src/reuse/cli/annotate.py:281 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"Pomocí --contributor můžete určit osoby nebo subjekty, které přispěly, ale " +"nejsou držiteli autorských práv k daným souborům." #: src/reuse/cli/annotate.py:293 msgid "COPYRIGHT" -msgstr "" +msgstr "COPYRIGHT" #: src/reuse/cli/annotate.py:296 -#, fuzzy msgid "Copyright statement, repeatable." -msgstr "prohlášení o autorských právech, opakovatelné" +msgstr "Prohlášení o autorských právech, opakovatelné." #: src/reuse/cli/annotate.py:302 msgid "SPDX_IDENTIFIER" -msgstr "" +msgstr "SPDX_IDENTIFIER" #: src/reuse/cli/annotate.py:305 -#, fuzzy msgid "SPDX License Identifier, repeatable." -msgstr "Identifikátor SPDX, opakovatelný" +msgstr "Identifikátor licence SPDX, opakovatelný." #: src/reuse/cli/annotate.py:310 msgid "CONTRIBUTOR" -msgstr "" +msgstr "PŘISPĚVATEL" #: src/reuse/cli/annotate.py:313 -#, fuzzy msgid "File contributor, repeatable." -msgstr "přispěvatel souboru, opakovatelný" +msgstr "Přispěvatel souboru, opakovatelný." #: src/reuse/cli/annotate.py:319 msgid "YEAR" -msgstr "" +msgstr "ROK" #: src/reuse/cli/annotate.py:325 -#, fuzzy msgid "Year of copyright statement." -msgstr "rok vydání prohlášení o autorských právech, nepovinné" +msgstr "Rok prohlášení o autorských právech." #: src/reuse/cli/annotate.py:333 -#, fuzzy msgid "Comment style to use." -msgstr "styl komentáře, který se má použít, nepovinné" +msgstr "Styl komentáře k použití." #: src/reuse/cli/annotate.py:338 -#, fuzzy msgid "Copyright prefix to use." -msgstr "předpona autorských práv, která se má použít, nepovinné" +msgstr "Předpona autorských práv k užití." #: src/reuse/cli/annotate.py:349 msgid "TEMPLATE" -msgstr "" +msgstr "ŠABLONA" #: src/reuse/cli/annotate.py:351 -#, fuzzy msgid "Name of template to use." -msgstr "název šablony, která se má použít, nepovinné" +msgstr "Název šablony, která se má použít." #: src/reuse/cli/annotate.py:358 #, fuzzy From 466afc6ea3283610fa878d16f92528137a934df5 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sat, 12 Oct 2024 02:39:51 +0000 Subject: [PATCH 095/156] Translated using Weblate (Ukrainian) Currently translated at 65.5% (99 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/uk/ --- po/uk.po | 265 ++++++++++++++++++++++--------------------------------- 1 file changed, 107 insertions(+), 158 deletions(-) diff --git a/po/uk.po b/po/uk.po index faa636da2..622851d2f 100644 --- a/po/uk.po +++ b/po/uk.po @@ -9,10 +9,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-10 16:33+0000\n" -"PO-Revision-Date: 2024-09-11 19:09+0000\n" +"PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: Ihor Hordiichuk \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,45 +22,45 @@ msgstr "" "X-Generator: Weblate 5.8-dev\n" #: src/reuse/cli/annotate.py:62 -#, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." -msgstr "потрібен параметр --contributor, --copyright або --license" +msgstr "Потрібен параметр '--copyright', '--license' або '--contributor'." #: src/reuse/cli/annotate.py:123 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" "unrecognised':" msgstr "" -"Ці файли не мають розпізнаного файлового розширення. Використовуйте --style, " -"--force-dot-license, --fallback-dot-license або --skip-unrecognised:" +"Ці файли не мають розпізнаного файлового розширення. Використовуйте '--" +"style', '--force-dot-license', '--fallback-dot-license' або '--skip-" +"unrecognised':" #: src/reuse/cli/annotate.py:156 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" -"'{path}' не підтримує однорядкові коментарі, не використовуйте --single-line" +"'{path}' не підтримує однорядкові коментарі, не використовуйте '--single-" +"line'." #: src/reuse/cli/annotate.py:163 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." msgstr "" -"'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-line" +"'{path}' не підтримує багаторядкові коментарі, не використовуйте '--multi-" +"line'." #: src/reuse/cli/annotate.py:209 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Template '{template}' could not be found." -msgstr "не вдалося знайти шаблон {template}" +msgstr "Не вдалося знайти шаблон '{template}'." #: src/reuse/cli/annotate.py:272 -#, fuzzy msgid "Add copyright and licensing into the headers of files." -msgstr "додати авторські права та ліцензії в заголовок файлів" +msgstr "Додайте авторські права та ліцензії в заголовок файлів." #: src/reuse/cli/annotate.py:275 msgid "" @@ -76,113 +76,96 @@ msgstr "" #: src/reuse/cli/annotate.py:293 msgid "COPYRIGHT" -msgstr "" +msgstr "COPYRIGHT" #: src/reuse/cli/annotate.py:296 -#, fuzzy msgid "Copyright statement, repeatable." -msgstr "оголошення авторського права, повторюване" +msgstr "Оголошення авторського права, повторюване." #: src/reuse/cli/annotate.py:302 msgid "SPDX_IDENTIFIER" -msgstr "" +msgstr "SPDX_IDENTIFIER" #: src/reuse/cli/annotate.py:305 -#, fuzzy msgid "SPDX License Identifier, repeatable." -msgstr "Ідентифікатор SPDX, повторюваний" +msgstr "Ідентифікатор ліцензії SPDX, повторюваний." #: src/reuse/cli/annotate.py:310 msgid "CONTRIBUTOR" -msgstr "" +msgstr "CONTRIBUTOR" #: src/reuse/cli/annotate.py:313 -#, fuzzy msgid "File contributor, repeatable." -msgstr "співавтор файлу, повторюваний" +msgstr "Співавтор файлу, повторюваний." #: src/reuse/cli/annotate.py:319 msgid "YEAR" -msgstr "" +msgstr "YEAR" #: src/reuse/cli/annotate.py:325 -#, fuzzy msgid "Year of copyright statement." -msgstr "рік оголошення авторського права, необов'язково" +msgstr "Рік оголошення авторського права." #: src/reuse/cli/annotate.py:333 -#, fuzzy msgid "Comment style to use." -msgstr "використовуваний стиль коментарів, необов'язковий" +msgstr "Використовуваний стиль коментарів." #: src/reuse/cli/annotate.py:338 -#, fuzzy msgid "Copyright prefix to use." -msgstr "префікс авторського права для користування, опціонально" +msgstr "Використовуваний префікс авторського права." #: src/reuse/cli/annotate.py:349 msgid "TEMPLATE" -msgstr "" +msgstr "TEMPLATE" #: src/reuse/cli/annotate.py:351 -#, fuzzy msgid "Name of template to use." -msgstr "використовувана назва шаблону, необов'язково" +msgstr "Використовувана назва шаблону." #: src/reuse/cli/annotate.py:358 -#, fuzzy msgid "Do not include year in copyright statement." -msgstr "не включати рік в оголошення" +msgstr "Не включати рік в оголошення авторського права." #: src/reuse/cli/annotate.py:363 -#, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" -"об’єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні" +"Об'єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні." #: src/reuse/cli/annotate.py:370 -#, fuzzy msgid "Force single-line comment style." -msgstr "примусовий однорядковий стиль коментаря, необов'язково" +msgstr "Примусовий однорядковий стиль коментаря." #: src/reuse/cli/annotate.py:377 -#, fuzzy msgid "Force multi-line comment style." -msgstr "примусовий багаторядковий стиль коментарів, необов'язково" +msgstr "Примусовий багаторядковий стиль коментарів." #: src/reuse/cli/annotate.py:383 -#, fuzzy msgid "Add headers to all files under specified directories recursively." -msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" +msgstr "Рекурсивно додавати заголовки до всіх файлів у вказаних каталогах." #: src/reuse/cli/annotate.py:388 -#, fuzzy msgid "Do not replace the first header in the file; just add a new one." -msgstr "не замінювати перший заголовок у файлі; просто додавати новий" +msgstr "Не замінювати перший заголовок у файлі; просто додавати новий." #: src/reuse/cli/annotate.py:395 -#, fuzzy msgid "Always write a .license file instead of a header inside the file." -msgstr "завжди записуйте файл .license замість заголовка всередині файлу" +msgstr "Завжди записуйте файл .license замість заголовка всередині файлу." #: src/reuse/cli/annotate.py:402 -#, fuzzy msgid "Write a .license file to files with unrecognised comment styles." -msgstr "дописати файл .license до файлів з нерозпізнаними стилями коментарів" +msgstr "Записати файл .license до файлів з нерозпізнаними стилями коментарів." #: src/reuse/cli/annotate.py:409 -#, fuzzy msgid "Skip files with unrecognised comment styles." -msgstr "пропускати файли з нерозпізнаними стилями коментарів" +msgstr "Пропускати файли з нерозпізнаними стилями коментарів." #: src/reuse/cli/annotate.py:420 -#, fuzzy msgid "Skip files that already contain REUSE information." -msgstr "пропускати файли, які вже містять інформацію REUSE" +msgstr "Пропускати файли, які вже містять інформацію REUSE." #: src/reuse/cli/annotate.py:424 msgid "PATH" -msgstr "" +msgstr "ШЛЯХ" #: src/reuse/cli/annotate.py:474 #, python-brace-format @@ -206,9 +189,8 @@ msgid "'{name}' is mutually exclusive with: {opts}" msgstr "" #: src/reuse/cli/common.py:114 -#, fuzzy msgid "'{}' is not a valid SPDX expression." -msgstr "'{}' не є дійсним виразом SPDX, переривання" +msgstr "'{}' не є дійсним виразом SPDX." #: src/reuse/cli/convert_dep5.py:19 msgid "" @@ -218,16 +200,14 @@ msgid "" msgstr "" #: src/reuse/cli/convert_dep5.py:31 -#, fuzzy msgid "No '.reuse/dep5' file." -msgstr "немає файлу '.reuse/dep5" +msgstr "Немає файлу '.reuse/dep5." #: src/reuse/cli/download.py:52 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." #: src/reuse/cli/download.py:59 -#, fuzzy msgid "Did you mean:" msgstr "Ви мали на увазі:" @@ -245,7 +225,7 @@ msgid "Error: {spdx_identifier} already exists." msgstr "Помилка: {spdx_identifier} вже існує." #: src/reuse/cli/download.py:82 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Error: {path} does not exist." msgstr "Помилка: {path} не існує." @@ -273,37 +253,32 @@ msgid "" msgstr "" #: src/reuse/cli/download.py:122 -#, fuzzy msgid "Download all missing licenses detected in the project." -msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" +msgstr "Завантажити всі відсутні ліцензії, виявлені в проєкті." #: src/reuse/cli/download.py:130 msgid "Path to download to." msgstr "" #: src/reuse/cli/download.py:136 -#, fuzzy msgid "" "Source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself." msgstr "" -"джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " -"каталог, який містить файл, або сам файл" +"Джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " +"каталог, який містить файл, або сам файл." #: src/reuse/cli/download.py:142 -#, fuzzy msgid "LICENSE" -msgstr "ПОГАНІ ЛІЦЕНЗІЇ" +msgstr "LICENSE" #: src/reuse/cli/download.py:158 -#, fuzzy msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." -msgstr "параметр --single-line і --multi-line взаємосуперечливі" +msgstr "Аргумент 'LICENSE' і параметр '--all' взаємосуперечливі." #: src/reuse/cli/download.py:172 -#, fuzzy msgid "Cannot use '--output' with more than one license." -msgstr "не можна використовувати --output з кількома ліцензіями" +msgstr "Не можна використовувати '--output' з кількома ліцензіями." #: src/reuse/cli/lint.py:27 #, python-brace-format @@ -352,29 +327,24 @@ msgid "- Are there any read errors?" msgstr "" #: src/reuse/cli/lint.py:59 -#, fuzzy msgid "- Do all files have valid copyright and licensing information?" -msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" +msgstr "- Чи всі файли містять відомості про авторські права та ліцензії?" #: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 -#, fuzzy msgid "Prevent output." -msgstr "запобігає виводу" +msgstr "Запобігає виводу." #: src/reuse/cli/lint.py:78 -#, fuzzy msgid "Format output as JSON." -msgstr "форматує вивід як JSON" +msgstr "Форматує вивід як JSON." #: src/reuse/cli/lint.py:86 -#, fuzzy msgid "Format output as plain text. (default)" -msgstr "форматує вивід як звичайний текст (усталено)" +msgstr "Форматує вивід як звичайний текст. (усталено)" #: src/reuse/cli/lint.py:94 -#, fuzzy msgid "Format output as errors per line." -msgstr "форматує вивід у вигляді помилок на рядок" +msgstr "Форматує вивід у вигляді помилок на рядок." #: src/reuse/cli/lint_file.py:25 msgid "" @@ -384,24 +354,23 @@ msgid "" msgstr "" #: src/reuse/cli/lint_file.py:46 -#, fuzzy msgid "Format output as errors per line. (default)" -msgstr "форматує вивід у вигляді помилок на рядок (усталено)" +msgstr "Форматує вивід у вигляді помилок на рядок. (усталено)" #: src/reuse/cli/lint_file.py:50 msgid "FILE" -msgstr "" +msgstr "ФАЙЛ" #: src/reuse/cli/lint_file.py:64 -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{file}' is not inside of '{root}'." -msgstr "'{file}' не розміщено в '{root}'" +msgstr "'{file}' не розміщено в '{root}'." #: src/reuse/cli/main.py:37 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format +#, python-format msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: помилка: %(message)s\n" +msgstr "%(prog)s, версія %(version)s" #: src/reuse/cli/main.py:40 msgid "" @@ -457,39 +426,32 @@ msgstr "" "." #: src/reuse/cli/main.py:89 -#, fuzzy msgid "Enable debug statements." -msgstr "увімкнути інструкції налагодження" +msgstr "Увімкнути інструкції налагодження." #: src/reuse/cli/main.py:94 -#, fuzzy msgid "Hide deprecation warnings." -msgstr "сховати попередження про застарілість" +msgstr "Сховати попередження про застарілість." #: src/reuse/cli/main.py:99 -#, fuzzy msgid "Do not skip over Git submodules." -msgstr "не пропускати підмодулі Git" +msgstr "Не пропускати підмодулі Git." #: src/reuse/cli/main.py:104 -#, fuzzy msgid "Do not skip over Meson subprojects." -msgstr "не пропускати підпроєкти Meson" +msgstr "Не пропускати підпроєкти Meson." #: src/reuse/cli/main.py:109 -#, fuzzy msgid "Do not use multiprocessing." -msgstr "не використовувати багатопроцесорність" +msgstr "Не використовувати багатопроцесорність." #: src/reuse/cli/main.py:119 -#, fuzzy msgid "Define root of project." -msgstr "визначити кореневий каталог проєкту" +msgstr "Визначити кореневий каталог проєкту." #: src/reuse/cli/spdx.py:23 -#, fuzzy msgid "Generate an SPDX bill of materials." -msgstr "друкувати опис матеріалів проєкту у форматі SPDX" +msgstr "Згенерувати опис матеріалів проєкту у форматі SPDX." #: src/reuse/cli/spdx.py:33 #, fuzzy @@ -497,32 +459,28 @@ msgid "File to write to." msgstr "файли для перевірки" #: src/reuse/cli/spdx.py:39 -#, fuzzy msgid "" "Populate the LicenseConcluded field; note that reuse cannot guarantee that " "the field is accurate." msgstr "" -"заповніть поле LicenseConcluded; зауважте, що повторне використання не може " -"гарантувати точність поля" +"Заповніть поле LicenseConcluded; зауважте, що повторне використання не може " +"гарантувати точність поля." #: src/reuse/cli/spdx.py:51 -#, fuzzy msgid "Name of the person signing off on the SPDX report." -msgstr "ім'я особи, яка підписує звіт SPDX" +msgstr "Ім'я особи, яка підписує звіт SPDX." #: src/reuse/cli/spdx.py:55 -#, fuzzy msgid "Name of the organization signing off on the SPDX report." -msgstr "назва організації, яка підписує звіт SPDX" +msgstr "Назва організації, яка підписує звіт SPDX." #: src/reuse/cli/spdx.py:82 -#, fuzzy msgid "" "'--creator-person' or '--creator-organization' is required when '--add-" "license-concluded' is provided." msgstr "" -"помилка: --creator-person=NAME або --creator-organization=NAME вимагається, " -"якщо надається --add-license-concluded" +"'--creator-person' або '--creator-organization' вимагається, якщо надається " +"'--add-license-concluded'." #: src/reuse/cli/spdx.py:97 #, python-brace-format @@ -536,9 +494,8 @@ msgstr "" "standard-data-format-requirements" #: src/reuse/cli/supported_licenses.py:15 -#, fuzzy msgid "List all licenses on the SPDX License List." -msgstr "список всіх підтримуваних ліцензій SPDX" +msgstr "Список всіх підтримуваних ліцензій SPDX." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -556,42 +513,38 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 -#, fuzzy msgid "Show this message and exit." -msgstr "показати це повідомлення та вийти" +msgstr "Показати це повідомлення та вийти." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 -#, fuzzy, python-brace-format +#, python-brace-format msgid "(Deprecated) {text}" -msgstr "Застарілі ліцензії:" +msgstr "(Застарілі) {text}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 -#, fuzzy msgid "Options" -msgstr "параметри" +msgstr "Параметри" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Got unexpected extra argument ({args})" msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "очікується один аргумент" -msgstr[1] "очікується один аргумент" -msgstr[2] "очікується один аргумент" +msgstr[0] "Отримано неочікуваний додатковий аргумент ({args})" +msgstr[1] "Отримано неочікувані додаткові аргументи ({args})" +msgstr[2] "Отримано неочікувані додаткові аргументи ({args})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 msgid "DeprecationWarning: The command {name!r} is deprecated." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 -#, fuzzy msgid "Commands" -msgstr "підкоманди" +msgstr "Команди" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 -#, fuzzy msgid "Missing command." -msgstr "Відсутні ліцензії:" +msgstr "Пропущена команда." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 msgid "No such command {name!r}." @@ -628,15 +581,14 @@ msgid "required" msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 -#, fuzzy msgid "Show the version and exit." -msgstr "показати це повідомлення та вийти" +msgstr "Показати версію та вийти." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 #, python-brace-format msgid "Error: {message}" -msgstr "" +msgstr "Помилка: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 #, python-brace-format @@ -654,45 +606,43 @@ msgid "Invalid value for {param_hint}: {message}" msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 -#, fuzzy msgid "Missing argument" -msgstr "позиційні аргументи" +msgstr "Відсутній аргумент" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 -#, fuzzy msgid "Missing option" -msgstr "Відсутні ліцензії:" +msgstr "Відсутня опція" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 msgid "Missing parameter" -msgstr "" +msgstr "Відсутній параметр" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 #, python-brace-format msgid "Missing {param_type}" -msgstr "" +msgstr "Відсутній {param_type}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 #, python-brace-format msgid "Missing parameter: {param_name}" -msgstr "" +msgstr "Відсутній параметр: {param_name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 #, python-brace-format msgid "No such option: {name}" -msgstr "" +msgstr "Немає такої опції: {name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Did you mean {possibility}?" msgid_plural "(Possible options: {possibilities})" -msgstr[0] "Ви мали на увазі:" -msgstr[1] "Ви мали на увазі:" -msgstr[2] "Ви мали на увазі:" +msgstr[0] "Ви мали на увазі {possibility}?" +msgstr[1] "(Можливі опції: {possibilities})" +msgstr[2] "(Можливі опції: {possibilities})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" -msgstr "" +msgstr "невідома помилка" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 msgid "Could not open file {filename!r}: {message}" @@ -732,7 +682,7 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 #, python-brace-format msgid "Error: {e.message}" -msgstr "" +msgstr "Помилка: {e.message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 msgid "Error: The two entered values do not match." @@ -786,41 +736,40 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 msgid "file" -msgstr "" +msgstr "файл" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 msgid "directory" -msgstr "" +msgstr "каталог" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 msgid "path" -msgstr "" +msgstr "шлях" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 -#, fuzzy msgid "{name} {filename!r} does not exist." -msgstr "Помилка: {path} не існує." +msgstr "{name} {filename!r} не існує." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 msgid "{name} {filename!r} is a file." -msgstr "" +msgstr "{name} {filename!r} це файл." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} '{filename}' is a directory." -msgstr "'{}' не є каталогом" +msgstr "{name} '{filename}' це каталог." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." -msgstr "" +msgstr "{name} {filename!r} не читабельний." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 msgid "{name} {filename!r} is not writable." -msgstr "" +msgstr "{name} {filename!r} не записуваний." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 msgid "{name} {filename!r} is not executable." -msgstr "" +msgstr "{name} {filename!r} не виконуваний." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 #, python-brace-format From 67323d9b1bc5334f2bdd32563189120ba9395f87 Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Fri, 11 Oct 2024 11:07:22 +0000 Subject: [PATCH 096/156] Translated using Weblate (Russian) Currently translated at 13.2% (20 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/ru/ --- po/ru.po | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/po/ru.po b/po/ru.po index a4280bbe9..ea224d749 100644 --- a/po/ru.po +++ b/po/ru.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-10 16:33+0000\n" -"PO-Revision-Date: 2024-08-25 06:09+0000\n" +"PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" @@ -18,51 +18,49 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7.1-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: src/reuse/cli/annotate.py:62 -#, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." -msgstr "Требуется опция --создатель, - авторское право или --лицензия" +msgstr "Требуется опция '-- авторское право', '--лицензия' или '--контрибутор'." #: src/reuse/cli/annotate.py:123 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" "unrecognised':" msgstr "" -"Следующие файлы не имеют распознанного расширения. Пожалуйста, используйте --" -"style, --force-dot-license, --fallback-dot-license или --skip-unrecognised:" +"Следующие файлы не имеют распознанного расширения. Пожалуйста, используйте '" +"--style', '--force-dot-license', '--fallback-dot-license' или '--skip-" +"unrecognised':" #: src/reuse/cli/annotate.py:156 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" -"'{path}' не поддерживает однострочные комментарии, пожалуйста, не " -"используйте --single-line" +"'{path}' не поддерживает однострочные комментарии, поэтому не используйте " +"'--single-line'." #: src/reuse/cli/annotate.py:163 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." msgstr "" -"'{path}' не поддерживает многострочные комментарии, пожалуйста, не " -"используйте --multi-line" +"'{path}' не поддерживает многострочные комментарии, поэтому не используйте " +"'--multi-line'." #: src/reuse/cli/annotate.py:209 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Template '{template}' could not be found." -msgstr "Шаблон {template} не найден" +msgstr "Шаблон '{template}' не найден." #: src/reuse/cli/annotate.py:272 -#, fuzzy msgid "Add copyright and licensing into the headers of files." msgstr "" -"добавьте в заголовок файлов информацию об авторских правах и лицензировании" +"Добавьте в заголовки файлов информацию об авторских правах и лицензировании." #: src/reuse/cli/annotate.py:275 msgid "" From a8f0ca81a0903ed2f037f20a86d1db7e2a379475 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Sun, 13 Oct 2024 14:37:02 +0200 Subject: [PATCH 097/156] Provide helpful comment to translators Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/annotate.py | 6 ++++++ src/reuse/cli/download.py | 1 + src/reuse/cli/lint_file.py | 1 + 3 files changed, 8 insertions(+) diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index c803e3341..4d3dd3904 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -290,6 +290,7 @@ def get_reuse_info( "--copyright", "-c", "copyrights", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("COPYRIGHT"), type=str, multiple=True, @@ -299,6 +300,7 @@ def get_reuse_info( "--license", "-l", "licenses", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("SPDX_IDENTIFIER"), type=spdx_identifier, multiple=True, @@ -307,6 +309,7 @@ def get_reuse_info( @click.option( "--contributor", "contributors", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("CONTRIBUTOR"), type=str, multiple=True, @@ -316,6 +319,7 @@ def get_reuse_info( "--year", "-y", "years", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("YEAR"), cls=MutexOption, mutually_exclusive=_YEAR_MUTEX, @@ -346,6 +350,7 @@ def get_reuse_info( "--template", "-t", "template_str", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("TEMPLATE"), type=str, help=_("Name of template to use."), @@ -421,6 +426,7 @@ def get_reuse_info( ) @click.argument( "paths", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("PATH"), type=click.Path(exists=True, writable=True, path_type=Path), nargs=-1, diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index b217eb78b..a1e0256bb 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -139,6 +139,7 @@ def _successfully_downloaded(destination: StrPath) -> None: ) @click.argument( "license_", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("LICENSE"), type=str, nargs=-1, diff --git a/src/reuse/cli/lint_file.py b/src/reuse/cli/lint_file.py index b87021550..cbd8f75e2 100644 --- a/src/reuse/cli/lint_file.py +++ b/src/reuse/cli/lint_file.py @@ -47,6 +47,7 @@ ) @click.argument( "files", + # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("FILE"), type=click.Path(exists=True, path_type=Path), nargs=-1, From d34f4e793fbab4a0dbac832d2e08ae9d746d7449 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Sun, 13 Oct 2024 12:38:29 +0000 Subject: [PATCH 098/156] Update reuse.pot --- po/cs.po | 72 ++++++++++++++++++++++++++--------------------- po/de.po | 68 ++++++++++++++++++++++++-------------------- po/eo.po | 68 ++++++++++++++++++++++++-------------------- po/es.po | 68 ++++++++++++++++++++++++-------------------- po/fr.po | 68 ++++++++++++++++++++++++-------------------- po/gl.po | 68 ++++++++++++++++++++++++-------------------- po/it.po | 68 ++++++++++++++++++++++++-------------------- po/nl.po | 68 ++++++++++++++++++++++++-------------------- po/pt.po | 68 ++++++++++++++++++++++++-------------------- po/reuse.pot | 70 +++++++++++++++++++++++++--------------------- po/ru.po | 79 +++++++++++++++++++++++++++++----------------------- po/sv.po | 68 ++++++++++++++++++++++++-------------------- po/tr.po | 68 ++++++++++++++++++++++++-------------------- po/uk.po | 72 ++++++++++++++++++++++++++--------------------- 14 files changed, 543 insertions(+), 430 deletions(-) diff --git a/po/cs.po b/po/cs.po index 033f52199..bbc5336e6 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:33+0000\n" +"POT-Creation-Date: 2024-10-13 12:38+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Italian \n" "Language-Team: Dutch \n" "Language-Team: Portuguese \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:33+0000\n" +"POT-Creation-Date: 2024-10-13 12:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -76,99 +76,105 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/cli/annotate.py:293 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:294 msgid "COPYRIGHT" msgstr "" -#: src/reuse/cli/annotate.py:296 +#: src/reuse/cli/annotate.py:297 msgid "Copyright statement, repeatable." msgstr "" -#: src/reuse/cli/annotate.py:302 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:304 msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/cli/annotate.py:305 +#: src/reuse/cli/annotate.py:307 msgid "SPDX License Identifier, repeatable." msgstr "" -#: src/reuse/cli/annotate.py:310 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:313 msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:316 msgid "File contributor, repeatable." msgstr "" -#: src/reuse/cli/annotate.py:319 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:323 msgid "YEAR" msgstr "" -#: src/reuse/cli/annotate.py:325 +#: src/reuse/cli/annotate.py:329 msgid "Year of copyright statement." msgstr "" -#: src/reuse/cli/annotate.py:333 +#: src/reuse/cli/annotate.py:337 msgid "Comment style to use." msgstr "" -#: src/reuse/cli/annotate.py:338 +#: src/reuse/cli/annotate.py:342 msgid "Copyright prefix to use." msgstr "" -#: src/reuse/cli/annotate.py:349 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:354 msgid "TEMPLATE" msgstr "" -#: src/reuse/cli/annotate.py:351 +#: src/reuse/cli/annotate.py:356 msgid "Name of template to use." msgstr "" -#: src/reuse/cli/annotate.py:358 +#: src/reuse/cli/annotate.py:363 msgid "Do not include year in copyright statement." msgstr "" -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:368 msgid "Merge copyright lines if copyright statements are identical." msgstr "" -#: src/reuse/cli/annotate.py:370 +#: src/reuse/cli/annotate.py:375 msgid "Force single-line comment style." msgstr "" -#: src/reuse/cli/annotate.py:377 +#: src/reuse/cli/annotate.py:382 msgid "Force multi-line comment style." msgstr "" -#: src/reuse/cli/annotate.py:383 +#: src/reuse/cli/annotate.py:388 msgid "Add headers to all files under specified directories recursively." msgstr "" -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:393 msgid "Do not replace the first header in the file; just add a new one." msgstr "" -#: src/reuse/cli/annotate.py:395 +#: src/reuse/cli/annotate.py:400 msgid "Always write a .license file instead of a header inside the file." msgstr "" -#: src/reuse/cli/annotate.py:402 +#: src/reuse/cli/annotate.py:407 msgid "Write a .license file to files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:409 +#: src/reuse/cli/annotate.py:414 msgid "Skip files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:420 +#: src/reuse/cli/annotate.py:425 msgid "Skip files that already contain REUSE information." msgstr "" -#: src/reuse/cli/annotate.py:424 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:430 msgid "PATH" msgstr "" -#: src/reuse/cli/annotate.py:474 +#: src/reuse/cli/annotate.py:480 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" @@ -261,15 +267,16 @@ msgid "" "that contains the file or the file itself." msgstr "" -#: src/reuse/cli/download.py:142 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/download.py:143 msgid "LICENSE" msgstr "" -#: src/reuse/cli/download.py:158 +#: src/reuse/cli/download.py:159 msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." msgstr "" -#: src/reuse/cli/download.py:172 +#: src/reuse/cli/download.py:173 msgid "Cannot use '--output' with more than one license." msgstr "" @@ -349,11 +356,12 @@ msgstr "" msgid "Format output as errors per line. (default)" msgstr "" -#: src/reuse/cli/lint_file.py:50 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/lint_file.py:51 msgid "FILE" msgstr "" -#: src/reuse/cli/lint_file.py:64 +#: src/reuse/cli/lint_file.py:65 #, python-brace-format msgid "'{file}' is not inside of '{root}'." msgstr "" diff --git a/po/ru.po b/po/ru.po index ea224d749..3d89bf7d4 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-10 16:33+0000\n" +"POT-Creation-Date: 2024-10-13 12:38+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -74,100 +74,106 @@ msgid "" "but are not copyright holder of the given files." msgstr "" -#: src/reuse/cli/annotate.py:293 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:294 msgid "COPYRIGHT" msgstr "COPYRIGHT" -#: src/reuse/cli/annotate.py:296 +#: src/reuse/cli/annotate.py:297 msgid "Copyright statement, repeatable." msgstr "Оголошення авторського права, повторюване." -#: src/reuse/cli/annotate.py:302 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:304 msgid "SPDX_IDENTIFIER" msgstr "SPDX_IDENTIFIER" -#: src/reuse/cli/annotate.py:305 +#: src/reuse/cli/annotate.py:307 msgid "SPDX License Identifier, repeatable." msgstr "Ідентифікатор ліцензії SPDX, повторюваний." -#: src/reuse/cli/annotate.py:310 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:313 msgid "CONTRIBUTOR" msgstr "CONTRIBUTOR" -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:316 msgid "File contributor, repeatable." msgstr "Співавтор файлу, повторюваний." -#: src/reuse/cli/annotate.py:319 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:323 msgid "YEAR" msgstr "YEAR" -#: src/reuse/cli/annotate.py:325 +#: src/reuse/cli/annotate.py:329 msgid "Year of copyright statement." msgstr "Рік оголошення авторського права." -#: src/reuse/cli/annotate.py:333 +#: src/reuse/cli/annotate.py:337 msgid "Comment style to use." msgstr "Використовуваний стиль коментарів." -#: src/reuse/cli/annotate.py:338 +#: src/reuse/cli/annotate.py:342 msgid "Copyright prefix to use." msgstr "Використовуваний префікс авторського права." -#: src/reuse/cli/annotate.py:349 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:354 msgid "TEMPLATE" msgstr "TEMPLATE" -#: src/reuse/cli/annotate.py:351 +#: src/reuse/cli/annotate.py:356 msgid "Name of template to use." msgstr "Використовувана назва шаблону." -#: src/reuse/cli/annotate.py:358 +#: src/reuse/cli/annotate.py:363 msgid "Do not include year in copyright statement." msgstr "Не включати рік в оголошення авторського права." -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:368 msgid "Merge copyright lines if copyright statements are identical." msgstr "" "Об'єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні." -#: src/reuse/cli/annotate.py:370 +#: src/reuse/cli/annotate.py:375 msgid "Force single-line comment style." msgstr "Примусовий однорядковий стиль коментаря." -#: src/reuse/cli/annotate.py:377 +#: src/reuse/cli/annotate.py:382 msgid "Force multi-line comment style." msgstr "Примусовий багаторядковий стиль коментарів." -#: src/reuse/cli/annotate.py:383 +#: src/reuse/cli/annotate.py:388 msgid "Add headers to all files under specified directories recursively." msgstr "Рекурсивно додавати заголовки до всіх файлів у вказаних каталогах." -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:393 msgid "Do not replace the first header in the file; just add a new one." msgstr "Не замінювати перший заголовок у файлі; просто додавати новий." -#: src/reuse/cli/annotate.py:395 +#: src/reuse/cli/annotate.py:400 msgid "Always write a .license file instead of a header inside the file." msgstr "Завжди записуйте файл .license замість заголовка всередині файлу." -#: src/reuse/cli/annotate.py:402 +#: src/reuse/cli/annotate.py:407 msgid "Write a .license file to files with unrecognised comment styles." msgstr "Записати файл .license до файлів з нерозпізнаними стилями коментарів." -#: src/reuse/cli/annotate.py:409 +#: src/reuse/cli/annotate.py:414 msgid "Skip files with unrecognised comment styles." msgstr "Пропускати файли з нерозпізнаними стилями коментарів." -#: src/reuse/cli/annotate.py:420 +#: src/reuse/cli/annotate.py:425 msgid "Skip files that already contain REUSE information." msgstr "Пропускати файли, які вже містять інформацію REUSE." -#: src/reuse/cli/annotate.py:424 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/annotate.py:430 msgid "PATH" msgstr "ШЛЯХ" -#: src/reuse/cli/annotate.py:474 +#: src/reuse/cli/annotate.py:480 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" @@ -268,15 +274,16 @@ msgstr "" "Джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " "каталог, який містить файл, або сам файл." -#: src/reuse/cli/download.py:142 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/download.py:143 msgid "LICENSE" msgstr "LICENSE" -#: src/reuse/cli/download.py:158 +#: src/reuse/cli/download.py:159 msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." msgstr "Аргумент 'LICENSE' і параметр '--all' взаємосуперечливі." -#: src/reuse/cli/download.py:172 +#: src/reuse/cli/download.py:173 msgid "Cannot use '--output' with more than one license." msgstr "Не можна використовувати '--output' з кількома ліцензіями." @@ -357,11 +364,12 @@ msgstr "" msgid "Format output as errors per line. (default)" msgstr "Форматує вивід у вигляді помилок на рядок. (усталено)" -#: src/reuse/cli/lint_file.py:50 +#. TRANSLATORS: You may translate this. Please preserve capital letters. +#: src/reuse/cli/lint_file.py:51 msgid "FILE" msgstr "ФАЙЛ" -#: src/reuse/cli/lint_file.py:64 +#: src/reuse/cli/lint_file.py:65 #, python-brace-format msgid "'{file}' is not inside of '{root}'." msgstr "'{file}' не розміщено в '{root}'." From 682744230862fe4c30b3efa82e0599e4346a8656 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 14 Oct 2024 02:02:58 +0000 Subject: [PATCH 099/156] Translated using Weblate (Ukrainian) Currently translated at 70.8% (107 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/uk/ --- po/uk.po | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/po/uk.po b/po/uk.po index 2a41e7388..3ccb6230d 100644 --- a/po/uk.po +++ b/po/uk.po @@ -9,10 +9,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-13 12:38+0000\n" -"PO-Revision-Date: 2024-10-12 11:15+0000\n" +"PO-Revision-Date: 2024-10-14 11:11+0000\n" "Last-Translator: Ihor Hordiichuk \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -67,12 +67,16 @@ msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" +"За допомогою --copyright і --license ви можете вказати, яких власників " +"авторських прав і ліцензій додавати до заголовків цих файлів." #: src/reuse/cli/annotate.py:281 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"За допомогою --contributor ви можете вказати особу або організацію, яка " +"зробила внесок, але не є власником авторських прав на ці файли." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:294 @@ -192,7 +196,7 @@ msgstr "" #: src/reuse/cli/common.py:97 #, python-brace-format msgid "'{name}' is mutually exclusive with: {opts}" -msgstr "" +msgstr "'{name}' взаємозаперечний з: {opts}" #: src/reuse/cli/common.py:114 msgid "'{}' is not a valid SPDX expression." @@ -204,6 +208,9 @@ msgid "" "the project root and is semantically identical. The .reuse/dep5 file is " "subsequently deleted." msgstr "" +"Перетворіть .reuse/dep5 у файл REUSE.toml. Створений файл розміщується в " +"корені проєкту і є семантично ідентичним. Згодом файл .reuse/dep5 буде " +"видалено." #: src/reuse/cli/convert_dep5.py:31 msgid "No '.reuse/dep5' file." @@ -257,6 +264,8 @@ msgid "" "LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " "multiple times to download multiple licenses." msgstr "" +"LICENSE має бути дійсним ідентифікатором ліцензії SPDX. Ви можете вказати " +"LICENSE кілька разів, щоб завантажити кілька ліцензій." #: src/reuse/cli/download.py:122 msgid "Download all missing licenses detected in the project." @@ -264,7 +273,7 @@ msgstr "Завантажити всі відсутні ліцензії, вия #: src/reuse/cli/download.py:130 msgid "Path to download to." -msgstr "" +msgstr "Шлях для завантаження." #: src/reuse/cli/download.py:136 msgid "" @@ -307,9 +316,8 @@ msgid "" msgstr "" #: src/reuse/cli/lint.py:40 -#, fuzzy msgid "- Are there any deprecated licenses in the project?" -msgstr "Яка інтернет-адреса проєкту?" +msgstr "- Чи є в проєкті застарілі ліцензії?" #: src/reuse/cli/lint.py:43 msgid "" @@ -462,9 +470,8 @@ msgid "Generate an SPDX bill of materials." msgstr "Згенерувати опис матеріалів проєкту у форматі SPDX." #: src/reuse/cli/spdx.py:33 -#, fuzzy msgid "File to write to." -msgstr "файли для перевірки" +msgstr "Файл, куди записувати." #: src/reuse/cli/spdx.py:39 msgid "" From e7dc19a5cc4001c93b6bfcbb8a0e01bdf0d8944e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Berk=20=C3=96zk=C3=BCt=C3=BCk?= Date: Mon, 14 Oct 2024 22:19:00 +0200 Subject: [PATCH 100/156] Add `.cabal` and `cabal.project` as recognised file types for comments --- changelog.d/added/comment-cabal.md | 2 ++ src/reuse/comment.py | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 changelog.d/added/comment-cabal.md diff --git a/changelog.d/added/comment-cabal.md b/changelog.d/added/comment-cabal.md new file mode 100644 index 000000000..cafa9a79b --- /dev/null +++ b/changelog.d/added/comment-cabal.md @@ -0,0 +1,2 @@ +- Added `.cabal` and `cabal.project` (Haskell) as recognised file types for + comments. (#1089) diff --git a/src/reuse/comment.py b/src/reuse/comment.py index 9d4872657..5b0ca08f3 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -608,6 +608,7 @@ class XQueryCommentStyle(CommentStyle): ".bib": BibTexCommentStyle, ".bzl": PythonCommentStyle, ".c": CCommentStyle, + ".cabal": HaskellCommentStyle, ".cc": CppCommentStyle, ".cjs": CppCommentStyle, ".cl": LispCommentStyle, @@ -878,6 +879,7 @@ class XQueryCommentStyle(CommentStyle): ".yarnrc": PythonCommentStyle, "ansible.cfg": PythonCommentStyle, "archive.sctxar": UncommentableCommentStyle, # SuperCollider global archive + "cabal.project": HaskellCommentStyle, "Cargo.lock": PythonCommentStyle, "CMakeLists.txt": PythonCommentStyle, "CODEOWNERS": PythonCommentStyle, From e8d504d2d57e32eca8ddc35ecde5dcd7c55fb5e6 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Wed, 16 Oct 2024 11:01:17 +0000 Subject: [PATCH 101/156] Update reuse.pot --- po/cs.po | 2 +- po/de.po | 2 +- po/eo.po | 2 +- po/es.po | 2 +- po/fr.po | 2 +- po/gl.po | 2 +- po/it.po | 2 +- po/nl.po | 2 +- po/pt.po | 2 +- po/reuse.pot | 4 ++-- po/ru.po | 2 +- po/sv.po | 2 +- po/tr.po | 2 +- po/uk.po | 6 +++--- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/po/cs.po b/po/cs.po index bbc5336e6..3b570bc44 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-13 12:38+0000\n" +"POT-Creation-Date: 2024-10-16 11:01+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Italian \n" "Language-Team: Dutch \n" "Language-Team: Portuguese \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-13 12:38+0000\n" +"POT-Creation-Date: 2024-10-16 11:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/po/ru.po b/po/ru.po index 3d89bf7d4..62a0c6e00 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-13 12:38+0000\n" +"POT-Creation-Date: 2024-10-16 11:01+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" From c247bafe47cfa861503733f19470192ab9bb1109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Berk=20=C3=96zk=C3=BCt=C3=BCk?= Date: Wed, 16 Oct 2024 22:22:33 +0200 Subject: [PATCH 102/156] add shebang for .cabal files --- changelog.d/added/comment-cabal.md | 2 +- src/reuse/comment.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.d/added/comment-cabal.md b/changelog.d/added/comment-cabal.md index cafa9a79b..3b52c3caf 100644 --- a/changelog.d/added/comment-cabal.md +++ b/changelog.d/added/comment-cabal.md @@ -1,2 +1,2 @@ - Added `.cabal` and `cabal.project` (Haskell) as recognised file types for - comments. (#1089) + comments. (#1089, #1090) diff --git a/src/reuse/comment.py b/src/reuse/comment.py index 5b0ca08f3..c87869333 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -422,6 +422,7 @@ class HaskellCommentStyle(CommentStyle): SINGLE_LINE = "--" INDENT_AFTER_SINGLE = " " + SHEBANGS = ["cabal-version:"] class HtmlCommentStyle(CommentStyle): From 108d9ab748180a2bdee46044d082c01fdae69896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Thu, 17 Oct 2024 00:22:52 +0000 Subject: [PATCH 103/156] Translated using Weblate (Czech) Currently translated at 66.2% (100 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 211 +++++++++++++++++++++++++------------------------------ 1 file changed, 97 insertions(+), 114 deletions(-) diff --git a/po/cs.po b/po/cs.po index 3b570bc44..763a00183 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-16 11:01+0000\n" -"PO-Revision-Date: 2024-10-12 11:15+0000\n" +"PO-Revision-Date: 2024-10-17 07:16+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8-rc\n" #: src/reuse/cli/annotate.py:62 msgid "Option '--copyright', '--license', or '--contributor' is required." @@ -130,61 +130,51 @@ msgid "Name of template to use." msgstr "Název šablony, která se má použít." #: src/reuse/cli/annotate.py:363 -#, fuzzy msgid "Do not include year in copyright statement." -msgstr "neuvádět rok v prohlášení" +msgstr "V prohlášení o autorských právech neuvádějte rok." #: src/reuse/cli/annotate.py:368 -#, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" -"sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských právech " -"totožná" +"Slučte řádky s autorskými právy, pokud jsou prohlášení o autorských právech " +"totožná." #: src/reuse/cli/annotate.py:375 -#, fuzzy msgid "Force single-line comment style." -msgstr "vynutit jednořádkový styl komentáře, nepovinné" +msgstr "Vyžadujte jednořádkový styl komentáře." #: src/reuse/cli/annotate.py:382 -#, fuzzy msgid "Force multi-line comment style." -msgstr "vynutit víceřádkový styl komentáře, nepovinné" +msgstr "Vyžadujte víceřádkový styl komentáře." #: src/reuse/cli/annotate.py:388 -#, fuzzy msgid "Add headers to all files under specified directories recursively." -msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" +msgstr "Rekurzivně přidejte hlavičky ke všem souborům v zadaných adresářích." #: src/reuse/cli/annotate.py:393 -#, fuzzy msgid "Do not replace the first header in the file; just add a new one." -msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" +msgstr "První záhlaví v souboru nenahrazujte, pouze přidejte nové." #: src/reuse/cli/annotate.py:400 -#, fuzzy msgid "Always write a .license file instead of a header inside the file." -msgstr "místo hlavičky uvnitř souboru vždy zapsat soubor .license" +msgstr "Místo hlavičky uvnitř souboru vždy napište soubor .license." #: src/reuse/cli/annotate.py:407 -#, fuzzy msgid "Write a .license file to files with unrecognised comment styles." -msgstr "zapsat soubor .license do souborů s nerozpoznanými styly komentářů" +msgstr "Zapište soubor .license do souborů s nerozpoznanými styly komentářů." #: src/reuse/cli/annotate.py:414 -#, fuzzy msgid "Skip files with unrecognised comment styles." -msgstr "přeskočit soubory s nerozpoznanými styly komentářů" +msgstr "Přeskočte soubory s nerozpoznanými styly komentářů." #: src/reuse/cli/annotate.py:425 -#, fuzzy msgid "Skip files that already contain REUSE information." -msgstr "přeskočit soubory, které již obsahují informace REUSE" +msgstr "Přeskočte soubory, které již obsahují informace REUSE." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:430 msgid "PATH" -msgstr "" +msgstr "CESTA" #: src/reuse/cli/annotate.py:480 #, python-brace-format @@ -203,12 +193,11 @@ msgstr "" #: src/reuse/cli/common.py:97 #, python-brace-format msgid "'{name}' is mutually exclusive with: {opts}" -msgstr "" +msgstr "'{name}' se vzájemně vylučuje s: {opts}" #: src/reuse/cli/common.py:114 -#, fuzzy msgid "'{}' is not a valid SPDX expression." -msgstr "'{}' není platný výraz SPDX, přeruší se" +msgstr "'{}' není platný výraz SPDX." #: src/reuse/cli/convert_dep5.py:19 msgid "" @@ -216,28 +205,29 @@ msgid "" "the project root and is semantically identical. The .reuse/dep5 file is " "subsequently deleted." msgstr "" +"Převod souboru .reuse/dep5 do souboru REUSE.toml. Vygenerovaný soubor je " +"umístěn v kořenovém adresáři projektu a je sémanticky identický. Soubor ." +"reuse/dep5 je následně odstraněn." #: src/reuse/cli/convert_dep5.py:31 -#, fuzzy msgid "No '.reuse/dep5' file." -msgstr "žádný soubor '.reuse/dep5'" +msgstr "Žádný soubor '.reuse/dep5'." #: src/reuse/cli/download.py:52 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' není platný identifikátor licence SPDX." #: src/reuse/cli/download.py:59 -#, fuzzy msgid "Did you mean:" -msgstr "Měl jste na mysli:" +msgstr "Chtěl jste říct:" #: src/reuse/cli/download.py:66 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" -"Seznam platných identifikátorů licence SPDX naleznete na adrese ." +"Seznam platných identifikátorů licence SPDX naleznete na ." #: src/reuse/cli/download.py:75 #, python-brace-format @@ -245,7 +235,7 @@ msgid "Error: {spdx_identifier} already exists." msgstr "Chyba: {spdx_identifier} již existuje." #: src/reuse/cli/download.py:82 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Error: {path} does not exist." msgstr "Chyba: {path} neexistuje." @@ -271,40 +261,37 @@ msgid "" "LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " "multiple times to download multiple licenses." msgstr "" +"LICENSE musí být platný identifikátor licence SPDX. Pro stažení více licencí " +"můžete zadat LICENSE vícekrát." #: src/reuse/cli/download.py:122 -#, fuzzy msgid "Download all missing licenses detected in the project." -msgstr "stáhnout všechny chybějící licence zjištěné v projektu" +msgstr "Stáhnout všechny chybějící licence zjištěné v projektu." #: src/reuse/cli/download.py:130 msgid "Path to download to." -msgstr "" +msgstr "Cesta ke stažení." #: src/reuse/cli/download.py:136 -#, fuzzy msgid "" "Source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself." msgstr "" -"zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " -"který soubor obsahuje, nebo samotný soubor" +"Zdroj, ze kterého se kopírují vlastní licence LicenseRef- nebo adresář, " +"který soubor obsahuje, nebo samotný soubor." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/download.py:143 -#, fuzzy msgid "LICENSE" -msgstr "NEVHODNÉ LICENCE" +msgstr "LICENCE" #: src/reuse/cli/download.py:159 -#, fuzzy msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." -msgstr "volby --single-line a --multi-line se vzájemně vylučují" +msgstr "Argument 'LICENSE' a možnost '--all' se vzájemně vylučují." #: src/reuse/cli/download.py:173 -#, fuzzy msgid "Cannot use '--output' with more than one license." -msgstr "nelze použít --output s více než jednou licencí" +msgstr "Nelze použít --output s více než jednou licencí." #: src/reuse/cli/lint.py:27 #, python-brace-format @@ -314,70 +301,73 @@ msgid "" "find the latest version of the specification at ." msgstr "" +"Proveďte lintování adresáře projektu, aby byl v souladu s pravidly REUSE. " +"Tato verze nástroje kontroluje verzi {reuse_version} specifikace REUSE. " +"Nejnovější verzi specifikace najdete na adrese ." #: src/reuse/cli/lint.py:33 msgid "Specifically, the following criteria are checked:" -msgstr "" +msgstr "Kontrolují se zejména tato kritéria:" #: src/reuse/cli/lint.py:36 msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?" msgstr "" +"- Jsou v projektu nějaké špatné (nerozpoznané, nekompatibilní s SPDX) " +"licence?" #: src/reuse/cli/lint.py:40 -#, fuzzy msgid "- Are there any deprecated licenses in the project?" -msgstr "Jaká je internetová adresa projektu?" +msgstr "- Jsou v projektu nějaké zastaralé licence?" #: src/reuse/cli/lint.py:43 msgid "" "- Are there any license files in the LICENSES/ directory without file " "extension?" -msgstr "" +msgstr "- Jsou v adresáři LICENSES/ nějaké licenční soubory bez přípony?" #: src/reuse/cli/lint.py:48 msgid "" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?" msgstr "" +"- Odkazuje se na nějaké licence uvnitř projektu, ale nejsou obsaženy v " +"adresáři LICENSES/?" #: src/reuse/cli/lint.py:53 msgid "" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?" msgstr "" +"- Jsou v adresáři LICENSES/ obsaženy nějaké licence, které se v projektu " +"nepoužívají?" #: src/reuse/cli/lint.py:57 msgid "- Are there any read errors?" -msgstr "" +msgstr "- Dochází k chybám při čtení?" #: src/reuse/cli/lint.py:59 -#, fuzzy msgid "- Do all files have valid copyright and licensing information?" msgstr "" -"Následující soubory neobsahují žádné informace o autorských právech a " -"licencích:" +"- Mají všechny soubory platné informace o autorských právech a licencích?" #: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 -#, fuzzy msgid "Prevent output." -msgstr "brání výstupu" +msgstr "Brání výstupu." #: src/reuse/cli/lint.py:78 -#, fuzzy msgid "Format output as JSON." -msgstr "formátuje výstup jako JSON" +msgstr "Formátuje výstup jako JSON." #: src/reuse/cli/lint.py:86 -#, fuzzy msgid "Format output as plain text. (default)" -msgstr "formátuje výstup jako prostý text (výchozí)" +msgstr "Formátování výstupu jako prostého textu. (výchozí)" #: src/reuse/cli/lint.py:94 -#, fuzzy msgid "Format output as errors per line." -msgstr "formátuje výstup jako chyby na řádek" +msgstr "Formátuje výstup jako chyby na řádek." #: src/reuse/cli/lint_file.py:25 msgid "" @@ -385,27 +375,29 @@ msgid "" "for the presence of copyright and licensing information, and whether the " "found licenses are included in the LICENSES/ directory." msgstr "" +"Lintování jednotlivých souborů pro splnění požadavků REUSE. U zadaných " +"souborů se kontroluje přítomnost informací o autorských právech a licencích " +"a zda jsou nalezené licence obsaženy v adresáři LICENSES/." #: src/reuse/cli/lint_file.py:46 -#, fuzzy msgid "Format output as errors per line. (default)" -msgstr "formátuje výstup jako chyby na řádek (výchozí)" +msgstr "Formátování výstupu jako chyby na řádek. (výchozí)" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/lint_file.py:51 msgid "FILE" -msgstr "" +msgstr "SOUBOR" #: src/reuse/cli/lint_file.py:65 -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{file}' is not inside of '{root}'." -msgstr "'{file}' není uvnitř '{root}'" +msgstr "'{file}' není uvnitř '{root}'." #: src/reuse/cli/main.py:37 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format +#, python-format msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: chyba: %(message)s\n" +msgstr "%(prog)s, verze %(version)s" #: src/reuse/cli/main.py:40 msgid "" @@ -414,6 +406,9 @@ msgid "" "Software Foundation, either version 3 of the License, or (at your option) " "any later version." msgstr "" +"Tento program je svobodný software: můžete jej šířit a/nebo upravovat za " +"podmínek GNU General Public License, jak ji vydala Free Software Foundation, " +"a to buď ve verzi 3, nebo (podle vaší volby) v jakékoli pozdější verzi." #: src/reuse/cli/main.py:47 msgid "" @@ -422,12 +417,17 @@ msgid "" "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" +"Tento program je šířen v naději, že bude užitečný, ale BEZ JAKÉKOLIV ZÁRUKY; " +"dokonce ani bez předpokládané záruky PRODEJNOSTI nebo VHODNOSTI PRO " +"KONKRÉTNÍ ÚČEL. Další podrobnosti naleznete v Obecné veřejné licenci GNU." #: src/reuse/cli/main.py:54 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" +"Spolu s tímto programem jste měli obdržet kopii Obecné veřejné licence GNU. " +"Pokud ne, podívejte se na ." #: src/reuse/cli/main.py:62 msgid "" @@ -460,72 +460,60 @@ msgstr "" "možnost přispět na ." #: src/reuse/cli/main.py:89 -#, fuzzy msgid "Enable debug statements." -msgstr "povolit příkazy pro ladění" +msgstr "Povolit příkazy pro ladění." #: src/reuse/cli/main.py:94 -#, fuzzy msgid "Hide deprecation warnings." -msgstr "skrýt varování o zastarání" +msgstr "Skrýt varování o zastarání." #: src/reuse/cli/main.py:99 -#, fuzzy msgid "Do not skip over Git submodules." -msgstr "nepřeskakovat submoduly systému Git" +msgstr "Nepřeskakovat submoduly v Git." #: src/reuse/cli/main.py:104 -#, fuzzy msgid "Do not skip over Meson subprojects." -msgstr "nepřeskakovat podprojekty Meson" +msgstr "Nepřeskakovat podprojekty Meson." #: src/reuse/cli/main.py:109 -#, fuzzy msgid "Do not use multiprocessing." -msgstr "nepoužívat multiprocessing" +msgstr "Nepoužívat multiprocessing." #: src/reuse/cli/main.py:119 -#, fuzzy msgid "Define root of project." -msgstr "definovat kořen projektu" +msgstr "Definovat kořen projektu." #: src/reuse/cli/spdx.py:23 -#, fuzzy msgid "Generate an SPDX bill of materials." -msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" +msgstr "Vytisknout výkaz položek v SPDX." #: src/reuse/cli/spdx.py:33 -#, fuzzy msgid "File to write to." -msgstr "soubory do lint" +msgstr "Soubor, do kterého se zapisuje." #: src/reuse/cli/spdx.py:39 -#, fuzzy msgid "" "Populate the LicenseConcluded field; note that reuse cannot guarantee that " "the field is accurate." msgstr "" -"vyplňte pole LicenseConcluded; upozorňujeme, že opětovné použití nemůže " -"zaručit, že pole bude přesné" +"Vyplňte pole LicenseConcluded; upozorňujeme, že reuse nemůže zaručit, že " +"pole je přesné." #: src/reuse/cli/spdx.py:51 -#, fuzzy msgid "Name of the person signing off on the SPDX report." -msgstr "jméno osoby podepisující zprávu SPDX" +msgstr "Jméno osoby podepisující zprávu SPDX." #: src/reuse/cli/spdx.py:55 -#, fuzzy msgid "Name of the organization signing off on the SPDX report." -msgstr "název organizace, která podepsala zprávu SPDX" +msgstr "Název organizace, která podepisuje zprávu SPDX." #: src/reuse/cli/spdx.py:82 -#, fuzzy msgid "" "'--creator-person' or '--creator-organization' is required when '--add-" "license-concluded' is provided." msgstr "" -"chyba: --creator-person=NAME nebo --creator-organization=NAME je vyžadováno " -"při zadání parametru --add-licence-concluded" +"Pokud je zadán parametr '--add-license-concluded', je vyžadován parametr " +"'--creator-person' nebo '--creator-organization'." #: src/reuse/cli/spdx.py:97 #, python-brace-format @@ -539,14 +527,13 @@ msgstr "" "standard-data-format-requirements" #: src/reuse/cli/supported_licenses.py:15 -#, fuzzy msgid "List all licenses on the SPDX License List." -msgstr "seznam všech podporovaných licencí SPDX" +msgstr "Seznam všech licencí v seznamu licencí SPDX." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format msgid "{editor}: Editing failed" -msgstr "" +msgstr "{editor}: Editace se nezdařila" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 #, python-brace-format @@ -559,15 +546,14 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 -#, fuzzy msgid "Show this message and exit." -msgstr "zobrazit tuto nápovědu a ukončit" +msgstr "Zobrazit tuto zprávu a ukončit." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 -#, fuzzy, python-brace-format +#, python-brace-format msgid "(Deprecated) {text}" -msgstr "Zastaralé licence:" +msgstr "(Zastaralé) {text}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 #, fuzzy @@ -592,9 +578,8 @@ msgid "Commands" msgstr "dílčí příkazy" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 -#, fuzzy msgid "Missing command." -msgstr "Chybějící licence:" +msgstr "Chybějící příkaz." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 msgid "No such command {name!r}." @@ -631,9 +616,8 @@ msgid "required" msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 -#, fuzzy msgid "Show the version and exit." -msgstr "zobrazit tuto nápovědu a ukončit" +msgstr "Zobrazit verzi a ukončit." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 @@ -662,9 +646,8 @@ msgid "Missing argument" msgstr "poziční argumenty" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 -#, fuzzy msgid "Missing option" -msgstr "Chybějící licence:" +msgstr "Chybějící možnost" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 msgid "Missing parameter" @@ -686,12 +669,12 @@ msgid "No such option: {name}" msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Did you mean {possibility}?" msgid_plural "(Possible options: {possibilities})" -msgstr[0] "Měl jste na mysli:" -msgstr[1] "Měl jste na mysli:" -msgstr[2] "Měl jste na mysli:" +msgstr[0] "Měl jste na mysli {possibility}?" +msgstr[1] "Měl jste na mysli {possibilities})" +msgstr[2] "Měl jste na mysli {possibilities})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" @@ -809,9 +792,9 @@ msgid "{name} {filename!r} is a file." msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} '{filename}' is a directory." -msgstr "'{}' není adresář" +msgstr "{name} '{filename}' je adresář." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." From 2d487f186babfdaf88c199fec503da855f7ea632 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 17 Oct 2024 07:16:51 +0000 Subject: [PATCH 104/156] Update reuse.pot --- po/cs.po | 6 +++--- po/de.po | 2 +- po/eo.po | 2 +- po/es.po | 2 +- po/fr.po | 2 +- po/gl.po | 2 +- po/it.po | 2 +- po/nl.po | 2 +- po/pt.po | 2 +- po/reuse.pot | 4 ++-- po/ru.po | 2 +- po/sv.po | 2 +- po/tr.po | 2 +- po/uk.po | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/po/cs.po b/po/cs.po index 763a00183..39928de7b 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-16 11:01+0000\n" +"POT-Creation-Date: 2024-10-17 07:16+0000\n" "PO-Revision-Date: 2024-10-17 07:16+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Italian \n" "Language-Team: Dutch \n" "Language-Team: Portuguese \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-16 11:01+0000\n" +"POT-Creation-Date: 2024-10-17 07:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/po/ru.po b/po/ru.po index 62a0c6e00..585b8fb62 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-16 11:01+0000\n" +"POT-Creation-Date: 2024-10-17 07:16+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian Date: Thu, 17 Oct 2024 13:45:24 +0200 Subject: [PATCH 105/156] Get rid of newline at start of lint output Signed-off-by: Carmen Bianca BAKKER --- src/reuse/lint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/reuse/lint.py b/src/reuse/lint.py index 7d60d7129..cf5ae838f 100644 --- a/src/reuse/lint.py +++ b/src/reuse/lint.py @@ -136,7 +136,6 @@ def format_plain(report: ProjectReport) -> str: output.write(f"* {file}\n") output.write("\n") - output.write("\n") output.write("# " + _("SUMMARY")) output.write("\n\n") From 78a29377025db12bcf5d0a96e9f31ee4848c91a1 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 13:48:53 +0200 Subject: [PATCH 106/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/fixed/plain-format-output-new-line-fix.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 changelog.d/fixed/plain-format-output-new-line-fix.md diff --git a/changelog.d/fixed/plain-format-output-new-line-fix.md b/changelog.d/fixed/plain-format-output-new-line-fix.md new file mode 100644 index 000000000..58e8c617a --- /dev/null +++ b/changelog.d/fixed/plain-format-output-new-line-fix.md @@ -0,0 +1,2 @@ +- The plain output of `lint` has been slightly improved, getting rid of an + errant newline. (#1091) From ab54724f16001f9d97522e16e145c13499250913 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 15:59:37 +0200 Subject: [PATCH 107/156] Factor exceptions out into own module Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 8 ----- src/reuse/_annotate.py | 4 +-- src/reuse/cli/common.py | 4 +-- src/reuse/comment.py | 9 +---- src/reuse/exceptions.py | 61 ++++++++++++++++++++++++++++++++++ src/reuse/global_licensing.py | 29 ++++------------ src/reuse/header.py | 13 ++------ src/reuse/project.py | 9 ++--- tests/test_comment.py | 3 +- tests/test_global_licensing.py | 6 ++-- tests/test_header.py | 10 ++---- tests/test_project.py | 9 ++--- 12 files changed, 87 insertions(+), 78 deletions(-) create mode 100644 src/reuse/exceptions.py diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 495f35ed6..416f7d944 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -182,11 +182,3 @@ def __bool__(self) -> bool: def __or__(self, value: "ReuseInfo") -> "ReuseInfo": return self.union(value) - - -class ReuseException(Exception): - """Base exception.""" - - -class IdentifierNotFound(ReuseException): - """Could not find SPDX identifier for license file.""" diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index e914f5c27..e9a89f065 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -30,12 +30,12 @@ ) from .comment import ( NAME_STYLE_MAP, - CommentCreateError, CommentStyle, EmptyCommentStyle, get_comment_style, ) -from .header import MissingReuseInfo, add_new_header, find_and_replace_header +from .exceptions import CommentCreateError, MissingReuseInfo +from .header import add_new_header, find_and_replace_header from .i18n import _ from .project import Project from .types import StrPath diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index 1f943fba1..046fd6c08 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -13,9 +13,9 @@ from license_expression import ExpressionError from .._util import _LICENSING -from ..global_licensing import GlobalLicensingParseError +from ..exceptions import GlobalLicensingConflict, GlobalLicensingParseError from ..i18n import _ -from ..project import GlobalLicensingConflict, Project +from ..project import Project from ..vcs import find_root diff --git a/src/reuse/comment.py b/src/reuse/comment.py index c87869333..d48e3bc45 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -32,19 +32,12 @@ from textwrap import dedent from typing import NamedTuple, Optional, Type, cast +from .exceptions import CommentCreateError, CommentParseError from .types import StrPath _LOGGER = logging.getLogger(__name__) -class CommentParseError(Exception): - """An error occurred during the parsing of a comment.""" - - -class CommentCreateError(Exception): - """An error occurred during the creation of a comment.""" - - class MultiLineSegments(NamedTuple): """Components that make up a multi-line comment style, e.g. '/*', '*', and '*/'. diff --git a/src/reuse/exceptions.py b/src/reuse/exceptions.py new file mode 100644 index 000000000..e82427488 --- /dev/null +++ b/src/reuse/exceptions.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""All exceptions owned by :mod:`reuse`. These exceptions all inherit +:class:`ReuseError`. +""" + +from typing import Any, Optional + + +class ReuseError(Exception): + """Base exception.""" + + +class IdentifierNotFound(ReuseError): + """Could not find SPDX identifier for license file.""" + + +class GlobalLicensingParseError(ReuseError): + """An exception representing any kind of error that occurs when trying to + parse a :class:`GlobalLicensing` file. + """ + + def __init__(self, *args: Any, source: Optional[str] = None): + super().__init__(*args) + self.source = source + + +class GlobalLicensingParseTypeError(GlobalLicensingParseError, TypeError): + """An exception representing a type error while trying to parse a + :class:`GlobalLicensing` file. + """ + + +class GlobalLicensingParseValueError(GlobalLicensingParseError, ValueError): + """An exception representing a value error while trying to parse a + :class:`GlobalLicensing` file. + """ + + +class GlobalLicensingConflict(ReuseError): + """There are two global licensing files in the project that are not + compatible. + """ + + +class MissingReuseInfo(ReuseError): + """Some REUSE information is missing from the result.""" + + +class CommentError(ReuseError): + """An error occurred during an interaction with a comment.""" + + +class CommentCreateError(Exception): + """An error occurred during the creation of a comment.""" + + +class CommentParseError(Exception): + """An error occurred during the parsing of a comment.""" diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index 3a0415294..bacc8f92a 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -33,9 +33,14 @@ from debian.copyright import Error as DebianError from license_expression import ExpressionError -from . import ReuseException, ReuseInfo, SourceType +from . import ReuseInfo, SourceType from ._util import _LICENSING from .covered_files import iter_files +from .exceptions import ( + GlobalLicensingParseError, + GlobalLicensingParseTypeError, + GlobalLicensingParseValueError, +) from .i18n import _ from .types import StrPath from .vcs import VCSStrategy @@ -72,28 +77,6 @@ class PrecedenceType(Enum): OVERRIDE = "override" -class GlobalLicensingParseError(ReuseException): - """An exception representing any kind of error that occurs when trying to - parse a :class:`GlobalLicensing` file. - """ - - def __init__(self, *args: Any, source: Optional[str] = None): - super().__init__(*args) - self.source = source - - -class GlobalLicensingParseTypeError(GlobalLicensingParseError, TypeError): - """An exception representing a type error while trying to parse a - :class:`GlobalLicensing` file. - """ - - -class GlobalLicensingParseValueError(GlobalLicensingParseError, ValueError): - """An exception representing a value error while trying to parse a - :class:`GlobalLicensing` file. - """ - - @attrs.define class _CollectionOfValidator: collection_type: Type[Collection] = attrs.field() diff --git a/src/reuse/header.py b/src/reuse/header.py index 06d838c6d..b43b38ed0 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -28,13 +28,8 @@ extract_reuse_info, merge_copyright_lines, ) -from .comment import ( - CommentCreateError, - CommentParseError, - CommentStyle, - EmptyCommentStyle, - PythonCommentStyle, -) +from .comment import CommentStyle, EmptyCommentStyle, PythonCommentStyle +from .exceptions import CommentCreateError, CommentParseError, MissingReuseInfo from .i18n import _ _LOGGER = logging.getLogger(__name__) @@ -53,10 +48,6 @@ class _TextSections(NamedTuple): after: str -class MissingReuseInfo(Exception): - """Some REUSE information is missing from the result.""" - - def _create_new_header( reuse_info: ReuseInfo, template: Optional[Template] = None, diff --git a/src/reuse/project.py b/src/reuse/project.py index 7895313fa..375adae6f 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -21,7 +21,7 @@ import attrs from binaryornot.check import is_binary -from . import IdentifierNotFound, ReuseInfo +from . import ReuseInfo from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( _LICENSEREF_PATTERN, @@ -30,6 +30,7 @@ reuse_info_of_file, ) from .covered_files import iter_files +from .exceptions import GlobalLicensingConflict, IdentifierNotFound from .global_licensing import ( GlobalLicensing, NestedReuseTOML, @@ -44,12 +45,6 @@ _LOGGER = logging.getLogger(__name__) -class GlobalLicensingConflict(Exception): - """There are two global licensing files in the project that are not - compatible. - """ - - class GlobalLicensingFound(NamedTuple): path: Path cls: Type[GlobalLicensing] diff --git a/tests/test_comment.py b/tests/test_comment.py index b0766cdfc..51c1e1247 100644 --- a/tests/test_comment.py +++ b/tests/test_comment.py @@ -13,8 +13,6 @@ import pytest from reuse.comment import ( - CommentCreateError, - CommentParseError, CommentStyle, CppCommentStyle, HtmlCommentStyle, @@ -22,6 +20,7 @@ PythonCommentStyle, _all_style_classes, ) +from reuse.exceptions import CommentCreateError, CommentParseError @pytest.fixture( diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index 175623916..62a69557a 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -15,11 +15,13 @@ from reuse import ReuseInfo, SourceType from reuse._util import _LICENSING -from reuse.global_licensing import ( - AnnotationsItem, +from reuse.exceptions import ( GlobalLicensingParseError, GlobalLicensingParseTypeError, GlobalLicensingParseValueError, +) +from reuse.global_licensing import ( + AnnotationsItem, NestedReuseTOML, PrecedenceType, ReuseDep5, diff --git a/tests/test_header.py b/tests/test_header.py index 3ef286c20..54e205bce 100644 --- a/tests/test_header.py +++ b/tests/test_header.py @@ -11,13 +11,9 @@ import pytest from reuse import ReuseInfo -from reuse.comment import CommentCreateError, CppCommentStyle -from reuse.header import ( - MissingReuseInfo, - add_new_header, - create_header, - find_and_replace_header, -) +from reuse.comment import CppCommentStyle +from reuse.exceptions import CommentCreateError, MissingReuseInfo +from reuse.header import add_new_header, create_header, find_and_replace_header # REUSE-IgnoreStart diff --git a/tests/test_project.py b/tests/test_project.py index 59014bf4c..1b6cd7d90 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -22,12 +22,9 @@ from reuse import ReuseInfo, SourceType from reuse._util import _LICENSING from reuse.covered_files import iter_files -from reuse.global_licensing import ( - GlobalLicensingParseError, - ReuseDep5, - ReuseTOML, -) -from reuse.project import GlobalLicensingConflict, Project +from reuse.exceptions import GlobalLicensingConflict, GlobalLicensingParseError +from reuse.global_licensing import ReuseDep5, ReuseTOML +from reuse.project import Project # REUSE-IgnoreStart From d05a806fe02939c6e5378caf0361a14aa20c5f81 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 16:54:44 +0200 Subject: [PATCH 108/156] Standardise naming of exceptions Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_annotate.py | 4 ++-- src/reuse/cli/common.py | 4 ++-- src/reuse/exceptions.py | 6 +++--- src/reuse/header.py | 23 +++++++++++++++-------- src/reuse/project.py | 21 ++++++++++++--------- tests/test_header.py | 4 ++-- tests/test_project.py | 9 ++++++--- 7 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index e9a89f065..564c0341b 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -34,7 +34,7 @@ EmptyCommentStyle, get_comment_style, ) -from .exceptions import CommentCreateError, MissingReuseInfo +from .exceptions import CommentCreateError, MissingReuseInfoError from .header import add_new_header, find_and_replace_header from .i18n import _ from .project import Project @@ -152,7 +152,7 @@ def add_header_to_file( ) out.write("\n") result = 1 - except MissingReuseInfo: + except MissingReuseInfoError: out.write( _( "Error: Generated comment header for '{path}' is missing" diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index 046fd6c08..c2ce22132 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -13,7 +13,7 @@ from license_expression import ExpressionError from .._util import _LICENSING -from ..exceptions import GlobalLicensingConflict, GlobalLicensingParseError +from ..exceptions import GlobalLicensingConflictError, GlobalLicensingParseError from ..i18n import _ from ..project import Project from ..vcs import find_root @@ -60,7 +60,7 @@ def project(self) -> Project: ).format(path=error.source, message=str(error)) ) from error - except (GlobalLicensingConflict, OSError) as error: + except (GlobalLicensingConflictError, OSError) as error: raise click.UsageError(str(error)) from error self._project = project diff --git a/src/reuse/exceptions.py b/src/reuse/exceptions.py index e82427488..c24b7ffa3 100644 --- a/src/reuse/exceptions.py +++ b/src/reuse/exceptions.py @@ -13,7 +13,7 @@ class ReuseError(Exception): """Base exception.""" -class IdentifierNotFound(ReuseError): +class SpdxIdentifierNotFoundError(ReuseError): """Could not find SPDX identifier for license file.""" @@ -39,13 +39,13 @@ class GlobalLicensingParseValueError(GlobalLicensingParseError, ValueError): """ -class GlobalLicensingConflict(ReuseError): +class GlobalLicensingConflictError(ReuseError): """There are two global licensing files in the project that are not compatible. """ -class MissingReuseInfo(ReuseError): +class MissingReuseInfoError(ReuseError): """Some REUSE information is missing from the result.""" diff --git a/src/reuse/header.py b/src/reuse/header.py index b43b38ed0..6000d9a84 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -29,7 +29,11 @@ merge_copyright_lines, ) from .comment import CommentStyle, EmptyCommentStyle, PythonCommentStyle -from .exceptions import CommentCreateError, CommentParseError, MissingReuseInfo +from .exceptions import ( + CommentCreateError, + CommentParseError, + MissingReuseInfoError, +) from .i18n import _ _LOGGER = logging.getLogger(__name__) @@ -59,7 +63,8 @@ def _create_new_header( Raises: CommentCreateError: if a comment could not be created. - MissingReuseInfo: if the generated comment is missing SPDX information. + MissingReuseInfoError: if the generated comment is missing SPDX + information. """ if template is None: template = DEFAULT_TEMPLATE @@ -92,7 +97,7 @@ def _create_new_header( ) ) _LOGGER.debug(result) - raise MissingReuseInfo() + raise MissingReuseInfoError() return result @@ -116,7 +121,8 @@ def create_header( Raises: CommentCreateError: if a comment could not be created. - MissingReuseInfo: if the generated comment is missing SPDX information. + MissingReuseInfoError: if the generated comment is missing SPDX + information. """ if template is None: template = DEFAULT_TEMPLATE @@ -177,7 +183,7 @@ def _find_first_spdx_comment( preceding the comment, the comment itself, and everything following it. Raises: - MissingReuseInfo: if no REUSE info can be found in any comment + MissingReuseInfoError: if no REUSE info can be found in any comment. """ if style is None: style = PythonCommentStyle @@ -194,7 +200,7 @@ def _find_first_spdx_comment( text[:index], comment + "\n", text[index + len(comment) + 1 :] ) - raise MissingReuseInfo() + raise MissingReuseInfoError() def _extract_shebang(prefix: str, text: str) -> tuple[str, str]: @@ -239,14 +245,15 @@ def find_and_replace_header( Raises: CommentCreateError: if a comment could not be created. - MissingReuseInfo: if the generated comment is missing SPDX information. + MissingReuseInfoError: if the generated comment is missing SPDX + information. """ if style is None: style = PythonCommentStyle try: before, header, after = _find_first_spdx_comment(text, style=style) - except MissingReuseInfo: + except MissingReuseInfoError: before, header, after = "", "", text # Workaround. EmptyCommentStyle should always be completely replaced. diff --git a/src/reuse/project.py b/src/reuse/project.py index 375adae6f..cf6ca24d5 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -30,7 +30,10 @@ reuse_info_of_file, ) from .covered_files import iter_files -from .exceptions import GlobalLicensingConflict, IdentifierNotFound +from .exceptions import ( + GlobalLicensingConflictError, + SpdxIdentifierNotFoundError, +) from .global_licensing import ( GlobalLicensing, NestedReuseTOML, @@ -106,8 +109,8 @@ def from_directory( decoded. GlobalLicensingParseError: if the global licensing config file could not be parsed. - GlobalLicensingConflict: if more than one global licensing config - file is present. + GlobalLicensingConflictError: if more than one global licensing + config file is present. """ root = Path(root) if not root.exists(): @@ -318,8 +321,8 @@ def find_global_licensing( :class:`GlobalLicensing`. Raises: - GlobalLicensingConflict: if more than one global licensing config - file is present. + GlobalLicensingConflictError: if more than one global licensing + config file is present. """ candidates: list[GlobalLicensingFound] = [] dep5_path = root / ".reuse/dep5" @@ -347,7 +350,7 @@ def find_global_licensing( ] if reuse_toml_candidates: if candidates: - raise GlobalLicensingConflict( + raise GlobalLicensingConflictError( _( "Found both '{new_path}' and '{old_path}'. You" " cannot keep both files simultaneously; they are" @@ -379,13 +382,13 @@ def _identifier_of_license(self, path: Path) -> str: License Identifier. """ if not path.suffix: - raise IdentifierNotFound(f"{path} has no file extension") + raise SpdxIdentifierNotFoundError(f"{path} has no file extension") if path.stem in self.license_map: return path.stem if _LICENSEREF_PATTERN.match(path.stem): return path.stem - raise IdentifierNotFound( + raise SpdxIdentifierNotFoundError( f"Could not find SPDX License Identifier for {path}" ) @@ -413,7 +416,7 @@ def _find_licenses(self) -> dict[str, Path]: try: identifier = self._identifier_of_license(path) - except IdentifierNotFound: + except SpdxIdentifierNotFoundError: if path.name in self.license_map: _LOGGER.info( _("{path} does not have a file extension").format( diff --git a/tests/test_header.py b/tests/test_header.py index 54e205bce..15d5507db 100644 --- a/tests/test_header.py +++ b/tests/test_header.py @@ -12,7 +12,7 @@ from reuse import ReuseInfo from reuse.comment import CppCommentStyle -from reuse.exceptions import CommentCreateError, MissingReuseInfo +from reuse.exceptions import CommentCreateError, MissingReuseInfoError from reuse.header import add_new_header, create_header, find_and_replace_header # REUSE-IgnoreStart @@ -69,7 +69,7 @@ def test_create_header_template_no_spdx(template_no_spdx): """Create a header with a template that does not have all REUSE info.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) - with pytest.raises(MissingReuseInfo): + with pytest.raises(MissingReuseInfoError): create_header(info, template=template_no_spdx) diff --git a/tests/test_project.py b/tests/test_project.py index 1b6cd7d90..448a2bf79 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -22,7 +22,10 @@ from reuse import ReuseInfo, SourceType from reuse._util import _LICENSING from reuse.covered_files import iter_files -from reuse.exceptions import GlobalLicensingConflict, GlobalLicensingParseError +from reuse.exceptions import ( + GlobalLicensingConflictError, + GlobalLicensingParseError, +) from reuse.global_licensing import ReuseDep5, ReuseTOML from reuse.project import Project @@ -49,7 +52,7 @@ def test_project_conflicting_global_licensing(empty_directory): (empty_directory / "REUSE.toml").write_text("version = 1") (empty_directory / ".reuse").mkdir() shutil.copy(RESOURCES_DIRECTORY / "dep5", empty_directory / ".reuse/dep5") - with pytest.raises(GlobalLicensingConflict): + with pytest.raises(GlobalLicensingConflictError): Project.from_directory(empty_directory) @@ -602,7 +605,7 @@ def test_find_global_licensing_none(empty_directory): def test_find_global_licensing_conflict(fake_repository_dep5): """Expect an error on a conflict""" (fake_repository_dep5 / "REUSE.toml").write_text("version = 1") - with pytest.raises(GlobalLicensingConflict): + with pytest.raises(GlobalLicensingConflictError): Project.find_global_licensing(fake_repository_dep5) From 0af6fb6a9e3c92d3d963ec4d60a7109d5348e27e Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 16:57:47 +0200 Subject: [PATCH 109/156] Fix documentation linking Signed-off-by: Carmen Bianca BAKKER --- src/reuse/exceptions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/reuse/exceptions.py b/src/reuse/exceptions.py index c24b7ffa3..94d03d871 100644 --- a/src/reuse/exceptions.py +++ b/src/reuse/exceptions.py @@ -19,7 +19,7 @@ class SpdxIdentifierNotFoundError(ReuseError): class GlobalLicensingParseError(ReuseError): """An exception representing any kind of error that occurs when trying to - parse a :class:`GlobalLicensing` file. + parse a :class:`reuse.global_licensing.GlobalLicensing` file. """ def __init__(self, *args: Any, source: Optional[str] = None): @@ -29,13 +29,13 @@ def __init__(self, *args: Any, source: Optional[str] = None): class GlobalLicensingParseTypeError(GlobalLicensingParseError, TypeError): """An exception representing a type error while trying to parse a - :class:`GlobalLicensing` file. + :class:`reuse.global_licensing.GlobalLicensing` file. """ class GlobalLicensingParseValueError(GlobalLicensingParseError, ValueError): """An exception representing a value error while trying to parse a - :class:`GlobalLicensing` file. + :class:`reuse.global_licensing.GlobalLicensing` file. """ From 5d648e4a1190bf26ce3863bc5de393a418749b24 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 17:19:42 +0200 Subject: [PATCH 110/156] Move consts to covered_files Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 38 ---------------------------------- src/reuse/cli/spdx.py | 2 +- src/reuse/covered_files.py | 42 +++++++++++++++++++++++++++++++++----- 3 files changed, 38 insertions(+), 44 deletions(-) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 416f7d944..8a9a0e741 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -22,7 +22,6 @@ import gettext import logging import os -import re from dataclasses import dataclass, field from enum import Enum from importlib.metadata import PackageNotFoundError, version @@ -54,43 +53,6 @@ _LOGGER.debug("no translations found at %s", _LOCALE_DIR) -_IGNORE_DIR_PATTERNS = [ - re.compile(r"^\.git$"), - re.compile(r"^\.hg$"), - re.compile(r"^\.sl$"), # Used by Sapling SCM - re.compile(r"^LICENSES$"), - re.compile(r"^\.reuse$"), -] - -_IGNORE_MESON_PARENT_DIR_PATTERNS = [ - re.compile(r"^subprojects$"), -] - -_IGNORE_FILE_PATTERNS = [ - # LICENSE, LICENSE-MIT, LICENSE.txt - re.compile(r"^LICEN[CS]E([-\.].*)?$"), - re.compile(r"^COPYING([-\.].*)?$"), - # ".git" as file happens in submodules - re.compile(r"^\.git$"), - re.compile(r"^\.hgtags$"), - re.compile(r".*\.license$"), - re.compile(r"^REUSE\.toml$"), - # Workaround for https://github.com/fsfe/reuse-tool/issues/229 - re.compile(r"^CAL-1.0(-Combined-Work-Exception)?(\..+)?$"), - re.compile(r"^SHL-2.1(\..+)?$"), -] - -_IGNORE_SPDX_PATTERNS = [ - # SPDX files from - # https://spdx.github.io/spdx-spec/conformance/#44-standard-data-format-requirements - re.compile(r".*\.spdx$"), - re.compile(r".*\.spdx.(rdf|json|xml|ya?ml)$"), -] - -# Combine SPDX patterns into file patterns to ease default ignore usage -_IGNORE_FILE_PATTERNS.extend(_IGNORE_SPDX_PATTERNS) - - class SourceType(Enum): """ An enumeration representing the types of sources for license information. diff --git a/src/reuse/cli/spdx.py b/src/reuse/cli/spdx.py index 11a9933b5..1f29e4e0a 100644 --- a/src/reuse/cli/spdx.py +++ b/src/reuse/cli/spdx.py @@ -12,7 +12,7 @@ import click -from .. import _IGNORE_SPDX_PATTERNS +from ..covered_files import _IGNORE_SPDX_PATTERNS from ..i18n import _ from ..report import ProjectReport from .common import ClickObj diff --git a/src/reuse/covered_files.py b/src/reuse/covered_files.py index ad4e019b6..cbe143550 100644 --- a/src/reuse/covered_files.py +++ b/src/reuse/covered_files.py @@ -11,19 +11,51 @@ import contextlib import logging import os +import re from pathlib import Path from typing import Collection, Generator, Optional, cast -from . import ( - _IGNORE_DIR_PATTERNS, - _IGNORE_FILE_PATTERNS, - _IGNORE_MESON_PARENT_DIR_PATTERNS, -) from .types import StrPath from .vcs import VCSStrategy _LOGGER = logging.getLogger(__name__) +_IGNORE_DIR_PATTERNS = [ + re.compile(r"^\.git$"), + re.compile(r"^\.hg$"), + re.compile(r"^\.sl$"), # Used by Sapling SCM + re.compile(r"^LICENSES$"), + re.compile(r"^\.reuse$"), +] + +_IGNORE_MESON_PARENT_DIR_PATTERNS = [ + re.compile(r"^subprojects$"), +] + +_IGNORE_FILE_PATTERNS = [ + # LICENSE, LICENSE-MIT, LICENSE.txt + re.compile(r"^LICEN[CS]E([-\.].*)?$"), + re.compile(r"^COPYING([-\.].*)?$"), + # ".git" as file happens in submodules + re.compile(r"^\.git$"), + re.compile(r"^\.hgtags$"), + re.compile(r".*\.license$"), + re.compile(r"^REUSE\.toml$"), + # Workaround for https://github.com/fsfe/reuse-tool/issues/229 + re.compile(r"^CAL-1.0(-Combined-Work-Exception)?(\..+)?$"), + re.compile(r"^SHL-2.1(\..+)?$"), +] + +_IGNORE_SPDX_PATTERNS = [ + # SPDX files from + # https://spdx.github.io/spdx-spec/conformance/#44-standard-data-format-requirements + re.compile(r".*\.spdx$"), + re.compile(r".*\.spdx.(rdf|json|xml|ya?ml)$"), +] + +# Combine SPDX patterns into file patterns to ease default ignore usage +_IGNORE_FILE_PATTERNS.extend(_IGNORE_SPDX_PATTERNS) + def is_path_ignored( path: Path, From c38ca2ab38a6ee0daed2e92293d1d7d4b20218f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Thu, 17 Oct 2024 20:07:44 +0000 Subject: [PATCH 111/156] Translated using Weblate (Czech) Currently translated at 100.0% (151 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/cs/ --- po/cs.po | 133 +++++++++++++++++++++++++++---------------------------- 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/po/cs.po b/po/cs.po index 39928de7b..ae0ca09d9 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-17 07:16+0000\n" -"PO-Revision-Date: 2024-10-17 07:16+0000\n" +"PO-Revision-Date: 2024-10-18 20:15+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -538,11 +538,11 @@ msgstr "{editor}: Editace se nezdařila" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 #, python-brace-format msgid "{editor}: Editing failed: {e}" -msgstr "" +msgstr "{editor}: Úpravy se nezdařily: {e}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 msgid "Aborted!" -msgstr "" +msgstr "Přerušeno!" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 @@ -556,26 +556,24 @@ msgid "(Deprecated) {text}" msgstr "(Zastaralé) {text}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 -#, fuzzy msgid "Options" -msgstr "možnosti" +msgstr "Možnosti" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Got unexpected extra argument ({args})" msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "očekávaný jeden argument" -msgstr[1] "očekávaný jeden argument" -msgstr[2] "očekávaný jeden argument" +msgstr[0] "Má ({args}) neočekávaný argument" +msgstr[1] "Má ({args}) neočekávané argumenty navíc" +msgstr[2] "Má ({args}) neočekávaných argumentů navíc" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" +msgstr "Upozornění na zastarání: Příkaz {name!r} je zastaralý." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 -#, fuzzy msgid "Commands" -msgstr "dílčí příkazy" +msgstr "Příkazy" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 msgid "Missing command." @@ -583,37 +581,37 @@ msgstr "Chybějící příkaz." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 msgid "No such command {name!r}." -msgstr "" +msgstr "Žádný takový příkaz {name!r}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 msgid "Value must be an iterable." -msgstr "" +msgstr "Hodnota musí být iterovatelná." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format msgid "Takes {nargs} values but 1 was given." msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Přijímá hodnoty {nargs}, ale byla zadána 1." +msgstr[1] "Přijímá hodnoty {nargs}, ale byly zadány hodnoty {len}." +msgstr[2] "Přijímá hodnoty {nargs}, ale byly zadány hodnoty {len}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 #, python-brace-format msgid "env var: {var}" -msgstr "" +msgstr "env var: {var}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 msgid "(dynamic)" -msgstr "" +msgstr "(dynamický)" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 #, python-brace-format msgid "default: {default}" -msgstr "" +msgstr "výchozí: {default}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 msgid "required" -msgstr "" +msgstr "vyžadováno" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 msgid "Show the version and exit." @@ -623,27 +621,26 @@ msgstr "Zobrazit verzi a ukončit." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 #, python-brace-format msgid "Error: {message}" -msgstr "" +msgstr "Chyba: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 #, python-brace-format msgid "Try '{command} {option}' for help." -msgstr "" +msgstr "Pro nápovědu zkuste '{command} {option}'." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 #, python-brace-format msgid "Invalid value: {message}" -msgstr "" +msgstr "Neplatná hodnota: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 #, python-brace-format msgid "Invalid value for {param_hint}: {message}" -msgstr "" +msgstr "Neplatná hodnota pro {param_hint}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 -#, fuzzy msgid "Missing argument" -msgstr "poziční argumenty" +msgstr "Chybějící argument" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 msgid "Missing option" @@ -651,22 +648,22 @@ msgstr "Chybějící možnost" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 msgid "Missing parameter" -msgstr "" +msgstr "Chybějící parametr" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 #, python-brace-format msgid "Missing {param_type}" -msgstr "" +msgstr "Chybějící {param_type}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 #, python-brace-format msgid "Missing parameter: {param_name}" -msgstr "" +msgstr "Chybějící parametr: {param_name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 #, python-brace-format msgid "No such option: {name}" -msgstr "" +msgstr "Žádná taková možnost neexistuje: {name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 #, python-brace-format @@ -678,59 +675,60 @@ msgstr[2] "Měl jste na mysli {possibilities})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" -msgstr "" +msgstr "neznámá chyba" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 msgid "Could not open file {filename!r}: {message}" -msgstr "" +msgstr "Nelze otevřít soubor {filename!r}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 msgid "Argument {name!r} takes {nargs} values." -msgstr "" +msgstr "Argument {name!r} nabývá hodnot {nargs}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 msgid "Option {name!r} does not take a value." -msgstr "" +msgstr "Možnost {name!r} nepřebírá hodnotu." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 msgid "Option {name!r} requires an argument." msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Možnost {name!r} vyžaduje argument." +msgstr[1] "Možnost {name!r} vyžaduje argumenty {nargs}." +msgstr[2] "Možnost {name!r} vyžaduje argumenty {nargs}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 msgid "Shell completion is not supported for Bash versions older than 4.4." msgstr "" +"Doplňování shellu není podporováno ve verzích jazyka Bash starších než 4.4." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 msgid "Couldn't detect Bash version, shell completion is not supported." -msgstr "" +msgstr "Nepodařilo se zjistit verzi Bash, doplňování shellu není podporováno." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 msgid "Repeat for confirmation" -msgstr "" +msgstr "Opakovat pro potvrzení" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 msgid "Error: The value you entered was invalid." -msgstr "" +msgstr "Chyba: Zadaná hodnota je neplatná." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 #, python-brace-format msgid "Error: {e.message}" -msgstr "" +msgstr "Chyba: {e.message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 msgid "Error: The two entered values do not match." -msgstr "" +msgstr "Chyba: Dvě zadané hodnoty se neshodují." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 msgid "Error: invalid input" -msgstr "" +msgstr "Chyba: neplatné zadání" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 msgid "Press any key to continue..." -msgstr "" +msgstr "Pro pokračování stiskněte libovolnou klávesu..." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format @@ -738,58 +736,59 @@ msgid "" "Choose from:\n" "\t{choices}" msgstr "" +"Vyberte si z:\n" +"\t{choices}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 msgid "{value!r} is not {choice}." msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{value!r} není {choice}." +msgstr[1] "{value!r} není jednou z {choices}." +msgstr[2] "{value!r} není jednou z {choices}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 msgid "{value!r} does not match the format {format}." msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{value!r} neodpovídá formátu {format}." +msgstr[1] "{value!r} neodpovídá formátům {formats}." +msgstr[2] "{value!r} neodpovídá formátům {formats}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 msgid "{value!r} is not a valid {number_type}." -msgstr "" +msgstr "{value!r} není platný {number_type}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 #, python-brace-format msgid "{value} is not in the range {range}." -msgstr "" +msgstr "{value} není v rozsahu {range}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 msgid "{value!r} is not a valid boolean." -msgstr "" +msgstr "{value!r} není platný boolean." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 msgid "{value!r} is not a valid UUID." -msgstr "" +msgstr "{value!r} není platný UUID." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 msgid "file" -msgstr "" +msgstr "soubor" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 msgid "directory" -msgstr "" +msgstr "adresář" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 msgid "path" -msgstr "" +msgstr "cesta" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 -#, fuzzy msgid "{name} {filename!r} does not exist." -msgstr "Chyba: {path} neexistuje." +msgstr "{name} {filename!r} neexistuje." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 msgid "{name} {filename!r} is a file." -msgstr "" +msgstr "{name} {filename!r} je soubor." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 #, python-brace-format @@ -798,23 +797,23 @@ msgstr "{name} '{filename}' je adresář." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." -msgstr "" +msgstr "{name} {filename!r} není čitelný." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 msgid "{name} {filename!r} is not writable." -msgstr "" +msgstr "{name} {filename!r} není zapisovatelný." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 msgid "{name} {filename!r} is not executable." -msgstr "" +msgstr "{name} {filename!r} není spustitelný." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 #, python-brace-format msgid "{len_type} values are required, but {len_value} was given." msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Hodnoty {len_type} jsou povinné, ale byla zadána {len_value} hodnota." +msgstr[1] "Hodnoty {len_type} jsou povinné, ale byly zadány {len_value} hodnoty." +msgstr[2] "Hodnoty {len_type} jsou povinné, ale bylo zadáno {len_value} hodnot." #, python-brace-format #~ msgid "Skipped unrecognised file '{path}'" From 9582ce40a594d62612c2094f13ce37a738b26f61 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 10:34:17 +0200 Subject: [PATCH 112/156] Split _util into extract and copyright Kind of. This commit is a bit of a mess, but will help a lot in the future. All stuff related to the extraction of information out of files is now in its own module, and all stuff related to the parsing and handling of copyright lines is also in its own module. The problem caused by this commit is that the tests are incomplete. Previously, not all functions in _util were tested in the understanding that they were just small helper functions for _actual_ functions that are under test. Now, there are public functions in public modules that are not tested, and by chance, all of the remaining _util is currently untested. Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 3 + src/reuse/_annotate.py | 7 +- src/reuse/_util.py | 367 +----------------------- src/reuse/cli/annotate.py | 8 +- src/reuse/cli/common.py | 2 +- src/reuse/copyright.py | 122 ++++++++ src/reuse/download.py | 3 +- src/reuse/extract.py | 282 ++++++++++++++++++ src/reuse/global_licensing.py | 3 +- src/reuse/header.py | 7 +- src/reuse/project.py | 8 +- src/reuse/report.py | 5 +- tests/test_cli_annotate.py | 2 +- tests/test_copyright.py | 135 +++++++++ tests/{test_util.py => test_extract.py} | 198 +++---------- tests/test_global_licensing.py | 3 +- tests/test_project.py | 3 +- 17 files changed, 602 insertions(+), 556 deletions(-) create mode 100644 src/reuse/copyright.py create mode 100644 src/reuse/extract.py create mode 100644 tests/test_copyright.py rename tests/{test_util.py => test_extract.py} (62%) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 8a9a0e741..720c52710 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -28,6 +28,7 @@ from typing import Any, Optional from boolean.boolean import Expression +from license_expression import Licensing try: __version__ = version("reuse") @@ -42,6 +43,8 @@ _LOGGER = logging.getLogger(__name__) +_LICENSING = Licensing() + _PACKAGE_PATH = os.path.dirname(__file__) _LOCALE_DIR = os.path.join(_PACKAGE_PATH, "locale") diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index 564c0341b..2c49d6ac2 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -23,11 +23,7 @@ from jinja2.exceptions import TemplateNotFound from . import ReuseInfo -from ._util import ( - _determine_license_suffix_path, - contains_reuse_info, - detect_line_endings, -) +from ._util import _determine_license_suffix_path from .comment import ( NAME_STYLE_MAP, CommentStyle, @@ -35,6 +31,7 @@ get_comment_style, ) from .exceptions import CommentCreateError, MissingReuseInfoError +from .extract import contains_reuse_info, detect_line_endings from .header import add_new_header, find_and_replace_header from .i18n import _ from .project import Project diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 04af137d5..fc91d76e7 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -16,22 +16,13 @@ import logging import os -import re import shutil import subprocess -from collections import Counter from hashlib import sha1 from inspect import cleandoc -from itertools import chain from pathlib import Path -from typing import IO, Any, BinaryIO, Iterator, Optional, Union +from typing import IO, Any, Optional, Union -from boolean.boolean import ParseError -from license_expression import ExpressionError, Licensing - -from . import ReuseInfo, SourceType -from .comment import _all_style_classes # TODO: This import is not ideal here. -from .i18n import _ from .types import StrPath GIT_EXE = shutil.which("git") @@ -39,93 +30,9 @@ JUJUTSU_EXE = shutil.which("jj") PIJUL_EXE = shutil.which("pijul") -REUSE_IGNORE_START = "REUSE-IgnoreStart" -REUSE_IGNORE_END = "REUSE-IgnoreEnd" - -SPDX_SNIPPET_INDICATOR = b"SPDX-SnippetBegin" - -_LOGGER = logging.getLogger(__name__) -_LICENSING = Licensing() # REUSE-IgnoreStart -_END_PATTERN = r"{}$".format( - "".join( - { - r"(?:{})*".format(item) # pylint: disable=consider-using-f-string - for item in chain( - ( - re.escape(style.MULTI_LINE.end) - for style in _all_style_classes() - if style.MULTI_LINE.end - ), - # These are special endings which do not belong to specific - # comment styles, but which we want to nonetheless strip away - # while parsing. - ( - ending - for ending in [ - # ex: - r'"\s*/*>', - r"'\s*/*>", - # ex: [SPDX-License-Identifier: GPL-3.0-or-later] :: - r"\]\s*::", - ] - ), - ) - } - ) -) -_LICENSE_IDENTIFIER_PATTERN = re.compile( - r"^(.*?)SPDX-License-Identifier:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE -) -_CONTRIBUTOR_PATTERN = re.compile( - r"^(.*?)SPDX-FileContributor:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE -) -# The keys match the relevant attributes of ReuseInfo. -_SPDX_TAGS: dict[str, re.Pattern] = { - "spdx_expressions": _LICENSE_IDENTIFIER_PATTERN, - "contributor_lines": _CONTRIBUTOR_PATTERN, -} - -_COPYRIGHT_PATTERNS = [ - re.compile( - r"(?P(?PSPDX-(File|Snippet)CopyrightText:" - r"(\s(\([Cc]\)|©|Copyright(\s(©|\([Cc]\)))?))?)\s+" - r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" - r"(?P.*?))" + _END_PATTERN - ), - re.compile( - r"(?P(?PCopyright(\s(\([Cc]\)|©))?)\s+" - r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" - r"(?P.*?))" + _END_PATTERN - ), - re.compile( - r"(?P(?P©)\s+" - r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" - r"(?P.*?))" + _END_PATTERN - ), -] -_COPYRIGHT_PREFIXES = { - "spdx": "SPDX-FileCopyrightText:", - "spdx-c": "SPDX-FileCopyrightText: (C)", - "spdx-string-c": "SPDX-FileCopyrightText: Copyright (C)", - "spdx-string": "SPDX-FileCopyrightText: Copyright", - "spdx-string-symbol": "SPDX-FileCopyrightText: Copyright ©", - "spdx-symbol": "SPDX-FileCopyrightText: ©", - "string": "Copyright", - "string-c": "Copyright (C)", - "string-symbol": "Copyright ©", - "symbol": "©", -} - -_LICENSEREF_PATTERN = re.compile("LicenseRef-[a-zA-Z0-9-.]+$") - -# Amount of bytes that we assume will be big enough to contain the entire -# comment header (including SPDX tags), so that we don't need to read the -# entire file. -_HEADER_BYTES = 4096 - def setup_logging(level: int = logging.WARNING) -> None: """Configure logging for reuse. @@ -191,22 +98,6 @@ def find_licenses_directory(root: Optional[StrPath] = None) -> Path: return licenses_path -def decoded_text_from_binary( - binary_file: BinaryIO, size: Optional[int] = None -) -> str: - """Given a binary file object, detect its encoding and return its contents - as a decoded string. Do not throw any errors if the encoding contains - errors: Just replace the false characters. - - If *size* is specified, only read so many bytes. - """ - if size is None: - size = -1 - rawdata = binary_file.read(size) - result = rawdata.decode("utf-8", errors="replace") - return result.replace("\r\n", "\n") - - def _determine_license_path(path: StrPath) -> Path: """Given a path FILE, return FILE.license if it exists, otherwise return FILE. @@ -225,169 +116,6 @@ def _determine_license_suffix_path(path: StrPath) -> Path: return Path(f"{path}.license") -def _parse_copyright_year(year: Optional[str]) -> list[str]: - """Parse copyright years and return list.""" - ret: list[str] = [] - if not year: - return ret - if re.match(r"\d{4}$", year): - ret = [year] - elif re.match(r"\d{4} ?- ?\d{4}$", year): - ret = [year[:4], year[-4:]] - return ret - - -def _contains_snippet(binary_file: BinaryIO) -> bool: - """Check if a file seems to contain a SPDX snippet""" - # Assumes that if SPDX_SNIPPET_INDICATOR (SPDX-SnippetBegin) is found in a - # file, the file contains a snippet - content = binary_file.read() - if SPDX_SNIPPET_INDICATOR in content: - return True - return False - - -def merge_copyright_lines(copyright_lines: set[str]) -> set[str]: - """Parse all copyright lines and merge identical statements making years - into a range. - - If a same statement uses multiple prefixes, use only the most frequent one. - """ - # pylint: disable=too-many-locals - # TODO: Rewrite this function. It's a bit of a mess. - copyright_in = [] - for line in copyright_lines: - for pattern in _COPYRIGHT_PATTERNS: - match = pattern.search(line) - if match is not None: - copyright_in.append( - { - "statement": match.groupdict()["statement"], - "year": _parse_copyright_year( - match.groupdict()["year"] - ), - "prefix": match.groupdict()["prefix"], - } - ) - break - - copyright_out = set() - for line_info in copyright_in: - statement = str(line_info["statement"]) - copyright_list = [ - item for item in copyright_in if item["statement"] == statement - ] - - # Get the most common prefix. - most_common = str( - Counter([item["prefix"] for item in copyright_list]).most_common(1)[ - 0 - ][0] - ) - prefix = "spdx" - for key, value in _COPYRIGHT_PREFIXES.items(): - if most_common == value: - prefix = key - break - - # get year range if any - years: list[str] = [] - for copy in copyright_list: - years += copy["year"] - - year: Optional[str] = None - if years: - if min(years) == max(years): - year = min(years) - else: - year = f"{min(years)} - {max(years)}" - - copyright_out.add(make_copyright_line(statement, year, prefix)) - return copyright_out - - -def extract_reuse_info(text: str) -> ReuseInfo: - """Extract REUSE information from comments in a string. - - Raises: - ExpressionError: if an SPDX expression could not be parsed. - ParseError: if an SPDX expression could not be parsed. - """ - text = filter_ignore_block(text) - spdx_tags: dict[str, set[str]] = {} - for tag, pattern in _SPDX_TAGS.items(): - spdx_tags[tag] = set(find_spdx_tag(text, pattern)) - # License expressions and copyright matches are special cases. - expressions = set() - copyright_matches = set() - for expression in spdx_tags.pop("spdx_expressions"): - try: - expressions.add(_LICENSING.parse(expression)) - except (ExpressionError, ParseError): - _LOGGER.error( - _("Could not parse '{expression}'").format( - expression=expression - ) - ) - raise - for line in text.splitlines(): - for pattern in _COPYRIGHT_PATTERNS: - match = pattern.search(line) - if match is not None: - copyright_matches.add(match.groupdict()["copyright"].strip()) - break - - return ReuseInfo( - spdx_expressions=expressions, - copyright_lines=copyright_matches, - **spdx_tags, # type: ignore - ) - - -def reuse_info_of_file( - path: StrPath, original_path: StrPath, root: StrPath -) -> ReuseInfo: - """Open *path* and return its :class:`ReuseInfo`. - - Normally only the first few :const:`_HEADER_BYTES` are read. But if a - snippet was detected, the entire file is read. - """ - path = Path(path) - with path.open("rb") as fp: - try: - read_limit: Optional[int] = _HEADER_BYTES - # Completely read the file once - # to search for possible snippets - if _contains_snippet(fp): - _LOGGER.debug(f"'{path}' seems to contain an SPDX Snippet") - read_limit = None - # Reset read position - fp.seek(0) - # Scan the file for REUSE info, possibly limiting the read - # length - file_result = extract_reuse_info( - decoded_text_from_binary(fp, size=read_limit) - ) - if file_result.contains_copyright_or_licensing(): - source_type = SourceType.FILE_HEADER - if path.suffix == ".license": - source_type = SourceType.DOT_LICENSE - return file_result.copy( - path=relative_from_root(original_path, root).as_posix(), - source_path=relative_from_root(path, root).as_posix(), - source_type=source_type, - ) - - except (ExpressionError, ParseError): - _LOGGER.error( - _( - "'{path}' holds an SPDX expression that cannot be" - " parsed, skipping the file" - ).format(path=path) - ) - return ReuseInfo() - - def relative_from_root(path: StrPath, root: StrPath) -> Path: """A helper function to get *path* relative to *root*.""" path = Path(path) @@ -397,88 +125,6 @@ def relative_from_root(path: StrPath, root: StrPath) -> Path: return Path(os.path.relpath(path, start=root)) -def find_spdx_tag(text: str, pattern: re.Pattern) -> Iterator[str]: - """Extract all the values in *text* matching *pattern*'s regex, taking care - of stripping extraneous whitespace of formatting. - """ - for prefix, value in pattern.findall(text): - prefix, value = prefix.strip(), value.strip() - - # Some comment headers have ASCII art to "frame" the comment, like this: - # - # /***********************\ - # |* This is a comment *| - # \***********************/ - # - # To ensure we parse them correctly, if the line ends with the inverse - # of the comment prefix, we strip that suffix. See #343 for a real - # world example of a project doing this (LLVM). - suffix = prefix[::-1] - if suffix and value.endswith(suffix): - value = value[: -len(suffix)] - - yield value.strip() - - -def filter_ignore_block(text: str) -> str: - """Filter out blocks beginning with REUSE_IGNORE_START and ending with - REUSE_IGNORE_END to remove lines that should not be treated as copyright and - licensing information. - """ - ignore_start = None - ignore_end = None - if REUSE_IGNORE_START in text: - ignore_start = text.index(REUSE_IGNORE_START) - if REUSE_IGNORE_END in text: - ignore_end = text.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) - if not ignore_start: - return text - if not ignore_end: - return text[:ignore_start] - if ignore_end > ignore_start: - return text[:ignore_start] + filter_ignore_block(text[ignore_end:]) - rest = text[ignore_start + len(REUSE_IGNORE_START) :] - if REUSE_IGNORE_END in rest: - ignore_end = rest.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) - return text[:ignore_start] + filter_ignore_block(rest[ignore_end:]) - return text[:ignore_start] - - -def contains_reuse_info(text: str) -> bool: - """The text contains REUSE info.""" - try: - return bool(extract_reuse_info(text)) - except (ExpressionError, ParseError): - return False - - -def make_copyright_line( - statement: str, year: Optional[str] = None, copyright_prefix: str = "spdx" -) -> str: - """Given a statement, prefix it with ``SPDX-FileCopyrightText:`` if it is - not already prefixed with some manner of copyright tag. - """ - if "\n" in statement: - raise RuntimeError(f"Unexpected newline in '{statement}'") - - prefix = _COPYRIGHT_PREFIXES.get(copyright_prefix) - if prefix is None: - # TODO: Maybe translate this. Also maybe reduce DRY here. - raise RuntimeError( - "Unexpected copyright prefix: Need 'spdx', 'spdx-c', " - "'spdx-symbol', 'string', 'string-c', " - "'string-symbol', or 'symbol'" - ) - - for pattern in _COPYRIGHT_PATTERNS: - match = pattern.search(statement) - if match is not None: - return statement - if year is not None: - return f"{prefix} {year} {statement}" - return f"{prefix} {statement}" - - def _checksum(path: StrPath) -> str: path = Path(path) @@ -490,17 +136,6 @@ def _checksum(path: StrPath) -> str: return file_sha1.hexdigest() -def detect_line_endings(text: str) -> str: - """Return one of '\n', '\r' or '\r\n' depending on the line endings used in - *text*. Return os.linesep if there are no line endings. - """ - line_endings = ["\r\n", "\r", "\n"] - for line_ending in line_endings: - if line_ending in text: - return line_ending - return os.linesep - - def cleandoc_nl(text: str) -> str: """Like :func:`inspect.cleandoc`, but with a newline at the end.""" return cleandoc(text) + "\n" diff --git a/src/reuse/cli/annotate.py b/src/reuse/cli/annotate.py index 4d3dd3904..ff40bfd01 100644 --- a/src/reuse/cli/annotate.py +++ b/src/reuse/cli/annotate.py @@ -29,12 +29,7 @@ from .. import ReuseInfo from .._annotate import add_header_to_file -from .._util import ( - _COPYRIGHT_PREFIXES, - _determine_license_path, - _determine_license_suffix_path, - make_copyright_line, -) +from .._util import _determine_license_path, _determine_license_suffix_path from ..comment import ( NAME_STYLE_MAP, CommentStyle, @@ -42,6 +37,7 @@ has_style, is_uncommentable, ) +from ..copyright import _COPYRIGHT_PREFIXES, make_copyright_line from ..i18n import _ from ..project import Project from .common import ClickObj, MutexOption, spdx_identifier diff --git a/src/reuse/cli/common.py b/src/reuse/cli/common.py index c2ce22132..0345cf24f 100644 --- a/src/reuse/cli/common.py +++ b/src/reuse/cli/common.py @@ -12,7 +12,7 @@ from boolean.boolean import Expression, ParseError from license_expression import ExpressionError -from .._util import _LICENSING +from .. import _LICENSING from ..exceptions import GlobalLicensingConflictError, GlobalLicensingParseError from ..i18n import _ from ..project import Project diff --git a/src/reuse/copyright.py b/src/reuse/copyright.py new file mode 100644 index 000000000..4f4df9ff2 --- /dev/null +++ b/src/reuse/copyright.py @@ -0,0 +1,122 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Utilities related to the parsing and storing of copyright notices.""" + +import re +from collections import Counter +from typing import Optional + +from .extract import _COPYRIGHT_PATTERNS # TODO: Get rid of this import. + +_COPYRIGHT_PREFIXES = { + "spdx": "SPDX-FileCopyrightText:", + "spdx-c": "SPDX-FileCopyrightText: (C)", + "spdx-string-c": "SPDX-FileCopyrightText: Copyright (C)", + "spdx-string": "SPDX-FileCopyrightText: Copyright", + "spdx-string-symbol": "SPDX-FileCopyrightText: Copyright ©", + "spdx-symbol": "SPDX-FileCopyrightText: ©", + "string": "Copyright", + "string-c": "Copyright (C)", + "string-symbol": "Copyright ©", + "symbol": "©", +} + + +def merge_copyright_lines(copyright_lines: set[str]) -> set[str]: + """Parse all copyright lines and merge identical statements making years + into a range. + + If a same statement uses multiple prefixes, use only the most frequent one. + """ + # pylint: disable=too-many-locals + # TODO: Rewrite this function. It's a bit of a mess. + copyright_in = [] + for line in copyright_lines: + for pattern in _COPYRIGHT_PATTERNS: + match = pattern.search(line) + if match is not None: + copyright_in.append( + { + "statement": match.groupdict()["statement"], + "year": _parse_copyright_year( + match.groupdict()["year"] + ), + "prefix": match.groupdict()["prefix"], + } + ) + break + + copyright_out = set() + for line_info in copyright_in: + statement = str(line_info["statement"]) + copyright_list = [ + item for item in copyright_in if item["statement"] == statement + ] + + # Get the most common prefix. + most_common = str( + Counter([item["prefix"] for item in copyright_list]).most_common(1)[ + 0 + ][0] + ) + prefix = "spdx" + for key, value in _COPYRIGHT_PREFIXES.items(): + if most_common == value: + prefix = key + break + + # get year range if any + years: list[str] = [] + for copy in copyright_list: + years += copy["year"] + + year: Optional[str] = None + if years: + if min(years) == max(years): + year = min(years) + else: + year = f"{min(years)} - {max(years)}" + + copyright_out.add(make_copyright_line(statement, year, prefix)) + return copyright_out + + +def make_copyright_line( + statement: str, year: Optional[str] = None, copyright_prefix: str = "spdx" +) -> str: + """Given a statement, prefix it with ``SPDX-FileCopyrightText:`` if it is + not already prefixed with some manner of copyright tag. + """ + if "\n" in statement: + raise RuntimeError(f"Unexpected newline in '{statement}'") + + prefix = _COPYRIGHT_PREFIXES.get(copyright_prefix) + if prefix is None: + # TODO: Maybe translate this. Also maybe reduce DRY here. + raise RuntimeError( + "Unexpected copyright prefix: Need 'spdx', 'spdx-c', " + "'spdx-symbol', 'string', 'string-c', " + "'string-symbol', or 'symbol'" + ) + + for pattern in _COPYRIGHT_PATTERNS: + match = pattern.search(statement) + if match is not None: + return statement + if year is not None: + return f"{prefix} {year} {statement}" + return f"{prefix} {statement}" + + +def _parse_copyright_year(year: Optional[str]) -> list[str]: + """Parse copyright years and return list.""" + ret: list[str] = [] + if not year: + return ret + if re.match(r"\d{4}$", year): + ret = [year] + elif re.match(r"\d{4} ?- ?\d{4}$", year): + ret = [year[:4], year[-4:]] + return ret diff --git a/src/reuse/download.py b/src/reuse/download.py index 06ef1c944..677a0d094 100644 --- a/src/reuse/download.py +++ b/src/reuse/download.py @@ -15,7 +15,8 @@ from urllib.error import URLError from urllib.parse import urljoin -from ._util import _LICENSEREF_PATTERN, find_licenses_directory +from ._util import find_licenses_directory +from .extract import _LICENSEREF_PATTERN from .project import Project from .types import StrPath from .vcs import VCSStrategyNone diff --git a/src/reuse/extract.py b/src/reuse/extract.py new file mode 100644 index 000000000..34bcd0faf --- /dev/null +++ b/src/reuse/extract.py @@ -0,0 +1,282 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2020 Tuomas Siipola +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Nico Rikken +# SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2023 DB Systel GmbH +# SPDX-FileCopyrightText: 2023 Johannes Zarl-Zierl +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: 2024 Skyler Grey +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Utilities related to the extraction of REUSE information out of files.""" + +import logging +import os +import re +from itertools import chain +from pathlib import Path +from typing import BinaryIO, Iterator, Optional + +from boolean.boolean import ParseError +from license_expression import ExpressionError + +from . import _LICENSING, ReuseInfo, SourceType +from ._util import relative_from_root +from .comment import _all_style_classes +from .i18n import _ +from .types import StrPath + +REUSE_IGNORE_START = "REUSE-IgnoreStart" +REUSE_IGNORE_END = "REUSE-IgnoreEnd" + +# REUSE-IgnoreStart + +SPDX_SNIPPET_INDICATOR = b"SPDX-SnippetBegin" + +_LOGGER = logging.getLogger(__name__) + +_END_PATTERN = r"{}$".format( + "".join( + { + r"(?:{})*".format(item) # pylint: disable=consider-using-f-string + for item in chain( + ( + re.escape(style.MULTI_LINE.end) + for style in _all_style_classes() + if style.MULTI_LINE.end + ), + # These are special endings which do not belong to specific + # comment styles, but which we want to nonetheless strip away + # while parsing. + ( + ending + for ending in [ + # ex: + r'"\s*/*>', + r"'\s*/*>", + # ex: [SPDX-License-Identifier: GPL-3.0-or-later] :: + r"\]\s*::", + ] + ), + ) + } + ) +) +_LICENSE_IDENTIFIER_PATTERN = re.compile( + r"^(.*?)SPDX-License-Identifier:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE +) +_CONTRIBUTOR_PATTERN = re.compile( + r"^(.*?)SPDX-FileContributor:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE +) +# The keys match the relevant attributes of ReuseInfo. +_SPDX_TAGS: dict[str, re.Pattern] = { + "spdx_expressions": _LICENSE_IDENTIFIER_PATTERN, + "contributor_lines": _CONTRIBUTOR_PATTERN, +} + +_COPYRIGHT_PATTERNS = [ + re.compile( + r"(?P(?PSPDX-(File|Snippet)CopyrightText:" + r"(\s(\([Cc]\)|©|Copyright(\s(©|\([Cc]\)))?))?)\s+" + r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" + r"(?P.*?))" + _END_PATTERN + ), + re.compile( + r"(?P(?PCopyright(\s(\([Cc]\)|©))?)\s+" + r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" + r"(?P.*?))" + _END_PATTERN + ), + re.compile( + r"(?P(?P©)\s+" + r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" + r"(?P.*?))" + _END_PATTERN + ), +] + +_LICENSEREF_PATTERN = re.compile("LicenseRef-[a-zA-Z0-9-.]+$") + +# Amount of bytes that we assume will be big enough to contain the entire +# comment header (including SPDX tags), so that we don't need to read the +# entire file. +_HEADER_BYTES = 4096 + + +def decoded_text_from_binary( + binary_file: BinaryIO, size: Optional[int] = None +) -> str: + """Given a binary file object, detect its encoding and return its contents + as a decoded string. Do not throw any errors if the encoding contains + errors: Just replace the false characters. + + If *size* is specified, only read so many bytes. + """ + if size is None: + size = -1 + rawdata = binary_file.read(size) + result = rawdata.decode("utf-8", errors="replace") + return result.replace("\r\n", "\n") + + +def _contains_snippet(binary_file: BinaryIO) -> bool: + """Check if a file seems to contain a SPDX snippet""" + # Assumes that if SPDX_SNIPPET_INDICATOR (SPDX-SnippetBegin) is found in a + # file, the file contains a snippet + content = binary_file.read() + if SPDX_SNIPPET_INDICATOR in content: + return True + return False + + +def extract_reuse_info(text: str) -> ReuseInfo: + """Extract REUSE information from comments in a string. + + Raises: + ExpressionError: if an SPDX expression could not be parsed. + ParseError: if an SPDX expression could not be parsed. + """ + text = filter_ignore_block(text) + spdx_tags: dict[str, set[str]] = {} + for tag, pattern in _SPDX_TAGS.items(): + spdx_tags[tag] = set(find_spdx_tag(text, pattern)) + # License expressions and copyright matches are special cases. + expressions = set() + copyright_matches = set() + for expression in spdx_tags.pop("spdx_expressions"): + try: + expressions.add(_LICENSING.parse(expression)) + except (ExpressionError, ParseError): + _LOGGER.error( + _("Could not parse '{expression}'").format( + expression=expression + ) + ) + raise + for line in text.splitlines(): + for pattern in _COPYRIGHT_PATTERNS: + match = pattern.search(line) + if match is not None: + copyright_matches.add(match.groupdict()["copyright"].strip()) + break + + return ReuseInfo( + spdx_expressions=expressions, + copyright_lines=copyright_matches, + **spdx_tags, # type: ignore + ) + + +def reuse_info_of_file( + path: StrPath, original_path: StrPath, root: StrPath +) -> ReuseInfo: + """Open *path* and return its :class:`ReuseInfo`. + + Normally only the first few :const:`_HEADER_BYTES` are read. But if a + snippet was detected, the entire file is read. + """ + path = Path(path) + with path.open("rb") as fp: + try: + read_limit: Optional[int] = _HEADER_BYTES + # Completely read the file once + # to search for possible snippets + if _contains_snippet(fp): + _LOGGER.debug(f"'{path}' seems to contain an SPDX Snippet") + read_limit = None + # Reset read position + fp.seek(0) + # Scan the file for REUSE info, possibly limiting the read + # length + file_result = extract_reuse_info( + decoded_text_from_binary(fp, size=read_limit) + ) + if file_result.contains_copyright_or_licensing(): + source_type = SourceType.FILE_HEADER + if path.suffix == ".license": + source_type = SourceType.DOT_LICENSE + return file_result.copy( + path=relative_from_root(original_path, root).as_posix(), + source_path=relative_from_root(path, root).as_posix(), + source_type=source_type, + ) + + except (ExpressionError, ParseError): + _LOGGER.error( + _( + "'{path}' holds an SPDX expression that cannot be" + " parsed, skipping the file" + ).format(path=path) + ) + return ReuseInfo() + + +def find_spdx_tag(text: str, pattern: re.Pattern) -> Iterator[str]: + """Extract all the values in *text* matching *pattern*'s regex, taking care + of stripping extraneous whitespace of formatting. + """ + for prefix, value in pattern.findall(text): + prefix, value = prefix.strip(), value.strip() + + # Some comment headers have ASCII art to "frame" the comment, like this: + # + # /***********************\ + # |* This is a comment *| + # \***********************/ + # + # To ensure we parse them correctly, if the line ends with the inverse + # of the comment prefix, we strip that suffix. See #343 for a real + # world example of a project doing this (LLVM). + suffix = prefix[::-1] + if suffix and value.endswith(suffix): + value = value[: -len(suffix)] + + yield value.strip() + + +def filter_ignore_block(text: str) -> str: + """Filter out blocks beginning with REUSE_IGNORE_START and ending with + REUSE_IGNORE_END to remove lines that should not be treated as copyright and + licensing information. + """ + ignore_start = None + ignore_end = None + if REUSE_IGNORE_START in text: + ignore_start = text.index(REUSE_IGNORE_START) + if REUSE_IGNORE_END in text: + ignore_end = text.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) + if not ignore_start: + return text + if not ignore_end: + return text[:ignore_start] + if ignore_end > ignore_start: + return text[:ignore_start] + filter_ignore_block(text[ignore_end:]) + rest = text[ignore_start + len(REUSE_IGNORE_START) :] + if REUSE_IGNORE_END in rest: + ignore_end = rest.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) + return text[:ignore_start] + filter_ignore_block(rest[ignore_end:]) + return text[:ignore_start] + + +def contains_reuse_info(text: str) -> bool: + """The text contains REUSE info.""" + try: + return bool(extract_reuse_info(text)) + except (ExpressionError, ParseError): + return False + + +def detect_line_endings(text: str) -> str: + """Return one of '\n', '\r' or '\r\n' depending on the line endings used in + *text*. Return os.linesep if there are no line endings. + """ + line_endings = ["\r\n", "\r", "\n"] + for line_ending in line_endings: + if line_ending in text: + return line_ending + return os.linesep + + +# REUSE-IgnoreEnd diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py index bacc8f92a..c8ad9cf1e 100644 --- a/src/reuse/global_licensing.py +++ b/src/reuse/global_licensing.py @@ -33,8 +33,7 @@ from debian.copyright import Error as DebianError from license_expression import ExpressionError -from . import ReuseInfo, SourceType -from ._util import _LICENSING +from . import _LICENSING, ReuseInfo, SourceType from .covered_files import iter_files from .exceptions import ( GlobalLicensingParseError, diff --git a/src/reuse/header.py b/src/reuse/header.py index 6000d9a84..0538155a3 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -23,17 +23,14 @@ from license_expression import ExpressionError from . import ReuseInfo -from ._util import ( - contains_reuse_info, - extract_reuse_info, - merge_copyright_lines, -) from .comment import CommentStyle, EmptyCommentStyle, PythonCommentStyle +from .copyright import merge_copyright_lines from .exceptions import ( CommentCreateError, CommentParseError, MissingReuseInfoError, ) +from .extract import contains_reuse_info, extract_reuse_info from .i18n import _ _LOGGER = logging.getLogger(__name__) diff --git a/src/reuse/project.py b/src/reuse/project.py index cf6ca24d5..4b7425f5b 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -23,17 +23,13 @@ from . import ReuseInfo from ._licenses import EXCEPTION_MAP, LICENSE_MAP -from ._util import ( - _LICENSEREF_PATTERN, - _determine_license_path, - relative_from_root, - reuse_info_of_file, -) +from ._util import _determine_license_path, relative_from_root from .covered_files import iter_files from .exceptions import ( GlobalLicensingConflictError, SpdxIdentifierNotFoundError, ) +from .extract import _LICENSEREF_PATTERN, reuse_info_of_file from .global_licensing import ( GlobalLicensing, NestedReuseTOML, diff --git a/src/reuse/report.py b/src/reuse/report.py index dd2a0355a..4277a9cec 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -31,8 +31,9 @@ ) from uuid import uuid4 -from . import __REUSE_version__, __version__ -from ._util import _LICENSEREF_PATTERN, _LICENSING, _checksum +from . import _LICENSING, __REUSE_version__, __version__ +from ._util import _checksum +from .extract import _LICENSEREF_PATTERN from .global_licensing import ReuseDep5 from .i18n import _ from .project import Project, ReuseInfo diff --git a/tests/test_cli_annotate.py b/tests/test_cli_annotate.py index 4aecfd85e..0326af280 100644 --- a/tests/test_cli_annotate.py +++ b/tests/test_cli_annotate.py @@ -17,8 +17,8 @@ import pytest from click.testing import CliRunner -from reuse._util import _COPYRIGHT_PREFIXES from reuse.cli.main import main +from reuse.copyright import _COPYRIGHT_PREFIXES # pylint: disable=too-many-public-methods,too-many-lines,unused-argument diff --git a/tests/test_copyright.py b/tests/test_copyright.py new file mode 100644 index 000000000..662b5ecb5 --- /dev/null +++ b/tests/test_copyright.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Nico Rikken +# SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for reuse.copyright""" + +import pytest + +from reuse.copyright import make_copyright_line + +# REUSE-IgnoreStart + + +def test_make_copyright_line_simple(): + """Given a simple statement, make it a copyright line.""" + assert make_copyright_line("hello") == "SPDX-FileCopyrightText: hello" + + +def test_make_copyright_line_year(): + """Given a simple statement and a year, make it a copyright line.""" + assert ( + make_copyright_line("hello", year="2019") + == "SPDX-FileCopyrightText: 2019 hello" + ) + + +def test_make_copyright_line_prefix_spdx(): + """Given a simple statement and prefix, make it a copyright line.""" + statement = make_copyright_line("hello", copyright_prefix="spdx") + assert statement == "SPDX-FileCopyrightText: hello" + + +def test_make_copyright_line_prefix_spdx_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line("hello", year=2019, copyright_prefix="spdx") + assert statement == "SPDX-FileCopyrightText: 2019 hello" + + +def test_make_copyright_line_prefix_spdx_c_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="spdx-c" + ) + assert statement == "SPDX-FileCopyrightText: (C) 2019 hello" + + +def test_make_copyright_line_prefix_spdx_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="spdx-symbol" + ) + assert statement == "SPDX-FileCopyrightText: © 2019 hello" + + +def test_make_copyright_line_prefix_string_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="string" + ) + assert statement == "Copyright 2019 hello" + + +def test_make_copyright_line_prefix_string_c_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="string-c" + ) + assert statement == "Copyright (C) 2019 hello" + + +def test_make_copyright_line_prefix_spdx_string_c_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="spdx-string-c" + ) + assert statement == "SPDX-FileCopyrightText: Copyright (C) 2019 hello" + + +def test_make_copyright_line_prefix_spdx_string_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="spdx-string" + ) + assert statement == "SPDX-FileCopyrightText: Copyright 2019 hello" + + +def test_make_copyright_line_prefix_spdx_string_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="spdx-string-symbol" + ) + assert statement == "SPDX-FileCopyrightText: Copyright © 2019 hello" + + +def test_make_copyright_line_prefix_string_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="string-symbol" + ) + assert statement == "Copyright © 2019 hello" + + +def test_make_copyright_line_prefix_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" + statement = make_copyright_line( + "hello", year=2019, copyright_prefix="symbol" + ) + assert statement == "© 2019 hello" + + +def test_make_copyright_line_existing_spdx_copyright(): + """Given a copyright line, do nothing.""" + value = "SPDX-FileCopyrightText: hello" + assert make_copyright_line(value) == value + + +def test_make_copyright_line_existing_other_copyright(): + """Given a non-SPDX copyright line, do nothing.""" + value = "© hello" + assert make_copyright_line(value) == value + + +def test_make_copyright_line_multine_error(): + """Given a multiline argument, expect an error.""" + with pytest.raises(RuntimeError): + make_copyright_line("hello\nworld") + + +# REUSE-IgnoreEnd diff --git a/tests/test_util.py b/tests/test_extract.py similarity index 62% rename from tests/test_util.py rename to tests/test_extract.py index e26445fe8..46bcad68e 100644 --- a/tests/test_util.py +++ b/tests/test_extract.py @@ -8,7 +8,7 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -"""Tests for reuse._util""" +"""Tests for reuse.extract""" import os from inspect import cleandoc @@ -17,8 +17,13 @@ import pytest from boolean.boolean import ParseError -from reuse import _util -from reuse._util import _LICENSING +from reuse import _LICENSING, ReuseInfo +from reuse.extract import ( + decoded_text_from_binary, + detect_line_endings, + extract_reuse_info, + filter_ignore_block, +) # REUSE-IgnoreStart @@ -27,15 +32,13 @@ def test_extract_expression(): """Parse various expressions.""" expressions = ["GPL-3.0+", "GPL-3.0 AND CC0-1.0", "nonsense"] for expression in expressions: - result = _util.extract_reuse_info( - f"SPDX-License-Identifier: {expression}" - ) + result = extract_reuse_info(f"SPDX-License-Identifier: {expression}") assert result.spdx_expressions == {_LICENSING.parse(expression)} def test_extract_expression_from_ascii_art_frame(): """Parse an expression from an ASCII art frame""" - result = _util.extract_reuse_info( + result = extract_reuse_info( cleandoc( """ /**********************************\\ @@ -51,20 +54,20 @@ def test_extract_erroneous_expression(): """Parse an incorrect expression.""" expression = "SPDX-License-Identifier: GPL-3.0-or-later AND (MIT OR)" with pytest.raises(ParseError): - _util.extract_reuse_info(expression) + extract_reuse_info(expression) def test_extract_no_info(): """Given a string without REUSE information, return an empty ReuseInfo object. """ - result = _util.extract_reuse_info("") - assert result == _util.ReuseInfo() + result = extract_reuse_info("") + assert result == ReuseInfo() def test_extract_tab(): """A tag followed by a tab is also valid.""" - result = _util.extract_reuse_info("SPDX-License-Identifier:\tMIT") + result = extract_reuse_info("SPDX-License-Identifier:\tMIT") assert result.spdx_expressions == {_LICENSING.parse("MIT")} @@ -72,14 +75,14 @@ def test_extract_many_whitespace(): """When a tag is followed by a lot of whitespace, the whitespace should be filtered out. """ - result = _util.extract_reuse_info("SPDX-License-Identifier: MIT") + result = extract_reuse_info("SPDX-License-Identifier: MIT") assert result.spdx_expressions == {_LICENSING.parse("MIT")} def test_extract_bibtex_comment(): """A special case for BibTex comments.""" expression = "@Comment{SPDX-License-Identifier: GPL-3.0-or-later}" - result = _util.extract_reuse_info(expression) + result = extract_reuse_info(expression) assert str(list(result.spdx_expressions)[0]) == "GPL-3.0-or-later" @@ -88,23 +91,21 @@ def test_extract_copyright(): information. """ copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" - result = _util.extract_reuse_info(copyright_line) + result = extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} def test_extract_copyright_duplicate(): """When a copyright line is duplicated, only yield one.""" copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" - result = _util.extract_reuse_info( - "\n".join((copyright_line, copyright_line)) - ) + result = extract_reuse_info("\n".join((copyright_line, copyright_line))) assert result.copyright_lines == {copyright_line} def test_extract_copyright_tab(): """A tag followed by a tab is also valid.""" copyright_line = "SPDX-FileCopyrightText:\t2019 Jane Doe" - result = _util.extract_reuse_info(copyright_line) + result = extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} @@ -113,7 +114,7 @@ def test_extract_copyright_many_whitespace(): whitespace is not filtered out. """ copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" - result = _util.extract_reuse_info(copyright_line) + result = extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} @@ -133,7 +134,7 @@ def test_extract_copyright_variations(): """ ) - result = _util.extract_reuse_info(text) + result = extract_reuse_info(text) lines = text.splitlines() for line in lines: assert line in result.copyright_lines @@ -155,7 +156,7 @@ def test_extract_with_ignore_block(): SPDX-FileCopyrightText: 2019 Eve """ ) - result = _util.extract_reuse_info(text) + result = extract_reuse_info(text) assert len(result.copyright_lines) == 2 assert len(result.spdx_expressions) == 1 @@ -165,7 +166,7 @@ def test_extract_sameline_multiline(): do not include the comment end pattern as part of the copyright. """ text = "" - result = _util.extract_reuse_info(text) + result = extract_reuse_info(text) assert len(result.copyright_lines) == 1 assert result.copyright_lines == {"SPDX-FileCopyrightText: Jane Doe"} @@ -185,7 +186,7 @@ def test_extract_special_endings(): [Copyright 2019 Ajnulo] :: """ ) - result = _util.extract_reuse_info(text) + result = extract_reuse_info(text) for item in result.copyright_lines: assert ">" not in item assert "] ::" not in item @@ -198,7 +199,7 @@ def test_extract_contributors(): # SPDX-FileContributor: Jane Doe """ ) - result = _util.extract_reuse_info(text) + result = extract_reuse_info(text) assert result.contributor_lines == {"Jane Doe"} @@ -217,7 +218,7 @@ def test_filter_ignore_block_with_comment_style(): ) expected = "Relevant text\n# \nOther relevant text" - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -242,7 +243,7 @@ def test_filter_ignore_block_non_comment_style(): """ ) - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -267,7 +268,7 @@ def test_filter_ignore_block_with_ignored_information_on_same_line(): """ ) - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -284,7 +285,7 @@ def test_filter_ignore_block_with_relevant_information_on_same_line(): ) expected = "Relevant textOther relevant text" - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -305,7 +306,7 @@ def test_filter_ignore_block_with_beginning_and_end_on_same_line_correct_order() """ ) - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -316,7 +317,7 @@ def test_filter_ignore_block_with_beginning_and_end_on_same_line_wrong_order(): text = "Relevant textREUSE-IgnoreEndOther relevant textREUSE-IgnoreStartIgnored text" # pylint: disable=line-too-long expected = "Relevant textREUSE-IgnoreEndOther relevant text" - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -334,7 +335,7 @@ def test_filter_ignore_block_without_end(): ) expected = "Relevant text\n" - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected @@ -365,166 +366,49 @@ def test_filter_ignore_block_with_multiple_ignore_blocks(): """ ) - result = _util.filter_ignore_block(text) + result = filter_ignore_block(text) assert result == expected -def test_make_copyright_line_simple(): - """Given a simple statement, make it a copyright line.""" - assert _util.make_copyright_line("hello") == "SPDX-FileCopyrightText: hello" - - -def test_make_copyright_line_year(): - """Given a simple statement and a year, make it a copyright line.""" - assert ( - _util.make_copyright_line("hello", year="2019") - == "SPDX-FileCopyrightText: 2019 hello" - ) - - -def test_make_copyright_line_prefix_spdx(): - """Given a simple statement and prefix, make it a copyright line.""" - statement = _util.make_copyright_line("hello", copyright_prefix="spdx") - assert statement == "SPDX-FileCopyrightText: hello" - - -def test_make_copyright_line_prefix_spdx_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx" - ) - assert statement == "SPDX-FileCopyrightText: 2019 hello" - - -def test_make_copyright_line_prefix_spdx_c_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx-c" - ) - assert statement == "SPDX-FileCopyrightText: (C) 2019 hello" - - -def test_make_copyright_line_prefix_spdx_symbol_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx-symbol" - ) - assert statement == "SPDX-FileCopyrightText: © 2019 hello" - - -def test_make_copyright_line_prefix_string_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="string" - ) - assert statement == "Copyright 2019 hello" - - -def test_make_copyright_line_prefix_string_c_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="string-c" - ) - assert statement == "Copyright (C) 2019 hello" - - -def test_make_copyright_line_prefix_spdx_string_c_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx-string-c" - ) - assert statement == "SPDX-FileCopyrightText: Copyright (C) 2019 hello" - - -def test_make_copyright_line_prefix_spdx_string_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx-string" - ) - assert statement == "SPDX-FileCopyrightText: Copyright 2019 hello" - - -def test_make_copyright_line_prefix_spdx_string_symbol_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="spdx-string-symbol" - ) - assert statement == "SPDX-FileCopyrightText: Copyright © 2019 hello" - - -def test_make_copyright_line_prefix_string_symbol_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="string-symbol" - ) - assert statement == "Copyright © 2019 hello" - - -def test_make_copyright_line_prefix_symbol_year(): - """Given a simple statement, prefix and a year, make it a copyright line.""" - statement = _util.make_copyright_line( - "hello", year=2019, copyright_prefix="symbol" - ) - assert statement == "© 2019 hello" - - -def test_make_copyright_line_existing_spdx_copyright(): - """Given a copyright line, do nothing.""" - value = "SPDX-FileCopyrightText: hello" - assert _util.make_copyright_line(value) == value - - -def test_make_copyright_line_existing_other_copyright(): - """Given a non-SPDX copyright line, do nothing.""" - value = "© hello" - assert _util.make_copyright_line(value) == value - - -def test_make_copyright_line_multine_error(): - """Given a multiline argument, expect an error.""" - with pytest.raises(RuntimeError): - _util.make_copyright_line("hello\nworld") - - def test_decoded_text_from_binary_simple(): """A unicode string encoded as bytes object decodes back correctly.""" text = "Hello, world ☺" encoded = text.encode("utf-8") - assert _util.decoded_text_from_binary(BytesIO(encoded)) == text + assert decoded_text_from_binary(BytesIO(encoded)) == text def test_decoded_text_from_binary_size(): """Only a given amount of bytes is decoded.""" text = "Hello, world ☺" encoded = text.encode("utf-8") - assert _util.decoded_text_from_binary(BytesIO(encoded), size=5) == "Hello" + assert decoded_text_from_binary(BytesIO(encoded), size=5) == "Hello" def test_decoded_text_from_binary_crlf(): """Given CRLF line endings, convert to LF.""" text = "Hello\r\nworld" encoded = text.encode("utf-8") - assert _util.decoded_text_from_binary(BytesIO(encoded)) == "Hello\nworld" + assert decoded_text_from_binary(BytesIO(encoded)) == "Hello\nworld" def test_detect_line_endings_windows(): """Given a CRLF string, detect the line endings.""" - assert _util.detect_line_endings("hello\r\nworld") == "\r\n" + assert detect_line_endings("hello\r\nworld") == "\r\n" def test_detect_line_endings_mac(): """Given a CR string, detect the line endings.""" - assert _util.detect_line_endings("hello\rworld") == "\r" + assert detect_line_endings("hello\rworld") == "\r" def test_detect_line_endings_linux(): """Given a LF string, detect the line endings.""" - assert _util.detect_line_endings("hello\nworld") == "\n" + assert detect_line_endings("hello\nworld") == "\n" def test_detect_line_endings_no_newlines(): """Given a file without line endings, default to os.linesep.""" - assert _util.detect_line_endings("hello world") == os.linesep + assert detect_line_endings("hello world") == os.linesep -# REUSE-IgnoreEnd +# Reuse-IgnoreEnd diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py index 62a69557a..1b7385381 100644 --- a/tests/test_global_licensing.py +++ b/tests/test_global_licensing.py @@ -13,8 +13,7 @@ from debian.copyright import Copyright from license_expression import LicenseSymbol -from reuse import ReuseInfo, SourceType -from reuse._util import _LICENSING +from reuse import _LICENSING, ReuseInfo, SourceType from reuse.exceptions import ( GlobalLicensingParseError, GlobalLicensingParseTypeError, diff --git a/tests/test_project.py b/tests/test_project.py index 448a2bf79..3606816d3 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -19,8 +19,7 @@ from conftest import RESOURCES_DIRECTORY from license_expression import LicenseSymbol -from reuse import ReuseInfo, SourceType -from reuse._util import _LICENSING +from reuse import _LICENSING, ReuseInfo, SourceType from reuse.covered_files import iter_files from reuse.exceptions import ( GlobalLicensingConflictError, From 9f9f4136052df6dacec108432b645fc54ca655ce Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 10:52:46 +0200 Subject: [PATCH 113/156] Refactor VCS paths out of _util into vcs Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_util.py | 7 ------- src/reuse/vcs.py | 15 +++++++-------- tests/conftest.py | 13 ++----------- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index fc91d76e7..af226cf1d 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -16,7 +16,6 @@ import logging import os -import shutil import subprocess from hashlib import sha1 from inspect import cleandoc @@ -25,12 +24,6 @@ from .types import StrPath -GIT_EXE = shutil.which("git") -HG_EXE = shutil.which("hg") -JUJUTSU_EXE = shutil.which("jj") -PIJUL_EXE = shutil.which("pijul") - - # REUSE-IgnoreStart diff --git a/src/reuse/vcs.py b/src/reuse/vcs.py index 135c91393..8c1cb5c8e 100644 --- a/src/reuse/vcs.py +++ b/src/reuse/vcs.py @@ -12,19 +12,13 @@ import logging import os +import shutil from abc import ABC, abstractmethod from inspect import isclass from pathlib import Path from typing import TYPE_CHECKING, Generator, Optional, Type -from ._util import ( - GIT_EXE, - HG_EXE, - JUJUTSU_EXE, - PIJUL_EXE, - execute_command, - relative_from_root, -) +from ._util import execute_command, relative_from_root from .types import StrPath if TYPE_CHECKING: @@ -32,6 +26,11 @@ _LOGGER = logging.getLogger(__name__) +GIT_EXE = shutil.which("git") +HG_EXE = shutil.which("hg") +JUJUTSU_EXE = shutil.which("jj") +PIJUL_EXE = shutil.which("pijul") + class VCSStrategy(ABC): """Strategy pattern for version control systems.""" diff --git a/tests/conftest.py b/tests/conftest.py index 075a5fe4d..929533075 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -39,14 +39,9 @@ except ImportError: sys.path.append(os.path.join(Path(__file__).parent.parent, "src")) finally: - from reuse._util import ( - GIT_EXE, - HG_EXE, - JUJUTSU_EXE, - PIJUL_EXE, - setup_logging, - ) + from reuse._util import setup_logging from reuse.global_licensing import ReuseDep5 + from reuse.vcs import GIT_EXE, HG_EXE, JUJUTSU_EXE, PIJUL_EXE CWD = Path.cwd() @@ -117,7 +112,6 @@ def optional_git_exe( """Run the test with or without git.""" exe = GIT_EXE if request.param else "" monkeypatch.setattr("reuse.vcs.GIT_EXE", exe) - monkeypatch.setattr("reuse._util.GIT_EXE", exe) yield exe @@ -136,7 +130,6 @@ def optional_hg_exe( """Run the test with or without mercurial.""" exe = HG_EXE if request.param else "" monkeypatch.setattr("reuse.vcs.HG_EXE", exe) - monkeypatch.setattr("reuse._util.HG_EXE", exe) yield exe @@ -155,7 +148,6 @@ def optional_jujutsu_exe( """Run the test with or without Jujutsu.""" exe = JUJUTSU_EXE if request.param else "" monkeypatch.setattr("reuse.vcs.JUJUTSU_EXE", exe) - monkeypatch.setattr("reuse._util.JUJUTSU_EXE", exe) yield exe @@ -174,7 +166,6 @@ def optional_pijul_exe( """Run the test with or without Pijul.""" exe = PIJUL_EXE if request.param else "" monkeypatch.setattr("reuse.vcs.PIJUL_EXE", exe) - monkeypatch.setattr("reuse._util.PIJUL_EXE", exe) yield exe From dfe2dc840db05a1f2b4e0a0226d2c721e152c810 Mon Sep 17 00:00:00 2001 From: fsfe-system <> Date: Thu, 24 Oct 2024 08:57:57 +0000 Subject: [PATCH 114/156] Update reuse.pot --- po/cs.po | 75 +++++++++++++++++++++++++++------------------------- po/de.po | 66 ++++++++++++++++++++++----------------------- po/eo.po | 66 ++++++++++++++++++++++----------------------- po/es.po | 66 ++++++++++++++++++++++----------------------- po/fr.po | 66 ++++++++++++++++++++++----------------------- po/gl.po | 66 ++++++++++++++++++++++----------------------- po/it.po | 66 ++++++++++++++++++++++----------------------- po/nl.po | 66 ++++++++++++++++++++++----------------------- po/pt.po | 66 ++++++++++++++++++++++----------------------- po/reuse.pot | 68 +++++++++++++++++++++++------------------------ po/ru.po | 66 ++++++++++++++++++++++----------------------- po/sv.po | 66 ++++++++++++++++++++++----------------------- po/tr.po | 66 ++++++++++++++++++++++----------------------- po/uk.po | 66 ++++++++++++++++++++++----------------------- 14 files changed, 469 insertions(+), 466 deletions(-) diff --git a/po/cs.po b/po/cs.po index ae0ca09d9..c8b4349bb 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: 2024-10-18 20:15+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech =2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.8-rc\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "Je vyžadována možnost „--copyright“, „--licence“ nebo „--contributor“." -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" @@ -34,7 +34,7 @@ msgstr "" "style“, „--force-dot-license“, „--fallback-dot-license“ nebo „--skip-" "unrecognised“:" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" @@ -43,7 +43,7 @@ msgstr "" "'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" "line." -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" @@ -51,16 +51,16 @@ msgid "" msgstr "" "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte prosím --multi-line." -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, python-brace-format msgid "Template '{template}' could not be found." msgstr "Šablonu {template} se nepodařilo najít." -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 msgid "Add copyright and licensing into the headers of files." msgstr "Přidání autorských práv a licencí do záhlaví souborů." -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." @@ -68,7 +68,7 @@ msgstr "" "Pomocí --copyright a --license můžete určit, které držitele autorských práv " "a licence přidat do záhlaví daných souborů." -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." @@ -77,106 +77,106 @@ msgstr "" "nejsou držiteli autorských práv k daným souborům." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "COPYRIGHT" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 msgid "Copyright statement, repeatable." msgstr "Prohlášení o autorských právech, opakovatelné." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "SPDX_IDENTIFIER" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 msgid "SPDX License Identifier, repeatable." msgstr "Identifikátor licence SPDX, opakovatelný." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "PŘISPĚVATEL" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 msgid "File contributor, repeatable." msgstr "Přispěvatel souboru, opakovatelný." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "ROK" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 msgid "Year of copyright statement." msgstr "Rok prohlášení o autorských právech." -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 msgid "Comment style to use." msgstr "Styl komentáře k použití." -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 msgid "Copyright prefix to use." msgstr "Předpona autorských práv k užití." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "ŠABLONA" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 msgid "Name of template to use." msgstr "Název šablony, která se má použít." -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 msgid "Do not include year in copyright statement." msgstr "V prohlášení o autorských právech neuvádějte rok." -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 msgid "Merge copyright lines if copyright statements are identical." msgstr "" "Slučte řádky s autorskými právy, pokud jsou prohlášení o autorských právech " "totožná." -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 msgid "Force single-line comment style." msgstr "Vyžadujte jednořádkový styl komentáře." -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 msgid "Force multi-line comment style." msgstr "Vyžadujte víceřádkový styl komentáře." -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 msgid "Add headers to all files under specified directories recursively." msgstr "Rekurzivně přidejte hlavičky ke všem souborům v zadaných adresářích." -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 msgid "Do not replace the first header in the file; just add a new one." msgstr "První záhlaví v souboru nenahrazujte, pouze přidejte nové." -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 msgid "Always write a .license file instead of a header inside the file." msgstr "Místo hlavičky uvnitř souboru vždy napište soubor .license." -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 msgid "Write a .license file to files with unrecognised comment styles." msgstr "Zapište soubor .license do souborů s nerozpoznanými styly komentářů." -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 msgid "Skip files with unrecognised comment styles." msgstr "Přeskočte soubory s nerozpoznanými styly komentářů." -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 msgid "Skip files that already contain REUSE information." msgstr "Přeskočte soubory, které již obsahují informace REUSE." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "CESTA" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" @@ -811,9 +811,12 @@ msgstr "{name} {filename!r} není spustitelný." #, python-brace-format msgid "{len_type} values are required, but {len_value} was given." msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "Hodnoty {len_type} jsou povinné, ale byla zadána {len_value} hodnota." -msgstr[1] "Hodnoty {len_type} jsou povinné, ale byly zadány {len_value} hodnoty." -msgstr[2] "Hodnoty {len_type} jsou povinné, ale bylo zadáno {len_value} hodnot." +msgstr[0] "" +"Hodnoty {len_type} jsou povinné, ale byla zadána {len_value} hodnota." +msgstr[1] "" +"Hodnoty {len_type} jsou povinné, ale byly zadány {len_value} hodnoty." +msgstr[2] "" +"Hodnoty {len_type} jsou povinné, ale bylo zadáno {len_value} hodnot." #, python-brace-format #~ msgid "Skipped unrecognised file '{path}'" diff --git a/po/de.po b/po/de.po index 6f80058fc..f7493fe88 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: 2024-07-08 08:43+0000\n" "Last-Translator: stexandev \n" "Language-Team: German \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: French 1;\n" "X-Generator: Weblate 5.7-dev\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 #, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "une des options --contributor, --copyright ou --license est nécessaire" -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" @@ -33,7 +33,7 @@ msgstr "" "Les fichiers suivants n'ont pas une extension reconnue. Merci d'utiliser --" "style, --force-dot-license, --fallback-dot-license ou --skip-unrecognised :" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, fuzzy, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" @@ -42,7 +42,7 @@ msgstr "" "{path} ne supporte pas les commentaires mono-lignes. Merci de ne pas " "utiliser --single-line" -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, fuzzy, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" @@ -51,155 +51,155 @@ msgstr "" "{path} ne supporte pas les commentaires multi-lignes. Merci de ne pas " "utiliser --multi-line" -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, fuzzy, python-brace-format msgid "Template '{template}' could not be found." msgstr "le modèle {template} est introuvable" -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 #, fuzzy msgid "Add copyright and licensing into the headers of files." msgstr "" "ajoute les informations de droits d'auteur et de licence dans les en-têtes " "des fichiers" -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 #, fuzzy msgid "Copyright statement, repeatable." msgstr "déclaration de droits d'auteur, répétable" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 #, fuzzy msgid "SPDX License Identifier, repeatable." msgstr "Identifiant SPDX, répétable" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 #, fuzzy msgid "File contributor, repeatable." msgstr "contributeur au fichier, répétable" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 #, fuzzy msgid "Year of copyright statement." msgstr "année de déclaration de droits d'auteur, facultatif" -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 #, fuzzy msgid "Comment style to use." msgstr "style de commentaire à utiliser, facultatif" -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 #, fuzzy msgid "Copyright prefix to use." msgstr "préfixe de droits d'auteur à utiliser, facultatif" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 #, fuzzy msgid "Name of template to use." msgstr "nom de modèle à utiliser, facultatif" -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 #, fuzzy msgid "Do not include year in copyright statement." msgstr "ne pas inclure d'année dans la déclaration" -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 #, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" "fusionner les lignes de droits d'auteur si les déclarations de droits " "d'auteur sont identiques" -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 #, fuzzy msgid "Force single-line comment style." msgstr "forcer le style de commentaire monoligne, facultatif" -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 #, fuzzy msgid "Force multi-line comment style." msgstr "forcer le style de commentaire multiligne, facultatif" -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 #, fuzzy msgid "Add headers to all files under specified directories recursively." msgstr "" "ajouter récursivement les en-têtes dans tous les fichiers des répertoires " "spécifiés" -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 #, fuzzy msgid "Do not replace the first header in the file; just add a new one." msgstr "" "ne pas remplacer le premier en-tête dans le fichier, mais simplement en " "ajouter un" -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 #, fuzzy msgid "Always write a .license file instead of a header inside the file." msgstr "" "toujours écrire un fichier .license au lieu d'une entête dans le fichier" -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 #, fuzzy msgid "Write a .license file to files with unrecognised comment styles." msgstr "" "écrire un fichier .license pour les fichiers au style de commentaire inconnu" -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 #, fuzzy msgid "Skip files with unrecognised comment styles." msgstr "" "ignorer les fichiers comportant des styles de commentaires non reconnus" -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 #, fuzzy msgid "Skip files that already contain REUSE information." msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" diff --git a/po/gl.po b/po/gl.po index 3dcbf063a..4d76fd1fa 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician \n" "Language-Team: Italian \n" "Language-Team: Dutch \n" "Language-Team: Portuguese 1;\n" "X-Generator: Weblate 4.18.1\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 #, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "é requerida uma das opções --copyright ou --license" -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" @@ -32,153 +32,153 @@ msgstr "" "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" "explicit-license" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." msgstr "" -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, fuzzy, python-brace-format msgid "Template '{template}' could not be found." msgstr "o modelo {template} não foi encontrado" -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 #, fuzzy msgid "Add copyright and licensing into the headers of files." msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 #, fuzzy msgid "Copyright statement, repeatable." msgstr "declaração de direitos de autor (repetível)" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 #, fuzzy msgid "SPDX License Identifier, repeatable." msgstr "Identificador SPDX (repetível)" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 #, fuzzy msgid "File contributor, repeatable." msgstr "Identificador SPDX (repetível)" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 #, fuzzy msgid "Year of copyright statement." msgstr "ano da declaração de direitos de autor (opcional)" -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 #, fuzzy msgid "Comment style to use." msgstr "estilo de comentário a usar (opcional)" -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 #, fuzzy msgid "Copyright prefix to use." msgstr "estilo de comentário a usar (opcional)" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 #, fuzzy msgid "Name of template to use." msgstr "nome do modelo a usar (opcional)" -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 #, fuzzy msgid "Do not include year in copyright statement." msgstr "não incluir o ano na declaração" -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 #, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "ano da declaração de direitos de autor (opcional)" -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 #, fuzzy msgid "Force single-line comment style." msgstr "estilo de comentário a usar (opcional)" -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 #, fuzzy msgid "Force multi-line comment style." msgstr "estilo de comentário a usar (opcional)" -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 msgid "Add headers to all files under specified directories recursively." msgstr "" -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 msgid "Do not replace the first header in the file; just add a new one." msgstr "" -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 msgid "Always write a .license file instead of a header inside the file." msgstr "" -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 msgid "Write a .license file to files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 msgid "Skip files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 #, fuzzy msgid "Skip files that already contain REUSE information." msgstr "Ficheiros com informação de licenciamento: {count} / {total}" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" diff --git a/po/reuse.pot b/po/reuse.pot index 9429d01e7..175eafc04 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# click.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,151 +30,151 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "" -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" "unrecognised':" msgstr "" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." msgstr "" -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, python-brace-format msgid "Template '{template}' could not be found." msgstr "" -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 msgid "Add copyright and licensing into the headers of files." msgstr "" -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 msgid "Copyright statement, repeatable." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 msgid "SPDX License Identifier, repeatable." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 msgid "File contributor, repeatable." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 msgid "Year of copyright statement." msgstr "" -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 msgid "Comment style to use." msgstr "" -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 msgid "Copyright prefix to use." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 msgid "Name of template to use." msgstr "" -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 msgid "Do not include year in copyright statement." msgstr "" -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 msgid "Merge copyright lines if copyright statements are identical." msgstr "" -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 msgid "Force single-line comment style." msgstr "" -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 msgid "Force multi-line comment style." msgstr "" -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 msgid "Add headers to all files under specified directories recursively." msgstr "" -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 msgid "Do not replace the first header in the file; just add a new one." msgstr "" -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 msgid "Always write a .license file instead of a header inside the file." msgstr "" -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 msgid "Write a .license file to files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 msgid "Skip files with unrecognised comment styles." msgstr "" -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 msgid "Skip files that already contain REUSE information." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" diff --git a/po/ru.po b/po/ru.po index 585b8fb62..13e104d8b 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: 2024-10-12 11:15+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "" "Требуется опция '-- авторское право', '--лицензия' или '--контрибутор'." -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" @@ -35,7 +35,7 @@ msgstr "" "'--style', '--force-dot-license', '--fallback-dot-license' или '--skip-" "unrecognised':" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" @@ -44,7 +44,7 @@ msgstr "" "'{path}' не поддерживает однострочные комментарии, поэтому не используйте '--" "single-line'." -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" @@ -53,147 +53,147 @@ msgstr "" "'{path}' не поддерживает многострочные комментарии, поэтому не используйте " "'--multi-line'." -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, python-brace-format msgid "Template '{template}' could not be found." msgstr "Шаблон '{template}' не найден." -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 msgid "Add copyright and licensing into the headers of files." msgstr "" "Добавьте в заголовки файлов информацию об авторских правах и лицензировании." -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 #, fuzzy msgid "Copyright statement, repeatable." msgstr "заявление об авторских правах, повторяемое" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 #, fuzzy msgid "SPDX License Identifier, repeatable." msgstr "Идентификатор SPDX, повторяемый" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 #, fuzzy msgid "File contributor, repeatable." msgstr "вкладчик файлов, повторяемость" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 #, fuzzy msgid "Year of copyright statement." msgstr "год утверждения авторского права, необязательно" -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 #, fuzzy msgid "Comment style to use." msgstr "стиль комментария, который следует использовать, необязательно" -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 #, fuzzy msgid "Copyright prefix to use." msgstr "используемый префикс авторского права, необязательно" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 #, fuzzy msgid "Name of template to use." msgstr "имя шаблона, который будет использоваться, необязательно" -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 #, fuzzy msgid "Do not include year in copyright statement." msgstr "не указывайте год в отчете" -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 #, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" "объединить строки с авторскими правами, если заявления об авторских правах " "идентичны" -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 #, fuzzy msgid "Force single-line comment style." msgstr "стиль однострочных комментариев, необязательно" -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 #, fuzzy msgid "Force multi-line comment style." msgstr "установить стиль многострочного комментария, необязательно" -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 #, fuzzy msgid "Add headers to all files under specified directories recursively." msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 #, fuzzy msgid "Do not replace the first header in the file; just add a new one." msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 #, fuzzy msgid "Always write a .license file instead of a header inside the file." msgstr "всегда записывайте файл .license вместо заголовка внутри файла" -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 #, fuzzy msgid "Write a .license file to files with unrecognised comment styles." msgstr "" "записывать файл .license в файлы с нераспознанными стилями комментариев" -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 #, fuzzy msgid "Skip files with unrecognised comment styles." msgstr "пропускать файлы с нераспознанными стилями комментариев" -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 #, fuzzy msgid "Skip files that already contain REUSE information." msgstr "пропускать файлы, которые уже содержат информацию о REUSE" #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" diff --git a/po/sv.po b/po/sv.po index a284e4e14..a36d52b90 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-17 07:16+0000\n" +"POT-Creation-Date: 2024-10-24 08:57+0000\n" "PO-Revision-Date: 2024-09-19 13:40+0000\n" "Last-Translator: Simon \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian =20) ? 1 : 2);\n" "X-Generator: Weblate 5.8-dev\n" -#: src/reuse/cli/annotate.py:62 +#: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." msgstr "Потрібен параметр '--copyright', '--license' або '--contributor'." -#: src/reuse/cli/annotate.py:123 +#: src/reuse/cli/annotate.py:119 msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" @@ -35,7 +35,7 @@ msgstr "" "style', '--force-dot-license', '--fallback-dot-license' або '--skip-" "unrecognised':" -#: src/reuse/cli/annotate.py:156 +#: src/reuse/cli/annotate.py:152 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" @@ -44,7 +44,7 @@ msgstr "" "'{path}' не підтримує однорядкові коментарі, не використовуйте '--single-" "line'." -#: src/reuse/cli/annotate.py:163 +#: src/reuse/cli/annotate.py:159 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" @@ -53,16 +53,16 @@ msgstr "" "'{path}' не підтримує багаторядкові коментарі, не використовуйте '--multi-" "line'." -#: src/reuse/cli/annotate.py:209 +#: src/reuse/cli/annotate.py:205 #, python-brace-format msgid "Template '{template}' could not be found." msgstr "Не вдалося знайти шаблон '{template}'." -#: src/reuse/cli/annotate.py:272 +#: src/reuse/cli/annotate.py:268 msgid "Add copyright and licensing into the headers of files." msgstr "Додайте авторські права та ліцензії в заголовок файлів." -#: src/reuse/cli/annotate.py:275 +#: src/reuse/cli/annotate.py:271 msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." @@ -70,7 +70,7 @@ msgstr "" "За допомогою --copyright і --license ви можете вказати, яких власників " "авторських прав і ліцензій додавати до заголовків цих файлів." -#: src/reuse/cli/annotate.py:281 +#: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." @@ -79,105 +79,105 @@ msgstr "" "зробила внесок, але не є власником авторських прав на ці файли." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:294 +#: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" msgstr "COPYRIGHT" -#: src/reuse/cli/annotate.py:297 +#: src/reuse/cli/annotate.py:293 msgid "Copyright statement, repeatable." msgstr "Оголошення авторського права, повторюване." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:304 +#: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" msgstr "SPDX_IDENTIFIER" -#: src/reuse/cli/annotate.py:307 +#: src/reuse/cli/annotate.py:303 msgid "SPDX License Identifier, repeatable." msgstr "Ідентифікатор ліцензії SPDX, повторюваний." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:313 +#: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" msgstr "CONTRIBUTOR" -#: src/reuse/cli/annotate.py:316 +#: src/reuse/cli/annotate.py:312 msgid "File contributor, repeatable." msgstr "Співавтор файлу, повторюваний." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:323 +#: src/reuse/cli/annotate.py:319 msgid "YEAR" msgstr "YEAR" -#: src/reuse/cli/annotate.py:329 +#: src/reuse/cli/annotate.py:325 msgid "Year of copyright statement." msgstr "Рік оголошення авторського права." -#: src/reuse/cli/annotate.py:337 +#: src/reuse/cli/annotate.py:333 msgid "Comment style to use." msgstr "Використовуваний стиль коментарів." -#: src/reuse/cli/annotate.py:342 +#: src/reuse/cli/annotate.py:338 msgid "Copyright prefix to use." msgstr "Використовуваний префікс авторського права." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:354 +#: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" msgstr "TEMPLATE" -#: src/reuse/cli/annotate.py:356 +#: src/reuse/cli/annotate.py:352 msgid "Name of template to use." msgstr "Використовувана назва шаблону." -#: src/reuse/cli/annotate.py:363 +#: src/reuse/cli/annotate.py:359 msgid "Do not include year in copyright statement." msgstr "Не включати рік в оголошення авторського права." -#: src/reuse/cli/annotate.py:368 +#: src/reuse/cli/annotate.py:364 msgid "Merge copyright lines if copyright statements are identical." msgstr "" "Об'єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні." -#: src/reuse/cli/annotate.py:375 +#: src/reuse/cli/annotate.py:371 msgid "Force single-line comment style." msgstr "Примусовий однорядковий стиль коментаря." -#: src/reuse/cli/annotate.py:382 +#: src/reuse/cli/annotate.py:378 msgid "Force multi-line comment style." msgstr "Примусовий багаторядковий стиль коментарів." -#: src/reuse/cli/annotate.py:388 +#: src/reuse/cli/annotate.py:384 msgid "Add headers to all files under specified directories recursively." msgstr "Рекурсивно додавати заголовки до всіх файлів у вказаних каталогах." -#: src/reuse/cli/annotate.py:393 +#: src/reuse/cli/annotate.py:389 msgid "Do not replace the first header in the file; just add a new one." msgstr "Не замінювати перший заголовок у файлі; просто додавати новий." -#: src/reuse/cli/annotate.py:400 +#: src/reuse/cli/annotate.py:396 msgid "Always write a .license file instead of a header inside the file." msgstr "Завжди записуйте файл .license замість заголовка всередині файлу." -#: src/reuse/cli/annotate.py:407 +#: src/reuse/cli/annotate.py:403 msgid "Write a .license file to files with unrecognised comment styles." msgstr "Записати файл .license до файлів з нерозпізнаними стилями коментарів." -#: src/reuse/cli/annotate.py:414 +#: src/reuse/cli/annotate.py:410 msgid "Skip files with unrecognised comment styles." msgstr "Пропускати файли з нерозпізнаними стилями коментарів." -#: src/reuse/cli/annotate.py:425 +#: src/reuse/cli/annotate.py:421 msgid "Skip files that already contain REUSE information." msgstr "Пропускати файли, які вже містять інформацію REUSE." #. TRANSLATORS: You may translate this. Please preserve capital letters. -#: src/reuse/cli/annotate.py:430 +#: src/reuse/cli/annotate.py:426 msgid "PATH" msgstr "ШЛЯХ" -#: src/reuse/cli/annotate.py:480 +#: src/reuse/cli/annotate.py:476 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" From ca7bf90e8961ca7e78b4aa205956f3a4a0dfa72e Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 11:04:26 +0200 Subject: [PATCH 115/156] Be stricter about regenerating reuse.pot Sometimes when `make create-pot` is run, the wrapping in the `.po` files wouldn't exactly match how Weblate does the wrapping. This would trigger a commit. By only checking for the diff in `po/reuse.pot`, we avoid this problem. Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/gettext.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gettext.yaml b/.github/workflows/gettext.yaml index 6465e706f..1973c4aba 100644 --- a/.github/workflows/gettext.yaml +++ b/.github/workflows/gettext.yaml @@ -43,8 +43,8 @@ jobs: - name: Check if sufficient lines were changed id: diff run: - echo "changed=$(git diff -U0 | grep '^[+|-][^+|-]' | grep -Ev - '^[+-]("POT-Creation-Date|#:)' | wc -l)" >> $GITHUB_OUTPUT + echo "changed=$(git diff -U0 po/reuse.pot | grep '^[+|-][^+|-]' | grep + -Ev '^[+-]("POT-Creation-Date|#:)' | wc -l)" >> $GITHUB_OUTPUT - name: Commit and push updated reuse.pot if: ${{ steps.diff.outputs.changed != '0' }} run: | From d2c08c324470ae5c1e9c8917b3d2b018faf42c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linnea=20Gr=C3=A4f?= Date: Wed, 7 Aug 2024 23:58:08 +0200 Subject: [PATCH 116/156] Fix global licensing being ignored with a .license file Fixes https://github.com/fsfe/reuse-tool/issues/1057 --- AUTHORS.rst | 1 + .../fixed/license-overriding-global-name.md | 2 + src/reuse/project.py | 3 +- tests/test_project.py | 75 +++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 changelog.d/fixed/license-overriding-global-name.md diff --git a/AUTHORS.rst b/AUTHORS.rst index 606f05a7e..498c62253 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -143,3 +143,4 @@ Contributors - Mersho - Skyler Grey - Emil Velikov +- Linnea Gräf diff --git a/changelog.d/fixed/license-overriding-global-name.md b/changelog.d/fixed/license-overriding-global-name.md new file mode 100644 index 000000000..f010d4727 --- /dev/null +++ b/changelog.d/fixed/license-overriding-global-name.md @@ -0,0 +1,2 @@ +- `REUSE.toml` `[[annotations]]` now use the correct path if a `.license` file + is present (#1058) diff --git a/src/reuse/project.py b/src/reuse/project.py index 4b7425f5b..dcbc1335b 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -4,6 +4,7 @@ # SPDX-FileCopyrightText: 2023 Matthias Riße # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2024 Kerry McAdams +# SPDX-FileCopyrightText: 2024 Linnea Gräf # # SPDX-License-Identifier: GPL-3.0-or-later @@ -243,7 +244,7 @@ def reuse_info_of(self, path: StrPath) -> list[ReuseInfo]: # Search the global licensing file for REUSE information. if self.global_licensing: - relpath = self.relative_from_root(path) + relpath = self.relative_from_root(original_path) global_results = defaultdict( list, self.global_licensing.reuse_info_of(relpath) ) diff --git a/tests/test_project.py b/tests/test_project.py index 3606816d3..124ed050a 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -3,6 +3,7 @@ # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # SPDX-FileCopyrightText: 2024 Skyler Grey # SPDX-FileCopyrightText: © 2020 Liferay, Inc. +# SPDX-FileCopyrightText: 2024 Linnea Gräf # # SPDX-License-Identifier: GPL-3.0-or-later @@ -456,6 +457,80 @@ def test_reuse_info_of_copyright_xor_licensing(empty_directory): assert not bar_file_info.spdx_expressions +def test_reuse_info_of_copyright_xor_licensing_with_license_dot( + empty_directory, +): + """Test a corner case where partial REUSE information is defined inside of a + .license file (copyright xor licensing). Get the missing information from + the REUSE.toml. + """ + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "*.py" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + + [[annotations]] + path = "*.py.license" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + ) + (empty_directory / "foo.py").write_text( + cleandoc( + """ + print("This is very strictly copyrighted code") + """ + ) + ) + (empty_directory / "foo.py.license").write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2017 John Doe + """ + ) + ) + (empty_directory / "bar.py").write_text( + cleandoc( + """ + print("This is other very strictly copyrighted code") + """ + ) + ) + (empty_directory / "bar.py.license").write_text( + cleandoc( + """ + SPDX-License-Identifier: 0BSD + """ + ) + ) + project = Project.from_directory(empty_directory) + + foo_infos = project.reuse_info_of("foo.py") + assert len(foo_infos) == 2 + foo_toml_info = [info for info in foo_infos if info.spdx_expressions][0] + assert foo_toml_info.source_type == SourceType.REUSE_TOML + assert not foo_toml_info.copyright_lines + assert "MIT" not in str(foo_toml_info.spdx_expressions) + foo_file_info = [info for info in foo_infos if info.copyright_lines][0] + assert foo_file_info.source_type == SourceType.DOT_LICENSE + assert not foo_file_info.spdx_expressions + + bar_infos = project.reuse_info_of("bar.py") + assert len(bar_infos) == 2 + bar_toml_info = [info for info in bar_infos if info.copyright_lines][0] + assert bar_toml_info.source_type == SourceType.REUSE_TOML + assert not bar_toml_info.spdx_expressions + bar_file_info = [info for info in bar_infos if info.spdx_expressions][0] + assert bar_file_info.source_type == SourceType.DOT_LICENSE + assert not bar_file_info.copyright_lines + + def test_reuse_info_of_no_duplicates(empty_directory): """A file contains the same lines twice. The ReuseInfo only contains those lines once. From 985bfba9d9a5dabf09694860b4c193ec8dca6321 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 11:44:27 +0200 Subject: [PATCH 117/156] Improve tests The old test tried to do way too much at the same time. It has been thoroughly simplified where possible, and split up where not possible. Signed-off-by: Carmen Bianca BAKKER --- tests/test_project.py | 79 ++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/tests/test_project.py b/tests/test_project.py index 124ed050a..51381e652 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -457,12 +457,10 @@ def test_reuse_info_of_copyright_xor_licensing(empty_directory): assert not bar_file_info.spdx_expressions -def test_reuse_info_of_copyright_xor_licensing_with_license_dot( - empty_directory, -): - """Test a corner case where partial REUSE information is defined inside of a - .license file (copyright xor licensing). Get the missing information from - the REUSE.toml. +def test_reuse_info_of_reuse_toml_dot_license(empty_directory): + """Test a corner case where there is REUSE information inside of a file, its + .license file, and REUSE.toml. Only the REUSE information from the .license + file and REUSE.toml should be applied to this file. """ (empty_directory / "REUSE.toml").write_text( cleandoc( @@ -471,20 +469,16 @@ def test_reuse_info_of_copyright_xor_licensing_with_license_dot( [[annotations]] path = "*.py" + precedence = "aggregate" SPDX-FileCopyrightText = "2017 Jane Doe" SPDX-License-Identifier = "CC0-1.0" - - [[annotations]] - path = "*.py.license" - SPDX-FileCopyrightText = "2017 Jane Doe" - SPDX-License-Identifier = "MIT" """ ) ) (empty_directory / "foo.py").write_text( cleandoc( """ - print("This is very strictly copyrighted code") + SPDX-FileCopyrightText: NONE """ ) ) @@ -495,40 +489,57 @@ def test_reuse_info_of_copyright_xor_licensing_with_license_dot( """ ) ) - (empty_directory / "bar.py").write_text( + project = Project.from_directory(empty_directory) + + infos = project.reuse_info_of("foo.py") + assert len(infos) == 2 + toml_info = [info for info in infos if info.spdx_expressions][0] + assert toml_info.source_type == SourceType.REUSE_TOML + assert "2017 Jane Doe" in toml_info.copyright_lines + assert "CC0-1.0" in str(toml_info.spdx_expressions) + dot_license_info = [info for info in infos if not info.spdx_expressions][0] + assert dot_license_info.source_type == SourceType.DOT_LICENSE + assert ( + "SPDX-FileCopyrightText: 2017 John Doe" + in dot_license_info.copyright_lines + ) + assert not dot_license_info.spdx_expressions + + +def test_reuse_info_of_dot_license_invalid_target(empty_directory): + """file.license is an invalid target in REUSE.toml.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py.license" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").write_text( cleandoc( """ - print("This is other very strictly copyrighted code") + SPDX-FileCopyrightText: 2017 John Doe + + SPDX-License-Identifier: MIT """ ) ) - (empty_directory / "bar.py.license").write_text( + (empty_directory / "foo.py.license").write_text( cleandoc( """ - SPDX-License-Identifier: 0BSD + Empty """ ) ) project = Project.from_directory(empty_directory) - foo_infos = project.reuse_info_of("foo.py") - assert len(foo_infos) == 2 - foo_toml_info = [info for info in foo_infos if info.spdx_expressions][0] - assert foo_toml_info.source_type == SourceType.REUSE_TOML - assert not foo_toml_info.copyright_lines - assert "MIT" not in str(foo_toml_info.spdx_expressions) - foo_file_info = [info for info in foo_infos if info.copyright_lines][0] - assert foo_file_info.source_type == SourceType.DOT_LICENSE - assert not foo_file_info.spdx_expressions - - bar_infos = project.reuse_info_of("bar.py") - assert len(bar_infos) == 2 - bar_toml_info = [info for info in bar_infos if info.copyright_lines][0] - assert bar_toml_info.source_type == SourceType.REUSE_TOML - assert not bar_toml_info.spdx_expressions - bar_file_info = [info for info in bar_infos if info.spdx_expressions][0] - assert bar_file_info.source_type == SourceType.DOT_LICENSE - assert not bar_file_info.copyright_lines + infos = project.reuse_info_of("foo.py") + assert len(infos) == 0 def test_reuse_info_of_no_duplicates(empty_directory): From 928d879e7b14cdd34703d50123fad7b0ca4ff11d Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 14:16:20 +0200 Subject: [PATCH 118/156] =?UTF-8?q?Bump=20version:=20v4.0.3=20=E2=86=92=20?= =?UTF-8?q?v5.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- docs/conf.py | 2 +- pyproject.toml | 4 ++-- src/reuse/__init__.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c772e9b34..938db40f2 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ Git. This uses [pre-commit](https://pre-commit.com/). Once you ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v4.0.3 + rev: v5.0.0 hooks: - id: reuse ``` @@ -263,7 +263,7 @@ use the following configuration: ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v4.0.3 + rev: v5.0.0 hooks: - id: reuse-lint-file ``` diff --git a/docs/conf.py b/docs/conf.py index d7c79c716..aabb018cb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ # The full version, including alpha/beta/rc tags. release = get_version("reuse") except PackageNotFoundError: - release = "4.0.3" + release = "5.0.0" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) diff --git a/pyproject.toml b/pyproject.toml index dc91d3f95..20df9cf2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ [tool.poetry] name = "reuse" -version = "4.0.3" +version = "5.0.0" description = "reuse is a tool for compliance with the REUSE recommendations." authors = [ "Free Software Foundation Europe ", @@ -106,7 +106,7 @@ requires = ["poetry-core>=1.1.0"] build-backend = "poetry.core.masonry.api" [bumpver] -current_version = "v4.0.3" +current_version = "v5.0.0" version_pattern = "vMAJOR.MINOR.PATCH[PYTAGNUM]" commit_message = "Bump version: {old_version} → {new_version}" tag_message = "{new_version}" diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 720c52710..1d9c9e651 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -34,7 +34,7 @@ __version__ = version("reuse") except PackageNotFoundError: # package is not installed - __version__ = "4.0.3" + __version__ = "5.0.0" __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" From 3b7f0c66cf9595eec5c9f694aa6f98bf9d367717 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 14:17:25 +0200 Subject: [PATCH 119/156] Update spdx resources Signed-off-by: Carmen Bianca BAKKER --- changelog.d/changed/spdx-resources.md | 1 + src/reuse/resources/exceptions.json | 171 +-- src/reuse/resources/licenses.json | 1411 +++++++++++++------------ 3 files changed, 849 insertions(+), 734 deletions(-) create mode 100644 changelog.d/changed/spdx-resources.md diff --git a/changelog.d/changed/spdx-resources.md b/changelog.d/changed/spdx-resources.md new file mode 100644 index 000000000..d5b6315b4 --- /dev/null +++ b/changelog.d/changed/spdx-resources.md @@ -0,0 +1 @@ +- SPDX license and exception list updated to v3.25.0. diff --git a/src/reuse/resources/exceptions.json b/src/reuse/resources/exceptions.json index e9bb9314b..1b48b052b 100644 --- a/src/reuse/resources/exceptions.json +++ b/src/reuse/resources/exceptions.json @@ -1,11 +1,11 @@ { - "licenseListVersion": "3.24.0", + "licenseListVersion": "3.25.0", "exceptions": [ { "reference": "./389-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./389-exception.html", - "referenceNumber": 52, + "referenceNumber": 53, "name": "389 Directory Server Exception", "licenseExceptionId": "389-exception", "seeAlso": [ @@ -17,7 +17,7 @@ "reference": "./Asterisk-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Asterisk-exception.html", - "referenceNumber": 39, + "referenceNumber": 60, "name": "Asterisk exception", "licenseExceptionId": "Asterisk-exception", "seeAlso": [ @@ -40,7 +40,7 @@ "reference": "./Autoconf-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-2.0.html", - "referenceNumber": 60, + "referenceNumber": 72, "name": "Autoconf exception 2.0", "licenseExceptionId": "Autoconf-exception-2.0", "seeAlso": [ @@ -52,7 +52,7 @@ "reference": "./Autoconf-exception-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-3.0.html", - "referenceNumber": 42, + "referenceNumber": 17, "name": "Autoconf exception 3.0", "licenseExceptionId": "Autoconf-exception-3.0", "seeAlso": [ @@ -63,7 +63,7 @@ "reference": "./Autoconf-exception-generic.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-generic.html", - "referenceNumber": 70, + "referenceNumber": 48, "name": "Autoconf generic exception", "licenseExceptionId": "Autoconf-exception-generic", "seeAlso": [ @@ -77,7 +77,7 @@ "reference": "./Autoconf-exception-generic-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-generic-3.0.html", - "referenceNumber": 44, + "referenceNumber": 64, "name": "Autoconf generic exception for GPL-3.0", "licenseExceptionId": "Autoconf-exception-generic-3.0", "seeAlso": [ @@ -88,7 +88,7 @@ "reference": "./Autoconf-exception-macro.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-macro.html", - "referenceNumber": 15, + "referenceNumber": 51, "name": "Autoconf macro exception", "licenseExceptionId": "Autoconf-exception-macro", "seeAlso": [ @@ -101,7 +101,7 @@ "reference": "./Bison-exception-1.24.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bison-exception-1.24.html", - "referenceNumber": 4, + "referenceNumber": 59, "name": "Bison exception 1.24", "licenseExceptionId": "Bison-exception-1.24", "seeAlso": [ @@ -112,7 +112,7 @@ "reference": "./Bison-exception-2.2.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bison-exception-2.2.html", - "referenceNumber": 30, + "referenceNumber": 21, "name": "Bison exception 2.2", "licenseExceptionId": "Bison-exception-2.2", "seeAlso": [ @@ -123,7 +123,7 @@ "reference": "./Bootloader-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bootloader-exception.html", - "referenceNumber": 21, + "referenceNumber": 40, "name": "Bootloader Distribution Exception", "licenseExceptionId": "Bootloader-exception", "seeAlso": [ @@ -134,7 +134,7 @@ "reference": "./Classpath-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Classpath-exception-2.0.html", - "referenceNumber": 11, + "referenceNumber": 34, "name": "Classpath exception 2.0", "licenseExceptionId": "Classpath-exception-2.0", "seeAlso": [ @@ -146,7 +146,7 @@ "reference": "./CLISP-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./CLISP-exception-2.0.html", - "referenceNumber": 49, + "referenceNumber": 71, "name": "CLISP exception 2.0", "licenseExceptionId": "CLISP-exception-2.0", "seeAlso": [ @@ -157,7 +157,7 @@ "reference": "./cryptsetup-OpenSSL-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./cryptsetup-OpenSSL-exception.html", - "referenceNumber": 26, + "referenceNumber": 5, "name": "cryptsetup OpenSSL exception", "licenseExceptionId": "cryptsetup-OpenSSL-exception", "seeAlso": [ @@ -172,7 +172,7 @@ "reference": "./DigiRule-FOSS-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./DigiRule-FOSS-exception.html", - "referenceNumber": 16, + "referenceNumber": 66, "name": "DigiRule FOSS License Exception", "licenseExceptionId": "DigiRule-FOSS-exception", "seeAlso": [ @@ -183,18 +183,31 @@ "reference": "./eCos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./eCos-exception-2.0.html", - "referenceNumber": 45, + "referenceNumber": 35, "name": "eCos exception 2.0", "licenseExceptionId": "eCos-exception-2.0", "seeAlso": [ "http://ecos.sourceware.org/license-overview.html" ] }, + { + "reference": "./erlang-otp-linking-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./erlang-otp-linking-exception.html", + "referenceNumber": 46, + "name": "Erlang/OTP Linking Exception", + "licenseExceptionId": "erlang-otp-linking-exception", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs", + "https://erlang.org/pipermail/erlang-questions/2012-May/066355.html", + "https://gitea.osmocom.org/erlang/osmo_ss7/src/commit/2286c1b8738d715950026650bf53f19a69d6ed0e/src/ss7_links.erl#L20" + ] + }, { "reference": "./Fawkes-Runtime-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Fawkes-Runtime-exception.html", - "referenceNumber": 31, + "referenceNumber": 23, "name": "Fawkes Runtime Exception", "licenseExceptionId": "Fawkes-Runtime-exception", "seeAlso": [ @@ -205,7 +218,7 @@ "reference": "./FLTK-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./FLTK-exception.html", - "referenceNumber": 59, + "referenceNumber": 9, "name": "FLTK exception", "licenseExceptionId": "FLTK-exception", "seeAlso": [ @@ -216,7 +229,7 @@ "reference": "./fmt-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./fmt-exception.html", - "referenceNumber": 48, + "referenceNumber": 69, "name": "fmt exception", "licenseExceptionId": "fmt-exception", "seeAlso": [ @@ -228,7 +241,7 @@ "reference": "./Font-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Font-exception-2.0.html", - "referenceNumber": 62, + "referenceNumber": 19, "name": "Font exception 2.0", "licenseExceptionId": "Font-exception-2.0", "seeAlso": [ @@ -239,7 +252,7 @@ "reference": "./freertos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./freertos-exception-2.0.html", - "referenceNumber": 14, + "referenceNumber": 54, "name": "FreeRTOS Exception 2.0", "licenseExceptionId": "freertos-exception-2.0", "seeAlso": [ @@ -250,7 +263,7 @@ "reference": "./GCC-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0.html", - "referenceNumber": 29, + "referenceNumber": 14, "name": "GCC Runtime Library exception 2.0", "licenseExceptionId": "GCC-exception-2.0", "seeAlso": [ @@ -262,7 +275,7 @@ "reference": "./GCC-exception-2.0-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0-note.html", - "referenceNumber": 1, + "referenceNumber": 55, "name": "GCC Runtime Library exception 2.0 - note variant", "licenseExceptionId": "GCC-exception-2.0-note", "seeAlso": [ @@ -273,7 +286,7 @@ "reference": "./GCC-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-3.1.html", - "referenceNumber": 64, + "referenceNumber": 6, "name": "GCC Runtime Library exception 3.1", "licenseExceptionId": "GCC-exception-3.1", "seeAlso": [ @@ -284,7 +297,7 @@ "reference": "./Gmsh-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Gmsh-exception.html", - "referenceNumber": 25, + "referenceNumber": 58, "name": "Gmsh exception\u003e", "licenseExceptionId": "Gmsh-exception", "seeAlso": [ @@ -295,7 +308,7 @@ "reference": "./GNAT-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNAT-exception.html", - "referenceNumber": 18, + "referenceNumber": 26, "name": "GNAT exception", "licenseExceptionId": "GNAT-exception", "seeAlso": [ @@ -306,7 +319,7 @@ "reference": "./GNOME-examples-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNOME-examples-exception.html", - "referenceNumber": 40, + "referenceNumber": 12, "name": "GNOME examples exception", "licenseExceptionId": "GNOME-examples-exception", "seeAlso": [ @@ -318,7 +331,7 @@ "reference": "./GNU-compiler-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNU-compiler-exception.html", - "referenceNumber": 9, + "referenceNumber": 18, "name": "GNU Compiler Exception", "licenseExceptionId": "GNU-compiler-exception", "seeAlso": [ @@ -329,7 +342,7 @@ "reference": "./gnu-javamail-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./gnu-javamail-exception.html", - "referenceNumber": 20, + "referenceNumber": 43, "name": "GNU JavaMail exception", "licenseExceptionId": "gnu-javamail-exception", "seeAlso": [ @@ -340,7 +353,7 @@ "reference": "./GPL-3.0-interface-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-interface-exception.html", - "referenceNumber": 3, + "referenceNumber": 28, "name": "GPL-3.0 Interface Exception", "licenseExceptionId": "GPL-3.0-interface-exception", "seeAlso": [ @@ -351,7 +364,7 @@ "reference": "./GPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-exception.html", - "referenceNumber": 41, + "referenceNumber": 45, "name": "GPL-3.0 Linking Exception", "licenseExceptionId": "GPL-3.0-linking-exception", "seeAlso": [ @@ -362,7 +375,7 @@ "reference": "./GPL-3.0-linking-source-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-source-exception.html", - "referenceNumber": 68, + "referenceNumber": 39, "name": "GPL-3.0 Linking Exception (with Corresponding Source)", "licenseExceptionId": "GPL-3.0-linking-source-exception", "seeAlso": [ @@ -374,7 +387,7 @@ "reference": "./GPL-CC-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-CC-1.0.html", - "referenceNumber": 50, + "referenceNumber": 27, "name": "GPL Cooperation Commitment 1.0", "licenseExceptionId": "GPL-CC-1.0", "seeAlso": [ @@ -386,7 +399,7 @@ "reference": "./GStreamer-exception-2005.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2005.html", - "referenceNumber": 61, + "referenceNumber": 63, "name": "GStreamer Exception (2005)", "licenseExceptionId": "GStreamer-exception-2005", "seeAlso": [ @@ -397,7 +410,7 @@ "reference": "./GStreamer-exception-2008.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2008.html", - "referenceNumber": 10, + "referenceNumber": 30, "name": "GStreamer Exception (2008)", "licenseExceptionId": "GStreamer-exception-2008", "seeAlso": [ @@ -408,7 +421,7 @@ "reference": "./i2p-gpl-java-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./i2p-gpl-java-exception.html", - "referenceNumber": 13, + "referenceNumber": 36, "name": "i2p GPL+Java Exception", "licenseExceptionId": "i2p-gpl-java-exception", "seeAlso": [ @@ -419,7 +432,7 @@ "reference": "./KiCad-libraries-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./KiCad-libraries-exception.html", - "referenceNumber": 8, + "referenceNumber": 10, "name": "KiCad Libraries Exception", "licenseExceptionId": "KiCad-libraries-exception", "seeAlso": [ @@ -430,7 +443,7 @@ "reference": "./LGPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LGPL-3.0-linking-exception.html", - "referenceNumber": 7, + "referenceNumber": 31, "name": "LGPL-3.0 Linking Exception", "licenseExceptionId": "LGPL-3.0-linking-exception", "seeAlso": [ @@ -443,7 +456,7 @@ "reference": "./libpri-OpenH323-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./libpri-OpenH323-exception.html", - "referenceNumber": 5, + "referenceNumber": 15, "name": "libpri OpenH323 exception", "licenseExceptionId": "libpri-OpenH323-exception", "seeAlso": [ @@ -454,7 +467,7 @@ "reference": "./Libtool-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Libtool-exception.html", - "referenceNumber": 63, + "referenceNumber": 20, "name": "Libtool Exception", "licenseExceptionId": "Libtool-exception", "seeAlso": [ @@ -466,7 +479,7 @@ "reference": "./Linux-syscall-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Linux-syscall-note.html", - "referenceNumber": 54, + "referenceNumber": 52, "name": "Linux Syscall Note", "licenseExceptionId": "Linux-syscall-note", "seeAlso": [ @@ -477,7 +490,7 @@ "reference": "./LLGPL.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLGPL.html", - "referenceNumber": 19, + "referenceNumber": 37, "name": "LLGPL Preamble", "licenseExceptionId": "LLGPL", "seeAlso": [ @@ -488,7 +501,7 @@ "reference": "./LLVM-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLVM-exception.html", - "referenceNumber": 57, + "referenceNumber": 1, "name": "LLVM Exception", "licenseExceptionId": "LLVM-exception", "seeAlso": [ @@ -499,7 +512,7 @@ "reference": "./LZMA-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LZMA-exception.html", - "referenceNumber": 2, + "referenceNumber": 61, "name": "LZMA exception", "licenseExceptionId": "LZMA-exception", "seeAlso": [ @@ -510,7 +523,7 @@ "reference": "./mif-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./mif-exception.html", - "referenceNumber": 6, + "referenceNumber": 7, "name": "Macros and Inline Functions Exception", "licenseExceptionId": "mif-exception", "seeAlso": [ @@ -523,7 +536,7 @@ "reference": "./Nokia-Qt-exception-1.1.json", "isDeprecatedLicenseId": true, "detailsUrl": "./Nokia-Qt-exception-1.1.html", - "referenceNumber": 51, + "referenceNumber": 13, "name": "Nokia Qt LGPL exception 1.1", "licenseExceptionId": "Nokia-Qt-exception-1.1", "seeAlso": [ @@ -534,7 +547,7 @@ "reference": "./OCaml-LGPL-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCaml-LGPL-linking-exception.html", - "referenceNumber": 43, + "referenceNumber": 2, "name": "OCaml LGPL Linking Exception", "licenseExceptionId": "OCaml-LGPL-linking-exception", "seeAlso": [ @@ -545,7 +558,7 @@ "reference": "./OCCT-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCCT-exception-1.0.html", - "referenceNumber": 56, + "referenceNumber": 49, "name": "Open CASCADE Exception 1.0", "licenseExceptionId": "OCCT-exception-1.0", "seeAlso": [ @@ -556,7 +569,7 @@ "reference": "./OpenJDK-assembly-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OpenJDK-assembly-exception-1.0.html", - "referenceNumber": 35, + "referenceNumber": 44, "name": "OpenJDK Assembly exception 1.0", "licenseExceptionId": "OpenJDK-assembly-exception-1.0", "seeAlso": [ @@ -567,7 +580,7 @@ "reference": "./openvpn-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./openvpn-openssl-exception.html", - "referenceNumber": 55, + "referenceNumber": 29, "name": "OpenVPN OpenSSL Exception", "licenseExceptionId": "openvpn-openssl-exception", "seeAlso": [ @@ -579,7 +592,7 @@ "reference": "./PCRE2-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./PCRE2-exception.html", - "referenceNumber": 27, + "referenceNumber": 8, "name": "PCRE2 exception", "licenseExceptionId": "PCRE2-exception", "seeAlso": [ @@ -590,7 +603,7 @@ "reference": "./PS-or-PDF-font-exception-20170817.json", "isDeprecatedLicenseId": false, "detailsUrl": "./PS-or-PDF-font-exception-20170817.html", - "referenceNumber": 67, + "referenceNumber": 16, "name": "PS/PDF font exception (2017-08-17)", "licenseExceptionId": "PS-or-PDF-font-exception-20170817", "seeAlso": [ @@ -601,7 +614,7 @@ "reference": "./QPL-1.0-INRIA-2004-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./QPL-1.0-INRIA-2004-exception.html", - "referenceNumber": 47, + "referenceNumber": 68, "name": "INRIA QPL 1.0 2004 variant exception", "licenseExceptionId": "QPL-1.0-INRIA-2004-exception", "seeAlso": [ @@ -613,7 +626,7 @@ "reference": "./Qt-GPL-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-GPL-exception-1.0.html", - "referenceNumber": 46, + "referenceNumber": 50, "name": "Qt GPL exception 1.0", "licenseExceptionId": "Qt-GPL-exception-1.0", "seeAlso": [ @@ -624,7 +637,7 @@ "reference": "./Qt-LGPL-exception-1.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-LGPL-exception-1.1.html", - "referenceNumber": 65, + "referenceNumber": 38, "name": "Qt LGPL exception 1.1", "licenseExceptionId": "Qt-LGPL-exception-1.1", "seeAlso": [ @@ -635,18 +648,34 @@ "reference": "./Qwt-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qwt-exception-1.0.html", - "referenceNumber": 58, + "referenceNumber": 25, "name": "Qwt exception 1.0", "licenseExceptionId": "Qwt-exception-1.0", "seeAlso": [ "http://qwt.sourceforge.net/qwtlicense.html" ] }, + { + "reference": "./romic-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./romic-exception.html", + "referenceNumber": 22, + "name": "Romic Exception", + "licenseExceptionId": "romic-exception", + "seeAlso": [ + "https://web.archive.org/web/20210124015834/http://mo.morsi.org/blog/2009/08/13/lesser_affero_gplv3/", + "https://sourceforge.net/p/romic/code/ci/3ab2856180cf0d8b007609af53154cf092efc58f/tree/COPYING", + "https://github.com/moll/node-mitm/blob/bbf24b8bd7596dc6e091e625363161ce91984fc7/LICENSE#L8-L11", + "https://github.com/zenbones/SmallMind/blob/3c62b5995fe7f27c453f140ff9b60560a0893f2a/COPYRIGHT#L25-L30", + "https://github.com/CubeArtisan/cubeartisan/blob/2c6ab53455237b88a3ea07be02a838a135c4ab79/LICENSE.LESSER#L10-L15", + "https://github.com/savearray2/py.js/blob/b781273c08c8afa89f4954de4ecf42ec01429bae/README.md#license" + ] + }, { "reference": "./RRDtool-FLOSS-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./RRDtool-FLOSS-exception-2.0.html", - "referenceNumber": 22, + "referenceNumber": 4, "name": "RRDtool FLOSS exception 2.0", "licenseExceptionId": "RRDtool-FLOSS-exception-2.0", "seeAlso": [ @@ -658,7 +687,7 @@ "reference": "./SANE-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SANE-exception.html", - "referenceNumber": 12, + "referenceNumber": 11, "name": "SANE Exception", "licenseExceptionId": "SANE-exception", "seeAlso": [ @@ -671,7 +700,7 @@ "reference": "./SHL-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.0.html", - "referenceNumber": 17, + "referenceNumber": 56, "name": "Solderpad Hardware License v2.0", "licenseExceptionId": "SHL-2.0", "seeAlso": [ @@ -682,7 +711,7 @@ "reference": "./SHL-2.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.1.html", - "referenceNumber": 32, + "referenceNumber": 65, "name": "Solderpad Hardware License v2.1", "licenseExceptionId": "SHL-2.1", "seeAlso": [ @@ -693,7 +722,7 @@ "reference": "./stunnel-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./stunnel-exception.html", - "referenceNumber": 66, + "referenceNumber": 70, "name": "stunnel Exception", "licenseExceptionId": "stunnel-exception", "seeAlso": [ @@ -704,7 +733,7 @@ "reference": "./SWI-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SWI-exception.html", - "referenceNumber": 36, + "referenceNumber": 41, "name": "SWI exception", "licenseExceptionId": "SWI-exception", "seeAlso": [ @@ -715,7 +744,7 @@ "reference": "./Swift-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Swift-exception.html", - "referenceNumber": 37, + "referenceNumber": 33, "name": "Swift Exception", "licenseExceptionId": "Swift-exception", "seeAlso": [ @@ -727,7 +756,7 @@ "reference": "./Texinfo-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Texinfo-exception.html", - "referenceNumber": 23, + "referenceNumber": 67, "name": "Texinfo exception", "licenseExceptionId": "Texinfo-exception", "seeAlso": [ @@ -738,7 +767,7 @@ "reference": "./u-boot-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./u-boot-exception-2.0.html", - "referenceNumber": 69, + "referenceNumber": 3, "name": "U-Boot exception 2.0", "licenseExceptionId": "u-boot-exception-2.0", "seeAlso": [ @@ -749,7 +778,7 @@ "reference": "./UBDL-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./UBDL-exception.html", - "referenceNumber": 53, + "referenceNumber": 62, "name": "Unmodified Binary Distribution exception", "licenseExceptionId": "UBDL-exception", "seeAlso": [ @@ -760,7 +789,7 @@ "reference": "./Universal-FOSS-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Universal-FOSS-exception-1.0.html", - "referenceNumber": 38, + "referenceNumber": 42, "name": "Universal FOSS Exception, Version 1.0", "licenseExceptionId": "Universal-FOSS-exception-1.0", "seeAlso": [ @@ -771,7 +800,7 @@ "reference": "./vsftpd-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./vsftpd-openssl-exception.html", - "referenceNumber": 33, + "referenceNumber": 32, "name": "vsftpd OpenSSL exception", "licenseExceptionId": "vsftpd-openssl-exception", "seeAlso": [ @@ -784,7 +813,7 @@ "reference": "./WxWindows-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./WxWindows-exception-3.1.html", - "referenceNumber": 28, + "referenceNumber": 57, "name": "WxWindows Library Exception 3.1", "licenseExceptionId": "WxWindows-exception-3.1", "seeAlso": [ @@ -795,7 +824,7 @@ "reference": "./x11vnc-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./x11vnc-openssl-exception.html", - "referenceNumber": 34, + "referenceNumber": 47, "name": "x11vnc OpenSSL Exception", "licenseExceptionId": "x11vnc-openssl-exception", "seeAlso": [ @@ -803,5 +832,5 @@ ] } ], - "releaseDate": "2024-05-22" + "releaseDate": "2024-08-19" } \ No newline at end of file diff --git a/src/reuse/resources/licenses.json b/src/reuse/resources/licenses.json index 9596a3b09..6c1a1e133 100644 --- a/src/reuse/resources/licenses.json +++ b/src/reuse/resources/licenses.json @@ -1,11 +1,11 @@ { - "licenseListVersion": "3.24.0", + "licenseListVersion": "3.25.0", "licenses": [ { "reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", - "referenceNumber": 537, + "referenceNumber": 582, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": [ @@ -18,7 +18,7 @@ "reference": "https://spdx.org/licenses/3D-Slicer-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/3D-Slicer-1.0.json", - "referenceNumber": 200, + "referenceNumber": 466, "name": "3D Slicer License v1.0", "licenseId": "3D-Slicer-1.0", "seeAlso": [ @@ -31,7 +31,7 @@ "reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", - "referenceNumber": 406, + "referenceNumber": 252, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": [ @@ -43,7 +43,7 @@ "reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", - "referenceNumber": 526, + "referenceNumber": 456, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": [ @@ -55,7 +55,7 @@ "reference": "https://spdx.org/licenses/AdaCore-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AdaCore-doc.json", - "referenceNumber": 382, + "referenceNumber": 355, "name": "AdaCore Doc License", "licenseId": "AdaCore-doc", "seeAlso": [ @@ -69,7 +69,7 @@ "reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", - "referenceNumber": 558, + "referenceNumber": 128, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": [ @@ -81,7 +81,7 @@ "reference": "https://spdx.org/licenses/Adobe-Display-PostScript.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Display-PostScript.json", - "referenceNumber": 431, + "referenceNumber": 433, "name": "Adobe Display PostScript License", "licenseId": "Adobe-Display-PostScript", "seeAlso": [ @@ -93,7 +93,7 @@ "reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", - "referenceNumber": 297, + "referenceNumber": 125, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": [ @@ -105,7 +105,7 @@ "reference": "https://spdx.org/licenses/Adobe-Utopia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Utopia.json", - "referenceNumber": 532, + "referenceNumber": 495, "name": "Adobe Utopia Font License", "licenseId": "Adobe-Utopia", "seeAlso": [ @@ -117,7 +117,7 @@ "reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", - "referenceNumber": 463, + "referenceNumber": 560, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": [ @@ -129,7 +129,7 @@ "reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", - "referenceNumber": 601, + "referenceNumber": 14, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": [ @@ -143,7 +143,7 @@ "reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", - "referenceNumber": 72, + "referenceNumber": 622, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": [ @@ -157,7 +157,7 @@ "reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", - "referenceNumber": 187, + "referenceNumber": 559, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": [ @@ -170,7 +170,7 @@ "reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", - "referenceNumber": 383, + "referenceNumber": 570, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": [ @@ -183,7 +183,7 @@ "reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", - "referenceNumber": 369, + "referenceNumber": 332, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": [ @@ -197,7 +197,7 @@ "reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", - "referenceNumber": 345, + "referenceNumber": 163, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": [ @@ -209,7 +209,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", - "referenceNumber": 221, + "referenceNumber": 657, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": [ @@ -222,7 +222,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", - "referenceNumber": 334, + "referenceNumber": 142, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": [ @@ -234,7 +234,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-or-later.json", - "referenceNumber": 527, + "referenceNumber": 155, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": [ @@ -246,7 +246,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", - "referenceNumber": 394, + "referenceNumber": 70, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": [ @@ -260,7 +260,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", - "referenceNumber": 123, + "referenceNumber": 330, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": [ @@ -274,7 +274,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-or-later.json", - "referenceNumber": 105, + "referenceNumber": 366, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": [ @@ -288,7 +288,7 @@ "reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", - "referenceNumber": 168, + "referenceNumber": 557, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": [ @@ -301,7 +301,7 @@ "reference": "https://spdx.org/licenses/AMD-newlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMD-newlib.json", - "referenceNumber": 222, + "referenceNumber": 340, "name": "AMD newlib License", "licenseId": "AMD-newlib", "seeAlso": [ @@ -313,7 +313,7 @@ "reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", - "referenceNumber": 149, + "referenceNumber": 467, "name": "AMD\u0027s plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": [ @@ -325,7 +325,7 @@ "reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", - "referenceNumber": 13, + "referenceNumber": 299, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": [ @@ -337,7 +337,7 @@ "reference": "https://spdx.org/licenses/AML-glslang.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML-glslang.json", - "referenceNumber": 1, + "referenceNumber": 567, "name": "AML glslang variant License", "licenseId": "AML-glslang", "seeAlso": [ @@ -350,7 +350,7 @@ "reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", - "referenceNumber": 420, + "referenceNumber": 414, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": [ @@ -362,7 +362,7 @@ "reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", - "referenceNumber": 576, + "referenceNumber": 460, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": [ @@ -374,7 +374,7 @@ "reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", - "referenceNumber": 194, + "referenceNumber": 65, "name": "ANTLR Software Rights Notice with license fallback", "licenseId": "ANTLR-PD-fallback", "seeAlso": [ @@ -386,7 +386,7 @@ "reference": "https://spdx.org/licenses/any-OSI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/any-OSI.json", - "referenceNumber": 121, + "referenceNumber": 310, "name": "Any OSI License", "licenseId": "any-OSI", "seeAlso": [ @@ -398,7 +398,7 @@ "reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", - "referenceNumber": 616, + "referenceNumber": 250, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": [ @@ -411,7 +411,7 @@ "reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", - "referenceNumber": 313, + "referenceNumber": 288, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": [ @@ -425,7 +425,7 @@ "reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", - "referenceNumber": 564, + "referenceNumber": 143, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": [ @@ -439,7 +439,7 @@ "reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", - "referenceNumber": 136, + "referenceNumber": 636, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": [ @@ -451,7 +451,7 @@ "reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", - "referenceNumber": 515, + "referenceNumber": 85, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": [ @@ -463,7 +463,7 @@ "reference": "https://spdx.org/licenses/App-s2p.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/App-s2p.json", - "referenceNumber": 470, + "referenceNumber": 238, "name": "App::s2p License", "licenseId": "App-s2p", "seeAlso": [ @@ -475,7 +475,7 @@ "reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", - "referenceNumber": 39, + "referenceNumber": 335, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": [ @@ -488,7 +488,7 @@ "reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", - "referenceNumber": 582, + "referenceNumber": 308, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": [ @@ -500,7 +500,7 @@ "reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", - "referenceNumber": 628, + "referenceNumber": 280, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": [ @@ -512,7 +512,7 @@ "reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", - "referenceNumber": 144, + "referenceNumber": 592, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": [ @@ -525,7 +525,7 @@ "reference": "https://spdx.org/licenses/Arphic-1999.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", - "referenceNumber": 131, + "referenceNumber": 32, "name": "Arphic Public License", "licenseId": "Arphic-1999", "seeAlso": [ @@ -537,7 +537,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", - "referenceNumber": 388, + "referenceNumber": 138, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": [ @@ -550,7 +550,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", - "referenceNumber": 321, + "referenceNumber": 353, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": [ @@ -562,7 +562,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", - "referenceNumber": 652, + "referenceNumber": 660, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": [ @@ -574,7 +574,7 @@ "reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", - "referenceNumber": 355, + "referenceNumber": 277, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": [ @@ -589,7 +589,7 @@ "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.json", - "referenceNumber": 330, + "referenceNumber": 166, "name": "ASWF Digital Assets License version 1.0", "licenseId": "ASWF-Digital-Assets-1.0", "seeAlso": [ @@ -601,7 +601,7 @@ "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.json", - "referenceNumber": 447, + "referenceNumber": 29, "name": "ASWF Digital Assets License 1.1", "licenseId": "ASWF-Digital-Assets-1.1", "seeAlso": [ @@ -613,7 +613,7 @@ "reference": "https://spdx.org/licenses/Baekmuk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", - "referenceNumber": 436, + "referenceNumber": 380, "name": "Baekmuk License", "licenseId": "Baekmuk", "seeAlso": [ @@ -625,7 +625,7 @@ "reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", - "referenceNumber": 494, + "referenceNumber": 368, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": [ @@ -637,7 +637,7 @@ "reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", - "referenceNumber": 48, + "referenceNumber": 195, "name": "Barr License", "licenseId": "Barr", "seeAlso": [ @@ -649,7 +649,7 @@ "reference": "https://spdx.org/licenses/bcrypt-Solar-Designer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bcrypt-Solar-Designer.json", - "referenceNumber": 27, + "referenceNumber": 478, "name": "bcrypt Solar Designer License", "licenseId": "bcrypt-Solar-Designer", "seeAlso": [ @@ -661,7 +661,7 @@ "reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", - "referenceNumber": 143, + "referenceNumber": 616, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": [ @@ -674,7 +674,7 @@ "reference": "https://spdx.org/licenses/Bitstream-Charter.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Charter.json", - "referenceNumber": 560, + "referenceNumber": 455, "name": "Bitstream Charter Font License", "licenseId": "Bitstream-Charter", "seeAlso": [ @@ -687,7 +687,7 @@ "reference": "https://spdx.org/licenses/Bitstream-Vera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", - "referenceNumber": 581, + "referenceNumber": 370, "name": "Bitstream Vera Font License", "licenseId": "Bitstream-Vera", "seeAlso": [ @@ -700,7 +700,7 @@ "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", - "referenceNumber": 373, + "referenceNumber": 106, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": [ @@ -712,7 +712,7 @@ "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", - "referenceNumber": 288, + "referenceNumber": 541, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": [ @@ -725,7 +725,7 @@ "reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", - "referenceNumber": 469, + "referenceNumber": 359, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": [ @@ -738,7 +738,7 @@ "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", - "referenceNumber": 60, + "referenceNumber": 606, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": [ @@ -750,7 +750,7 @@ "reference": "https://spdx.org/licenses/Boehm-GC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Boehm-GC.json", - "referenceNumber": 322, + "referenceNumber": 127, "name": "Boehm-Demers-Weiser GC License", "licenseId": "Boehm-GC", "seeAlso": [ @@ -764,7 +764,7 @@ "reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", - "referenceNumber": 552, + "referenceNumber": 571, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": [ @@ -776,7 +776,7 @@ "reference": "https://spdx.org/licenses/Brian-Gladman-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-2-Clause.json", - "referenceNumber": 457, + "referenceNumber": 416, "name": "Brian Gladman 2-Clause License", "licenseId": "Brian-Gladman-2-Clause", "seeAlso": [ @@ -789,7 +789,7 @@ "reference": "https://spdx.org/licenses/Brian-Gladman-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-3-Clause.json", - "referenceNumber": 409, + "referenceNumber": 290, "name": "Brian Gladman 3-Clause License", "licenseId": "Brian-Gladman-3-Clause", "seeAlso": [ @@ -801,7 +801,7 @@ "reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", - "referenceNumber": 567, + "referenceNumber": 419, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": [ @@ -813,7 +813,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", - "referenceNumber": 264, + "referenceNumber": 229, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": [ @@ -826,7 +826,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-Darwin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Darwin.json", - "referenceNumber": 231, + "referenceNumber": 296, "name": "BSD 2-Clause - Ian Darwin variant", "licenseId": "BSD-2-Clause-Darwin", "seeAlso": [ @@ -838,7 +838,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-first-lines.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-first-lines.json", - "referenceNumber": 245, + "referenceNumber": 217, "name": "BSD 2-Clause - first lines requirement", "licenseId": "BSD-2-Clause-first-lines", "seeAlso": [ @@ -851,7 +851,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", - "referenceNumber": 192, + "referenceNumber": 564, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": [ @@ -864,7 +864,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", - "referenceNumber": 449, + "referenceNumber": 376, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": [ @@ -877,7 +877,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", - "referenceNumber": 612, + "referenceNumber": 4, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": [ @@ -889,7 +889,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", - "referenceNumber": 657, + "referenceNumber": 514, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": [ @@ -903,7 +903,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", - "referenceNumber": 216, + "referenceNumber": 584, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": [ @@ -917,7 +917,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-acpica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-acpica.json", - "referenceNumber": 408, + "referenceNumber": 341, "name": "BSD 3-Clause acpica variant", "licenseId": "BSD-3-Clause-acpica", "seeAlso": [ @@ -929,7 +929,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", - "referenceNumber": 14, + "referenceNumber": 71, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": [ @@ -941,7 +941,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", - "referenceNumber": 347, + "referenceNumber": 253, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": [ @@ -954,7 +954,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-flex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-flex.json", - "referenceNumber": 211, + "referenceNumber": 52, "name": "BSD 3-Clause Flex variant", "licenseId": "BSD-3-Clause-flex", "seeAlso": [ @@ -966,7 +966,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-HP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-HP.json", - "referenceNumber": 210, + "referenceNumber": 215, "name": "Hewlett-Packard BSD variant license", "licenseId": "BSD-3-Clause-HP", "seeAlso": [ @@ -978,7 +978,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", - "referenceNumber": 597, + "referenceNumber": 301, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": [ @@ -990,7 +990,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", - "referenceNumber": 364, + "referenceNumber": 47, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": [ @@ -1002,7 +1002,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.json", - "referenceNumber": 30, + "referenceNumber": 615, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": [ @@ -1015,7 +1015,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", - "referenceNumber": 21, + "referenceNumber": 647, "name": "BSD 3-Clause No Nuclear License", "licenseId": "BSD-3-Clause-No-Nuclear-License", "seeAlso": [ @@ -1027,7 +1027,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", - "referenceNumber": 543, + "referenceNumber": 377, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": [ @@ -1039,7 +1039,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", - "referenceNumber": 402, + "referenceNumber": 54, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": [ @@ -1051,7 +1051,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", - "referenceNumber": 376, + "referenceNumber": 633, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": [ @@ -1064,7 +1064,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Sun.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Sun.json", - "referenceNumber": 554, + "referenceNumber": 270, "name": "BSD 3-Clause Sun Microsystems", "licenseId": "BSD-3-Clause-Sun", "seeAlso": [ @@ -1076,7 +1076,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", - "referenceNumber": 650, + "referenceNumber": 470, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": [ @@ -1089,7 +1089,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", - "referenceNumber": 252, + "referenceNumber": 220, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": [ @@ -1101,7 +1101,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", - "referenceNumber": 117, + "referenceNumber": 175, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": [ @@ -1113,7 +1113,7 @@ "reference": "https://spdx.org/licenses/BSD-4.3RENO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3RENO.json", - "referenceNumber": 298, + "referenceNumber": 361, "name": "BSD 4.3 RENO License", "licenseId": "BSD-4.3RENO", "seeAlso": [ @@ -1126,7 +1126,7 @@ "reference": "https://spdx.org/licenses/BSD-4.3TAHOE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3TAHOE.json", - "referenceNumber": 0, + "referenceNumber": 46, "name": "BSD 4.3 TAHOE License", "licenseId": "BSD-4.3TAHOE", "seeAlso": [ @@ -1139,7 +1139,7 @@ "reference": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.json", - "referenceNumber": 423, + "referenceNumber": 297, "name": "BSD Advertising Acknowledgement License", "licenseId": "BSD-Advertising-Acknowledgement", "seeAlso": [ @@ -1151,7 +1151,7 @@ "reference": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.json", - "referenceNumber": 171, + "referenceNumber": 86, "name": "BSD with Attribution and HPND disclaimer", "licenseId": "BSD-Attribution-HPND-disclaimer", "seeAlso": [ @@ -1163,7 +1163,7 @@ "reference": "https://spdx.org/licenses/BSD-Inferno-Nettverk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Inferno-Nettverk.json", - "referenceNumber": 401, + "referenceNumber": 89, "name": "BSD-Inferno-Nettverk", "licenseId": "BSD-Inferno-Nettverk", "seeAlso": [ @@ -1175,7 +1175,7 @@ "reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", - "referenceNumber": 403, + "referenceNumber": 394, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": [ @@ -1187,7 +1187,7 @@ "reference": "https://spdx.org/licenses/BSD-Source-beginning-file.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-beginning-file.json", - "referenceNumber": 97, + "referenceNumber": 378, "name": "BSD Source Code Attribution - beginning of file variant", "licenseId": "BSD-Source-beginning-file", "seeAlso": [ @@ -1199,7 +1199,7 @@ "reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", - "referenceNumber": 22, + "referenceNumber": 605, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": [ @@ -1211,7 +1211,7 @@ "reference": "https://spdx.org/licenses/BSD-Systemics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Systemics.json", - "referenceNumber": 178, + "referenceNumber": 327, "name": "Systemics BSD variant license", "licenseId": "BSD-Systemics", "seeAlso": [ @@ -1223,7 +1223,7 @@ "reference": "https://spdx.org/licenses/BSD-Systemics-W3Works.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Systemics-W3Works.json", - "referenceNumber": 350, + "referenceNumber": 427, "name": "Systemics W3Works BSD variant license", "licenseId": "BSD-Systemics-W3Works", "seeAlso": [ @@ -1235,7 +1235,7 @@ "reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", - "referenceNumber": 514, + "referenceNumber": 334, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": [ @@ -1249,7 +1249,7 @@ "reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", - "referenceNumber": 549, + "referenceNumber": 285, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": [ @@ -1261,7 +1261,7 @@ "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", - "referenceNumber": 419, + "referenceNumber": 574, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": [ @@ -1274,7 +1274,7 @@ "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", - "referenceNumber": 396, + "referenceNumber": 534, "name": "bzip2 and libbzip2 License v1.0.6", "licenseId": "bzip2-1.0.6", "seeAlso": [ @@ -1288,7 +1288,7 @@ "reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", - "referenceNumber": 432, + "referenceNumber": 162, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": [ @@ -1301,7 +1301,7 @@ "reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", - "referenceNumber": 653, + "referenceNumber": 99, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": [ @@ -1314,7 +1314,7 @@ "reference": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", - "referenceNumber": 217, + "referenceNumber": 333, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": [ @@ -1327,7 +1327,7 @@ "reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", - "referenceNumber": 622, + "referenceNumber": 528, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": [ @@ -1339,7 +1339,7 @@ "reference": "https://spdx.org/licenses/Caldera-no-preamble.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera-no-preamble.json", - "referenceNumber": 585, + "referenceNumber": 233, "name": "Caldera License (without preamble)", "licenseId": "Caldera-no-preamble", "seeAlso": [ @@ -1351,7 +1351,7 @@ "reference": "https://spdx.org/licenses/Catharon.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Catharon.json", - "referenceNumber": 45, + "referenceNumber": 337, "name": "Catharon License", "licenseId": "Catharon", "seeAlso": [ @@ -1363,7 +1363,7 @@ "reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", - "referenceNumber": 193, + "referenceNumber": 134, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": [ @@ -1375,7 +1375,7 @@ "reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", - "referenceNumber": 37, + "referenceNumber": 415, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": [ @@ -1387,7 +1387,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", - "referenceNumber": 241, + "referenceNumber": 428, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": [ @@ -1399,7 +1399,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", - "referenceNumber": 129, + "referenceNumber": 573, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": [ @@ -1411,7 +1411,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.5-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5-AU.json", - "referenceNumber": 583, + "referenceNumber": 388, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": [ @@ -1423,7 +1423,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", - "referenceNumber": 302, + "referenceNumber": 132, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": [ @@ -1435,7 +1435,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AT.json", - "referenceNumber": 324, + "referenceNumber": 25, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": [ @@ -1447,7 +1447,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AU.json", - "referenceNumber": 342, + "referenceNumber": 392, "name": "Creative Commons Attribution 3.0 Australia", "licenseId": "CC-BY-3.0-AU", "seeAlso": [ @@ -1459,7 +1459,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-DE.json", - "referenceNumber": 239, + "referenceNumber": 21, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": [ @@ -1471,7 +1471,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-IGO.json", - "referenceNumber": 19, + "referenceNumber": 596, "name": "Creative Commons Attribution 3.0 IGO", "licenseId": "CC-BY-3.0-IGO", "seeAlso": [ @@ -1483,7 +1483,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-NL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-NL.json", - "referenceNumber": 501, + "referenceNumber": 157, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": [ @@ -1495,7 +1495,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-US.json", - "referenceNumber": 569, + "referenceNumber": 395, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": [ @@ -1507,7 +1507,7 @@ "reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", - "referenceNumber": 265, + "referenceNumber": 435, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": [ @@ -1520,7 +1520,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-1.0.json", - "referenceNumber": 167, + "referenceNumber": 641, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": [ @@ -1533,7 +1533,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.0.json", - "referenceNumber": 92, + "referenceNumber": 91, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": [ @@ -1546,7 +1546,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.5.json", - "referenceNumber": 253, + "referenceNumber": 465, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": [ @@ -1559,7 +1559,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0.json", - "referenceNumber": 199, + "referenceNumber": 234, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": [ @@ -1572,7 +1572,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.json", - "referenceNumber": 429, + "referenceNumber": 354, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": [ @@ -1584,7 +1584,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-4.0.json", - "referenceNumber": 188, + "referenceNumber": 53, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": [ @@ -1597,7 +1597,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.json", - "referenceNumber": 365, + "referenceNumber": 88, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": [ @@ -1609,7 +1609,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.json", - "referenceNumber": 416, + "referenceNumber": 426, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": [ @@ -1621,7 +1621,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.json", - "referenceNumber": 58, + "referenceNumber": 441, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": [ @@ -1633,7 +1633,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.json", - "referenceNumber": 213, + "referenceNumber": 304, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": [ @@ -1645,7 +1645,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.json", - "referenceNumber": 84, + "referenceNumber": 121, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": [ @@ -1657,7 +1657,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json", - "referenceNumber": 587, + "referenceNumber": 171, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": [ @@ -1669,7 +1669,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.json", - "referenceNumber": 296, + "referenceNumber": 183, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": [ @@ -1681,7 +1681,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.json", - "referenceNumber": 170, + "referenceNumber": 501, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": [ @@ -1693,7 +1693,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.json", - "referenceNumber": 484, + "referenceNumber": 358, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": [ @@ -1705,7 +1705,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.json", - "referenceNumber": 184, + "referenceNumber": 260, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", "licenseId": "CC-BY-NC-SA-2.0-DE", "seeAlso": [ @@ -1717,7 +1717,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.json", - "referenceNumber": 116, + "referenceNumber": 158, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": [ @@ -1729,7 +1729,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.json", - "referenceNumber": 415, + "referenceNumber": 33, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": [ @@ -1741,7 +1741,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.json", - "referenceNumber": 106, + "referenceNumber": 222, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": [ @@ -1753,7 +1753,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.json", - "referenceNumber": 323, + "referenceNumber": 255, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": [ @@ -1765,7 +1765,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.json", - "referenceNumber": 150, + "referenceNumber": 525, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": [ @@ -1777,7 +1777,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.json", - "referenceNumber": 295, + "referenceNumber": 244, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": [ @@ -1789,7 +1789,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.json", - "referenceNumber": 351, + "referenceNumber": 513, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": [ @@ -1801,7 +1801,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-1.0.json", - "referenceNumber": 56, + "referenceNumber": 474, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": [ @@ -1814,7 +1814,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.0.json", - "referenceNumber": 640, + "referenceNumber": 356, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": [ @@ -1827,7 +1827,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.5.json", - "referenceNumber": 276, + "referenceNumber": 259, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": [ @@ -1840,7 +1840,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0.json", - "referenceNumber": 173, + "referenceNumber": 527, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": [ @@ -1853,7 +1853,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.json", - "referenceNumber": 525, + "referenceNumber": 214, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": [ @@ -1865,7 +1865,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-4.0.json", - "referenceNumber": 328, + "referenceNumber": 481, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": [ @@ -1878,7 +1878,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-1.0.json", - "referenceNumber": 453, + "referenceNumber": 588, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": [ @@ -1890,7 +1890,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0.json", - "referenceNumber": 174, + "referenceNumber": 180, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": [ @@ -1902,7 +1902,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.json", - "referenceNumber": 387, + "referenceNumber": 385, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": [ @@ -1914,7 +1914,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.json", - "referenceNumber": 471, + "referenceNumber": 17, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": [ @@ -1926,7 +1926,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.5.json", - "referenceNumber": 461, + "referenceNumber": 607, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": [ @@ -1938,7 +1938,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0.json", - "referenceNumber": 621, + "referenceNumber": 26, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": [ @@ -1950,7 +1950,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.json", - "referenceNumber": 31, + "referenceNumber": 398, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": [ @@ -1962,7 +1962,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.json", - "referenceNumber": 325, + "referenceNumber": 120, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": [ @@ -1974,7 +1974,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.json", - "referenceNumber": 20, + "referenceNumber": 519, "name": "Creative Commons Attribution-ShareAlike 3.0 IGO", "licenseId": "CC-BY-SA-3.0-IGO", "seeAlso": [ @@ -1986,7 +1986,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-4.0.json", - "referenceNumber": 155, + "referenceNumber": 13, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": [ @@ -1999,7 +1999,7 @@ "reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", - "referenceNumber": 349, + "referenceNumber": 169, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": [ @@ -2011,7 +2011,7 @@ "reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", - "referenceNumber": 70, + "referenceNumber": 491, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": [ @@ -2024,7 +2024,7 @@ "reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", - "referenceNumber": 282, + "referenceNumber": 185, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": [ @@ -2037,7 +2037,7 @@ "reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", - "referenceNumber": 130, + "referenceNumber": 476, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": [ @@ -2050,7 +2050,7 @@ "reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", - "referenceNumber": 592, + "referenceNumber": 305, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": [ @@ -2064,7 +2064,7 @@ "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", - "referenceNumber": 551, + "referenceNumber": 386, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": [ @@ -2076,7 +2076,7 @@ "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", - "referenceNumber": 319, + "referenceNumber": 590, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": [ @@ -2088,7 +2088,7 @@ "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", - "referenceNumber": 445, + "referenceNumber": 190, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": [ @@ -2100,7 +2100,7 @@ "reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", - "referenceNumber": 219, + "referenceNumber": 625, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": [ @@ -2112,7 +2112,7 @@ "reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", - "referenceNumber": 38, + "referenceNumber": 326, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": [ @@ -2124,7 +2124,7 @@ "reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", - "referenceNumber": 73, + "referenceNumber": 463, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": [ @@ -2137,7 +2137,7 @@ "reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", - "referenceNumber": 393, + "referenceNumber": 170, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": [ @@ -2149,7 +2149,7 @@ "reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", - "referenceNumber": 354, + "referenceNumber": 196, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": [ @@ -2162,7 +2162,7 @@ "reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", - "referenceNumber": 271, + "referenceNumber": 178, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": [ @@ -2175,7 +2175,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", - "referenceNumber": 32, + "referenceNumber": 148, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": [ @@ -2187,7 +2187,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", - "referenceNumber": 95, + "referenceNumber": 651, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": [ @@ -2199,7 +2199,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-P-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-P-2.0.json", - "referenceNumber": 198, + "referenceNumber": 543, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": [ @@ -2211,7 +2211,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-S-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-S-2.0.json", - "referenceNumber": 370, + "referenceNumber": 396, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": [ @@ -2223,7 +2223,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-W-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-W-2.0.json", - "referenceNumber": 82, + "referenceNumber": 614, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": [ @@ -2235,7 +2235,7 @@ "reference": "https://spdx.org/licenses/CFITSIO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CFITSIO.json", - "referenceNumber": 96, + "referenceNumber": 568, "name": "CFITSIO License", "licenseId": "CFITSIO", "seeAlso": [ @@ -2248,7 +2248,7 @@ "reference": "https://spdx.org/licenses/check-cvs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/check-cvs.json", - "referenceNumber": 521, + "referenceNumber": 324, "name": "check-cvs License", "licenseId": "check-cvs", "seeAlso": [ @@ -2260,7 +2260,7 @@ "reference": "https://spdx.org/licenses/checkmk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/checkmk.json", - "referenceNumber": 272, + "referenceNumber": 464, "name": "Checkmk License", "licenseId": "checkmk", "seeAlso": [ @@ -2272,7 +2272,7 @@ "reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", - "referenceNumber": 66, + "referenceNumber": 230, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": [ @@ -2286,7 +2286,7 @@ "reference": "https://spdx.org/licenses/Clips.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Clips.json", - "referenceNumber": 450, + "referenceNumber": 424, "name": "Clips License", "licenseId": "Clips", "seeAlso": [ @@ -2298,7 +2298,7 @@ "reference": "https://spdx.org/licenses/CMU-Mach.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach.json", - "referenceNumber": 410, + "referenceNumber": 73, "name": "CMU Mach License", "licenseId": "CMU-Mach", "seeAlso": [ @@ -2310,7 +2310,7 @@ "reference": "https://spdx.org/licenses/CMU-Mach-nodoc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach-nodoc.json", - "referenceNumber": 111, + "referenceNumber": 8, "name": "CMU Mach - no notices-in-documentation variant", "licenseId": "CMU-Mach-nodoc", "seeAlso": [ @@ -2323,7 +2323,7 @@ "reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", - "referenceNumber": 509, + "referenceNumber": 293, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": [ @@ -2335,7 +2335,7 @@ "reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", - "referenceNumber": 611, + "referenceNumber": 402, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": [ @@ -2347,7 +2347,7 @@ "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", - "referenceNumber": 504, + "referenceNumber": 224, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": [ @@ -2359,7 +2359,7 @@ "reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", - "referenceNumber": 286, + "referenceNumber": 345, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": [ @@ -2371,7 +2371,7 @@ "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", - "referenceNumber": 631, + "referenceNumber": 56, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": [ @@ -2383,7 +2383,7 @@ "reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", - "referenceNumber": 251, + "referenceNumber": 77, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": [ @@ -2397,7 +2397,7 @@ "reference": "https://spdx.org/licenses/copyleft-next-0.3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.0.json", - "referenceNumber": 421, + "referenceNumber": 322, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": [ @@ -2409,7 +2409,7 @@ "reference": "https://spdx.org/licenses/copyleft-next-0.3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.1.json", - "referenceNumber": 119, + "referenceNumber": 403, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": [ @@ -2421,7 +2421,7 @@ "reference": "https://spdx.org/licenses/Cornell-Lossless-JPEG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cornell-Lossless-JPEG.json", - "referenceNumber": 632, + "referenceNumber": 98, "name": "Cornell Lossless JPEG License", "licenseId": "Cornell-Lossless-JPEG", "seeAlso": [ @@ -2435,7 +2435,7 @@ "reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", - "referenceNumber": 315, + "referenceNumber": 548, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": [ @@ -2448,7 +2448,7 @@ "reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", - "referenceNumber": 135, + "referenceNumber": 114, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": [ @@ -2461,7 +2461,7 @@ "reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", - "referenceNumber": 479, + "referenceNumber": 6, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": [ @@ -2474,7 +2474,7 @@ "reference": "https://spdx.org/licenses/Cronyx.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cronyx.json", - "referenceNumber": 377, + "referenceNumber": 649, "name": "Cronyx License", "licenseId": "Cronyx", "seeAlso": [ @@ -2489,7 +2489,7 @@ "reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", - "referenceNumber": 340, + "referenceNumber": 593, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": [ @@ -2501,7 +2501,7 @@ "reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", - "referenceNumber": 593, + "referenceNumber": 241, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": [ @@ -2513,7 +2513,7 @@ "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", - "referenceNumber": 553, + "referenceNumber": 409, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": [ @@ -2525,7 +2525,7 @@ "reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", - "referenceNumber": 404, + "referenceNumber": 141, "name": "Cube License", "licenseId": "Cube", "seeAlso": [ @@ -2537,7 +2537,7 @@ "reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", - "referenceNumber": 604, + "referenceNumber": 602, "name": "curl License", "licenseId": "curl", "seeAlso": [ @@ -2549,7 +2549,7 @@ "reference": "https://spdx.org/licenses/cve-tou.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/cve-tou.json", - "referenceNumber": 306, + "referenceNumber": 656, "name": "Common Vulnerability Enumeration ToU License", "licenseId": "cve-tou", "seeAlso": [ @@ -2561,7 +2561,7 @@ "reference": "https://spdx.org/licenses/D-FSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", - "referenceNumber": 154, + "referenceNumber": 116, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": [ @@ -2580,7 +2580,7 @@ "reference": "https://spdx.org/licenses/DEC-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DEC-3-Clause.json", - "referenceNumber": 15, + "referenceNumber": 512, "name": "DEC 3-Clause License", "licenseId": "DEC-3-Clause", "seeAlso": [ @@ -2592,7 +2592,7 @@ "reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", - "referenceNumber": 292, + "referenceNumber": 480, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": [ @@ -2604,7 +2604,7 @@ "reference": "https://spdx.org/licenses/DL-DE-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-BY-2.0.json", - "referenceNumber": 225, + "referenceNumber": 84, "name": "Data licence Germany – attribution – version 2.0", "licenseId": "DL-DE-BY-2.0", "seeAlso": [ @@ -2616,7 +2616,7 @@ "reference": "https://spdx.org/licenses/DL-DE-ZERO-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-ZERO-2.0.json", - "referenceNumber": 341, + "referenceNumber": 522, "name": "Data licence Germany – zero – version 2.0", "licenseId": "DL-DE-ZERO-2.0", "seeAlso": [ @@ -2628,7 +2628,7 @@ "reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", - "referenceNumber": 397, + "referenceNumber": 646, "name": "DOC License", "licenseId": "DOC", "seeAlso": [ @@ -2637,11 +2637,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/DocBook-Schema.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/DocBook-Schema.json", + "referenceNumber": 153, + "name": "DocBook Schema License", + "licenseId": "DocBook-Schema", + "seeAlso": [ + "https://github.com/docbook/xslt10-stylesheets/blob/efd62655c11cc8773708df7a843613fa1e932bf8/xsl/assembly/schema/docbook51b7.rnc" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/DocBook-XML.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/DocBook-XML.json", + "referenceNumber": 493, + "name": "DocBook XML License", + "licenseId": "DocBook-XML", + "seeAlso": [ + "https://github.com/docbook/xslt10-stylesheets/blob/efd62655c11cc8773708df7a843613fa1e932bf8/xsl/COPYING#L27" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", - "referenceNumber": 132, + "referenceNumber": 533, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": [ @@ -2653,7 +2677,7 @@ "reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", - "referenceNumber": 16, + "referenceNumber": 410, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": [ @@ -2665,7 +2689,7 @@ "reference": "https://spdx.org/licenses/DRL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.1.json", - "referenceNumber": 278, + "referenceNumber": 268, "name": "Detection Rule License 1.1", "licenseId": "DRL-1.1", "seeAlso": [ @@ -2677,7 +2701,7 @@ "reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", - "referenceNumber": 485, + "referenceNumber": 164, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": [ @@ -2689,7 +2713,7 @@ "reference": "https://spdx.org/licenses/dtoa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dtoa.json", - "referenceNumber": 358, + "referenceNumber": 263, "name": "David M. Gay dtoa License", "licenseId": "dtoa", "seeAlso": [ @@ -2702,7 +2726,7 @@ "reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", - "referenceNumber": 100, + "referenceNumber": 61, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": [ @@ -2714,7 +2738,7 @@ "reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", - "referenceNumber": 124, + "referenceNumber": 264, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": [ @@ -2726,7 +2750,7 @@ "reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", - "referenceNumber": 361, + "referenceNumber": 363, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": [ @@ -2739,7 +2763,7 @@ "reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", - "referenceNumber": 372, + "referenceNumber": 298, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": [ @@ -2752,7 +2776,7 @@ "reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", - "referenceNumber": 335, + "referenceNumber": 137, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": [ @@ -2765,7 +2789,7 @@ "reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", - "referenceNumber": 88, + "referenceNumber": 447, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": [ @@ -2779,7 +2803,7 @@ "reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", - "referenceNumber": 261, + "referenceNumber": 348, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": [ @@ -2792,7 +2816,7 @@ "reference": "https://spdx.org/licenses/Elastic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", - "referenceNumber": 147, + "referenceNumber": 404, "name": "Elastic License 2.0", "licenseId": "Elastic-2.0", "seeAlso": [ @@ -2805,7 +2829,7 @@ "reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", - "referenceNumber": 546, + "referenceNumber": 198, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": [ @@ -2817,7 +2841,7 @@ "reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", - "referenceNumber": 120, + "referenceNumber": 532, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": [ @@ -2829,7 +2853,7 @@ "reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", - "referenceNumber": 500, + "referenceNumber": 115, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": [ @@ -2843,7 +2867,7 @@ "reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", - "referenceNumber": 407, + "referenceNumber": 282, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": [ @@ -2857,7 +2881,7 @@ "reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", - "referenceNumber": 466, + "referenceNumber": 530, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": [ @@ -2869,7 +2893,7 @@ "reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", - "referenceNumber": 636, + "referenceNumber": 129, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": [ @@ -2882,7 +2906,7 @@ "reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", - "referenceNumber": 228, + "referenceNumber": 393, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": [ @@ -2896,7 +2920,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", - "referenceNumber": 227, + "referenceNumber": 389, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": [ @@ -2909,7 +2933,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", - "referenceNumber": 266, + "referenceNumber": 503, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": [ @@ -2924,7 +2948,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", - "referenceNumber": 559, + "referenceNumber": 12, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": [ @@ -2942,7 +2966,7 @@ "reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", - "referenceNumber": 63, + "referenceNumber": 621, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": [ @@ -2954,7 +2978,7 @@ "reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", - "referenceNumber": 570, + "referenceNumber": 258, "name": "Fair License", "licenseId": "Fair", "seeAlso": [ @@ -2967,7 +2991,7 @@ "reference": "https://spdx.org/licenses/FBM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FBM.json", - "referenceNumber": 175, + "referenceNumber": 626, "name": "Fuzzy Bitmap License", "licenseId": "FBM", "seeAlso": [ @@ -2979,7 +3003,7 @@ "reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", - "referenceNumber": 49, + "referenceNumber": 344, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": [ @@ -2992,7 +3016,7 @@ "reference": "https://spdx.org/licenses/Ferguson-Twofish.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ferguson-Twofish.json", - "referenceNumber": 617, + "referenceNumber": 362, "name": "Ferguson Twofish License", "licenseId": "Ferguson-Twofish", "seeAlso": [ @@ -3004,7 +3028,7 @@ "reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", - "referenceNumber": 259, + "referenceNumber": 188, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": [ @@ -3016,7 +3040,7 @@ "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", - "referenceNumber": 333, + "referenceNumber": 151, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": [ @@ -3028,7 +3052,7 @@ "reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", - "referenceNumber": 181, + "referenceNumber": 232, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": [ @@ -3040,7 +3064,7 @@ "reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", - "referenceNumber": 36, + "referenceNumber": 436, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": [ @@ -3053,7 +3077,7 @@ "reference": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.json", - "referenceNumber": 536, + "referenceNumber": 547, "name": "FSF All Permissive License (without Warranty)", "licenseId": "FSFAP-no-warranty-disclaimer", "seeAlso": [ @@ -3065,7 +3089,7 @@ "reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", - "referenceNumber": 454, + "referenceNumber": 2, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": [ @@ -3077,7 +3101,7 @@ "reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", - "referenceNumber": 422, + "referenceNumber": 508, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": [ @@ -3089,7 +3113,7 @@ "reference": "https://spdx.org/licenses/FSFULLRWD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", - "referenceNumber": 197, + "referenceNumber": 640, "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", "licenseId": "FSFULLRWD", "seeAlso": [ @@ -3101,7 +3125,7 @@ "reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", - "referenceNumber": 438, + "referenceNumber": 249, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": [ @@ -3116,7 +3140,7 @@ "reference": "https://spdx.org/licenses/Furuseth.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Furuseth.json", - "referenceNumber": 380, + "referenceNumber": 273, "name": "Furuseth License", "licenseId": "Furuseth", "seeAlso": [ @@ -3128,7 +3152,7 @@ "reference": "https://spdx.org/licenses/fwlw.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/fwlw.json", - "referenceNumber": 529, + "referenceNumber": 50, "name": "fwlw License", "licenseId": "fwlw", "seeAlso": [ @@ -3140,7 +3164,7 @@ "reference": "https://spdx.org/licenses/GCR-docs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GCR-docs.json", - "referenceNumber": 115, + "referenceNumber": 272, "name": "Gnome GCR Documentation License", "licenseId": "GCR-docs", "seeAlso": [ @@ -3152,7 +3176,7 @@ "reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", - "referenceNumber": 291, + "referenceNumber": 624, "name": "GD License", "licenseId": "GD", "seeAlso": [ @@ -3164,7 +3188,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", - "referenceNumber": 589, + "referenceNumber": 177, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": [ @@ -3177,7 +3201,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-only.json", - "referenceNumber": 307, + "referenceNumber": 216, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": [ @@ -3189,7 +3213,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.json", - "referenceNumber": 98, + "referenceNumber": 57, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": [ @@ -3201,7 +3225,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.json", - "referenceNumber": 47, + "referenceNumber": 38, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": [ @@ -3213,7 +3237,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json", - "referenceNumber": 273, + "referenceNumber": 289, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": [ @@ -3225,7 +3249,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", - "referenceNumber": 626, + "referenceNumber": 654, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": [ @@ -3238,7 +3262,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-or-later.json", - "referenceNumber": 644, + "referenceNumber": 569, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": [ @@ -3251,7 +3275,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", - "referenceNumber": 520, + "referenceNumber": 235, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": [ @@ -3264,7 +3288,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-only.json", - "referenceNumber": 495, + "referenceNumber": 461, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": [ @@ -3276,7 +3300,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.json", - "referenceNumber": 6, + "referenceNumber": 391, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": [ @@ -3288,7 +3312,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.json", - "referenceNumber": 77, + "referenceNumber": 187, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": [ @@ -3300,7 +3324,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json", - "referenceNumber": 279, + "referenceNumber": 240, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": [ @@ -3312,7 +3336,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", - "referenceNumber": 648, + "referenceNumber": 302, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": [ @@ -3325,7 +3349,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-or-later.json", - "referenceNumber": 318, + "referenceNumber": 562, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": [ @@ -3338,7 +3362,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", - "referenceNumber": 287, + "referenceNumber": 60, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": [ @@ -3351,7 +3375,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-only.json", - "referenceNumber": 289, + "referenceNumber": 184, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": [ @@ -3363,7 +3387,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.json", - "referenceNumber": 497, + "referenceNumber": 346, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": [ @@ -3375,7 +3399,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.json", - "referenceNumber": 254, + "referenceNumber": 59, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": [ @@ -3387,7 +3411,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json", - "referenceNumber": 207, + "referenceNumber": 281, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": [ @@ -3399,7 +3423,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", - "referenceNumber": 635, + "referenceNumber": 642, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": [ @@ -3412,7 +3436,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-or-later.json", - "referenceNumber": 448, + "referenceNumber": 494, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": [ @@ -3425,7 +3449,7 @@ "reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", - "referenceNumber": 172, + "referenceNumber": 618, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": [ @@ -3437,7 +3461,7 @@ "reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", - "referenceNumber": 434, + "referenceNumber": 231, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": [ @@ -3449,7 +3473,7 @@ "reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", - "referenceNumber": 189, + "referenceNumber": 620, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": [ @@ -3461,7 +3485,7 @@ "reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", - "referenceNumber": 85, + "referenceNumber": 429, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": [ @@ -3473,7 +3497,7 @@ "reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", - "referenceNumber": 190, + "referenceNumber": 154, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": [ @@ -3485,7 +3509,7 @@ "reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", - "referenceNumber": 110, + "referenceNumber": 271, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": [ @@ -3498,7 +3522,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", - "referenceNumber": 630, + "referenceNumber": 365, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": [ @@ -3510,7 +3534,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", - "referenceNumber": 26, + "referenceNumber": 66, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": [ @@ -3522,7 +3546,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", - "referenceNumber": 12, + "referenceNumber": 563, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": [ @@ -3534,7 +3558,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-or-later.json", - "referenceNumber": 642, + "referenceNumber": 558, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": [ @@ -3546,7 +3570,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", - "referenceNumber": 524, + "referenceNumber": 613, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": [ @@ -3560,7 +3584,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", - "referenceNumber": 25, + "referenceNumber": 83, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": [ @@ -3574,7 +3598,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", - "referenceNumber": 618, + "referenceNumber": 483, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0-only", "seeAlso": [ @@ -3589,7 +3613,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-or-later.json", - "referenceNumber": 164, + "referenceNumber": 349, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": [ @@ -3603,7 +3627,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", - "referenceNumber": 146, + "referenceNumber": 475, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": [ @@ -3615,7 +3639,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.json", - "referenceNumber": 374, + "referenceNumber": 492, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": [ @@ -3627,7 +3651,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", - "referenceNumber": 331, + "referenceNumber": 144, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": [ @@ -3639,7 +3663,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-font-exception.json", - "referenceNumber": 542, + "referenceNumber": 579, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": [ @@ -3651,7 +3675,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", - "referenceNumber": 68, + "referenceNumber": 449, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": [ @@ -3663,7 +3687,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", - "referenceNumber": 442, + "referenceNumber": 434, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": [ @@ -3677,7 +3701,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", - "referenceNumber": 270, + "referenceNumber": 586, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": [ @@ -3691,7 +3715,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", - "referenceNumber": 133, + "referenceNumber": 42, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": [ @@ -3705,7 +3729,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-or-later.json", - "referenceNumber": 390, + "referenceNumber": 269, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": [ @@ -3719,7 +3743,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", - "referenceNumber": 458, + "referenceNumber": 200, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": [ @@ -3731,7 +3755,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", - "referenceNumber": 356, + "referenceNumber": 546, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": [ @@ -3743,7 +3767,7 @@ "reference": "https://spdx.org/licenses/Graphics-Gems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Graphics-Gems.json", - "referenceNumber": 574, + "referenceNumber": 437, "name": "Graphics Gems License", "licenseId": "Graphics-Gems", "seeAlso": [ @@ -3755,7 +3779,7 @@ "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", - "referenceNumber": 655, + "referenceNumber": 658, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": [ @@ -3767,7 +3791,7 @@ "reference": "https://spdx.org/licenses/gtkbook.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gtkbook.json", - "referenceNumber": 237, + "referenceNumber": 397, "name": "gtkbook License", "licenseId": "gtkbook", "seeAlso": [ @@ -3780,7 +3804,7 @@ "reference": "https://spdx.org/licenses/Gutmann.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Gutmann.json", - "referenceNumber": 441, + "referenceNumber": 103, "name": "Gutmann License", "licenseId": "Gutmann", "seeAlso": [ @@ -3792,7 +3816,7 @@ "reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", - "referenceNumber": 625, + "referenceNumber": 357, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": [ @@ -3804,7 +3828,7 @@ "reference": "https://spdx.org/licenses/hdparm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/hdparm.json", - "referenceNumber": 81, + "referenceNumber": 351, "name": "hdparm License", "licenseId": "hdparm", "seeAlso": [ @@ -3812,11 +3836,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HIDAPI.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HIDAPI.json", + "referenceNumber": 318, + "name": "HIDAPI License", + "licenseId": "HIDAPI", + "seeAlso": [ + "https://github.com/signal11/hidapi/blob/master/LICENSE-orig.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", - "referenceNumber": 299, + "referenceNumber": 425, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": [ @@ -3829,7 +3865,7 @@ "reference": "https://spdx.org/licenses/HP-1986.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1986.json", - "referenceNumber": 277, + "referenceNumber": 477, "name": "Hewlett-Packard 1986 License", "licenseId": "HP-1986", "seeAlso": [ @@ -3841,7 +3877,7 @@ "reference": "https://spdx.org/licenses/HP-1989.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1989.json", - "referenceNumber": 639, + "referenceNumber": 653, "name": "Hewlett-Packard 1989 License", "licenseId": "HP-1989", "seeAlso": [ @@ -3853,7 +3889,7 @@ "reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", - "referenceNumber": 281, + "referenceNumber": 75, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": [ @@ -3867,7 +3903,7 @@ "reference": "https://spdx.org/licenses/HPND-DEC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-DEC.json", - "referenceNumber": 577, + "referenceNumber": 597, "name": "Historical Permission Notice and Disclaimer - DEC variant", "licenseId": "HPND-DEC", "seeAlso": [ @@ -3879,7 +3915,7 @@ "reference": "https://spdx.org/licenses/HPND-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc.json", - "referenceNumber": 391, + "referenceNumber": 384, "name": "Historical Permission Notice and Disclaimer - documentation variant", "licenseId": "HPND-doc", "seeAlso": [ @@ -3892,7 +3928,7 @@ "reference": "https://spdx.org/licenses/HPND-doc-sell.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc-sell.json", - "referenceNumber": 163, + "referenceNumber": 648, "name": "Historical Permission Notice and Disclaimer - documentation sell variant", "licenseId": "HPND-doc-sell", "seeAlso": [ @@ -3905,7 +3941,7 @@ "reference": "https://spdx.org/licenses/HPND-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US.json", - "referenceNumber": 214, + "referenceNumber": 551, "name": "HPND with US Government export control warning", "licenseId": "HPND-export-US", "seeAlso": [ @@ -3917,7 +3953,7 @@ "reference": "https://spdx.org/licenses/HPND-export-US-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US-acknowledgement.json", - "referenceNumber": 610, + "referenceNumber": 661, "name": "HPND with US Government export control warning and acknowledgment", "licenseId": "HPND-export-US-acknowledgement", "seeAlso": [ @@ -3930,7 +3966,7 @@ "reference": "https://spdx.org/licenses/HPND-export-US-modify.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US-modify.json", - "referenceNumber": 498, + "referenceNumber": 119, "name": "HPND with US Government export control warning and modification rqmt", "licenseId": "HPND-export-US-modify", "seeAlso": [ @@ -3943,7 +3979,7 @@ "reference": "https://spdx.org/licenses/HPND-export2-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export2-US.json", - "referenceNumber": 33, + "referenceNumber": 450, "name": "HPND with US Government export control and 2 disclaimers", "licenseId": "HPND-export2-US", "seeAlso": [ @@ -3956,7 +3992,7 @@ "reference": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.json", - "referenceNumber": 145, + "referenceNumber": 643, "name": "Historical Permission Notice and Disclaimer - Fenneberg-Livingston variant", "licenseId": "HPND-Fenneberg-Livingston", "seeAlso": [ @@ -3969,7 +4005,7 @@ "reference": "https://spdx.org/licenses/HPND-INRIA-IMAG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-INRIA-IMAG.json", - "referenceNumber": 614, + "referenceNumber": 583, "name": "Historical Permission Notice and Disclaimer - INRIA-IMAG variant", "licenseId": "HPND-INRIA-IMAG", "seeAlso": [ @@ -3981,7 +4017,7 @@ "reference": "https://spdx.org/licenses/HPND-Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Intel.json", - "referenceNumber": 195, + "referenceNumber": 20, "name": "Historical Permission Notice and Disclaimer - Intel variant", "licenseId": "HPND-Intel", "seeAlso": [ @@ -3993,7 +4029,7 @@ "reference": "https://spdx.org/licenses/HPND-Kevlin-Henney.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Kevlin-Henney.json", - "referenceNumber": 428, + "referenceNumber": 637, "name": "Historical Permission Notice and Disclaimer - Kevlin Henney variant", "licenseId": "HPND-Kevlin-Henney", "seeAlso": [ @@ -4005,7 +4041,7 @@ "reference": "https://spdx.org/licenses/HPND-Markus-Kuhn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Markus-Kuhn.json", - "referenceNumber": 8, + "referenceNumber": 172, "name": "Historical Permission Notice and Disclaimer - Markus Kuhn variant", "licenseId": "HPND-Markus-Kuhn", "seeAlso": [ @@ -4018,7 +4054,7 @@ "reference": "https://spdx.org/licenses/HPND-merchantability-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-merchantability-variant.json", - "referenceNumber": 540, + "referenceNumber": 572, "name": "Historical Permission Notice and Disclaimer - merchantability variant", "licenseId": "HPND-merchantability-variant", "seeAlso": [ @@ -4030,7 +4066,7 @@ "reference": "https://spdx.org/licenses/HPND-MIT-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-MIT-disclaimer.json", - "referenceNumber": 185, + "referenceNumber": 609, "name": "Historical Permission Notice and Disclaimer with MIT disclaimer", "licenseId": "HPND-MIT-disclaimer", "seeAlso": [ @@ -4038,11 +4074,21 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-Netrek.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-Netrek.json", + "referenceNumber": 126, + "name": "Historical Permission Notice and Disclaimer - Netrek variant", + "licenseId": "HPND-Netrek", + "seeAlso": [], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-Pbmplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Pbmplus.json", - "referenceNumber": 603, + "referenceNumber": 242, "name": "Historical Permission Notice and Disclaimer - Pbmplus variant", "licenseId": "HPND-Pbmplus", "seeAlso": [ @@ -4054,7 +4100,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.json", - "referenceNumber": 125, + "referenceNumber": 160, "name": "Historical Permission Notice and Disclaimer - sell xserver variant with MIT disclaimer", "licenseId": "HPND-sell-MIT-disclaimer-xserver", "seeAlso": [ @@ -4066,7 +4112,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-regexpr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-regexpr.json", - "referenceNumber": 633, + "referenceNumber": 44, "name": "Historical Permission Notice and Disclaimer - sell regexpr variant", "licenseId": "HPND-sell-regexpr", "seeAlso": [ @@ -4078,7 +4124,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", - "referenceNumber": 344, + "referenceNumber": 485, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": [ @@ -4090,7 +4136,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.json", - "referenceNumber": 160, + "referenceNumber": 430, "name": "HPND sell variant with MIT disclaimer", "licenseId": "HPND-sell-variant-MIT-disclaimer", "seeAlso": [ @@ -4102,7 +4148,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.json", - "referenceNumber": 609, + "referenceNumber": 10, "name": "HPND sell variant with MIT disclaimer - reverse", "licenseId": "HPND-sell-variant-MIT-disclaimer-rev", "seeAlso": [ @@ -4114,7 +4160,7 @@ "reference": "https://spdx.org/licenses/HPND-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-UC.json", - "referenceNumber": 386, + "referenceNumber": 423, "name": "Historical Permission Notice and Disclaimer - University of California variant", "licenseId": "HPND-UC", "seeAlso": [ @@ -4126,7 +4172,7 @@ "reference": "https://spdx.org/licenses/HPND-UC-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-UC-export-US.json", - "referenceNumber": 118, + "referenceNumber": 82, "name": "Historical Permission Notice and Disclaimer - University of California, US export warning", "licenseId": "HPND-UC-export-US", "seeAlso": [ @@ -4138,7 +4184,7 @@ "reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", - "referenceNumber": 134, + "referenceNumber": 439, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": [ @@ -4150,7 +4196,7 @@ "reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", - "referenceNumber": 102, + "referenceNumber": 604, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": [ @@ -4162,7 +4208,7 @@ "reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", - "referenceNumber": 67, + "referenceNumber": 375, "name": "ICU License", "licenseId": "ICU", "seeAlso": [ @@ -4174,7 +4220,7 @@ "reference": "https://spdx.org/licenses/IEC-Code-Components-EULA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IEC-Code-Components-EULA.json", - "referenceNumber": 359, + "referenceNumber": 18, "name": "IEC Code Components End-user licence agreement", "licenseId": "IEC-Code-Components-EULA", "seeAlso": [ @@ -4188,7 +4234,7 @@ "reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", - "referenceNumber": 641, + "referenceNumber": 374, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": [ @@ -4201,7 +4247,7 @@ "reference": "https://spdx.org/licenses/IJG-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG-short.json", - "referenceNumber": 615, + "referenceNumber": 152, "name": "Independent JPEG Group License - short", "licenseId": "IJG-short", "seeAlso": [ @@ -4213,7 +4259,7 @@ "reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", - "referenceNumber": 478, + "referenceNumber": 608, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": [ @@ -4225,7 +4271,7 @@ "reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", - "referenceNumber": 327, + "referenceNumber": 645, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": [ @@ -4238,7 +4284,7 @@ "reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", - "referenceNumber": 169, + "referenceNumber": 96, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": [ @@ -4252,7 +4298,7 @@ "reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", - "referenceNumber": 269, + "referenceNumber": 451, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": [ @@ -4264,7 +4310,7 @@ "reference": "https://spdx.org/licenses/Inner-Net-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Inner-Net-2.0.json", - "referenceNumber": 572, + "referenceNumber": 58, "name": "Inner Net License v2.0", "licenseId": "Inner-Net-2.0", "seeAlso": [ @@ -4277,7 +4323,7 @@ "reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", - "referenceNumber": 623, + "referenceNumber": 316, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": [ @@ -4290,7 +4336,7 @@ "reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", - "referenceNumber": 571, + "referenceNumber": 309, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": [ @@ -4302,7 +4348,7 @@ "reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", - "referenceNumber": 654, + "referenceNumber": 665, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": [ @@ -4314,7 +4360,7 @@ "reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", - "referenceNumber": 94, + "referenceNumber": 237, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": [ @@ -4327,7 +4373,7 @@ "reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", - "referenceNumber": 332, + "referenceNumber": 443, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": [ @@ -4340,7 +4386,7 @@ "reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", - "referenceNumber": 488, + "referenceNumber": 131, "name": "ISC License", "licenseId": "ISC", "seeAlso": [ @@ -4355,7 +4401,7 @@ "reference": "https://spdx.org/licenses/ISC-Veillard.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC-Veillard.json", - "referenceNumber": 513, + "referenceNumber": 554, "name": "ISC Veillard variant", "licenseId": "ISC-Veillard", "seeAlso": [ @@ -4369,7 +4415,7 @@ "reference": "https://spdx.org/licenses/Jam.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Jam.json", - "referenceNumber": 108, + "referenceNumber": 338, "name": "Jam License", "licenseId": "Jam", "seeAlso": [ @@ -4382,7 +4428,7 @@ "reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", - "referenceNumber": 487, + "referenceNumber": 591, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": [ @@ -4394,7 +4440,7 @@ "reference": "https://spdx.org/licenses/JPL-image.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPL-image.json", - "referenceNumber": 363, + "referenceNumber": 343, "name": "JPL Image Use Policy", "licenseId": "JPL-image", "seeAlso": [ @@ -4406,7 +4452,7 @@ "reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", - "referenceNumber": 83, + "referenceNumber": 117, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": [ @@ -4418,7 +4464,7 @@ "reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", - "referenceNumber": 65, + "referenceNumber": 174, "name": "JSON License", "licenseId": "JSON", "seeAlso": [ @@ -4431,7 +4477,7 @@ "reference": "https://spdx.org/licenses/Kastrup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kastrup.json", - "referenceNumber": 226, + "referenceNumber": 181, "name": "Kastrup License", "licenseId": "Kastrup", "seeAlso": [ @@ -4443,7 +4489,7 @@ "reference": "https://spdx.org/licenses/Kazlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kazlib.json", - "referenceNumber": 232, + "referenceNumber": 197, "name": "Kazlib License", "licenseId": "Kazlib", "seeAlso": [ @@ -4455,7 +4501,7 @@ "reference": "https://spdx.org/licenses/Knuth-CTAN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", - "referenceNumber": 290, + "referenceNumber": 22, "name": "Knuth CTAN License", "licenseId": "Knuth-CTAN", "seeAlso": [ @@ -4467,7 +4513,7 @@ "reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", - "referenceNumber": 165, + "referenceNumber": 261, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": [ @@ -4479,7 +4525,7 @@ "reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", - "referenceNumber": 600, + "referenceNumber": 526, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": [ @@ -4491,7 +4537,7 @@ "reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", - "referenceNumber": 439, + "referenceNumber": 3, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": [ @@ -4503,7 +4549,7 @@ "reference": "https://spdx.org/licenses/Latex2e-translated-notice.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e-translated-notice.json", - "referenceNumber": 620, + "referenceNumber": 104, "name": "Latex2e with translated notice permission", "licenseId": "Latex2e-translated-notice", "seeAlso": [ @@ -4515,7 +4561,7 @@ "reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", - "referenceNumber": 103, + "referenceNumber": 221, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": [ @@ -4527,7 +4573,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", - "referenceNumber": 353, + "referenceNumber": 81, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": [ @@ -4539,7 +4585,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", - "referenceNumber": 62, + "referenceNumber": 265, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": [ @@ -4551,7 +4597,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", - "referenceNumber": 519, + "referenceNumber": 517, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": [ @@ -4563,7 +4609,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-or-later.json", - "referenceNumber": 366, + "referenceNumber": 458, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": [ @@ -4575,7 +4621,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", - "referenceNumber": 656, + "referenceNumber": 659, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": [ @@ -4589,7 +4635,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", - "referenceNumber": 64, + "referenceNumber": 69, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": [ @@ -4603,7 +4649,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", - "referenceNumber": 177, + "referenceNumber": 524, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": [ @@ -4617,7 +4663,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-or-later.json", - "referenceNumber": 24, + "referenceNumber": 336, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": [ @@ -4631,7 +4677,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", - "referenceNumber": 578, + "referenceNumber": 381, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": [ @@ -4646,7 +4692,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", - "referenceNumber": 233, + "referenceNumber": 303, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": [ @@ -4661,7 +4707,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", - "referenceNumber": 3, + "referenceNumber": 225, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": [ @@ -4676,7 +4722,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-or-later.json", - "referenceNumber": 262, + "referenceNumber": 411, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": [ @@ -4691,7 +4737,7 @@ "reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", - "referenceNumber": 477, + "referenceNumber": 87, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": [ @@ -4703,7 +4749,7 @@ "reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", - "referenceNumber": 186, + "referenceNumber": 531, "name": "libpng License", "licenseId": "Libpng", "seeAlso": [ @@ -4715,7 +4761,7 @@ "reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", - "referenceNumber": 257, + "referenceNumber": 149, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": [ @@ -4727,7 +4773,7 @@ "reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", - "referenceNumber": 556, + "referenceNumber": 320, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": [ @@ -4739,7 +4785,7 @@ "reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", - "referenceNumber": 392, + "referenceNumber": 24, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": [ @@ -4751,7 +4797,7 @@ "reference": "https://spdx.org/licenses/libutil-David-Nugent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", - "referenceNumber": 400, + "referenceNumber": 662, "name": "libutil David Nugent License", "licenseId": "libutil-David-Nugent", "seeAlso": [ @@ -4764,7 +4810,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", - "referenceNumber": 43, + "referenceNumber": 150, "name": "Licence Libre du Québec – Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": [ @@ -4777,7 +4823,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", - "referenceNumber": 74, + "referenceNumber": 203, "name": "Licence Libre du Québec – Réciprocité version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": [ @@ -4790,7 +4836,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", - "referenceNumber": 40, + "referenceNumber": 314, "name": "Licence Libre du Québec – Réciprocité forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": [ @@ -4803,7 +4849,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-1-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-1-para.json", - "referenceNumber": 339, + "referenceNumber": 577, "name": "Linux man-pages - 1 paragraph", "licenseId": "Linux-man-pages-1-para", "seeAlso": [ @@ -4815,7 +4861,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", - "referenceNumber": 590, + "referenceNumber": 213, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": [ @@ -4827,7 +4873,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.json", - "referenceNumber": 86, + "referenceNumber": 352, "name": "Linux man-pages Copyleft - 2 paragraphs", "licenseId": "Linux-man-pages-copyleft-2-para", "seeAlso": [ @@ -4840,7 +4886,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.json", - "referenceNumber": 337, + "referenceNumber": 186, "name": "Linux man-pages Copyleft Variant", "licenseId": "Linux-man-pages-copyleft-var", "seeAlso": [ @@ -4852,7 +4898,7 @@ "reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", - "referenceNumber": 613, + "referenceNumber": 278, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": [ @@ -4864,7 +4910,7 @@ "reference": "https://spdx.org/licenses/LOOP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LOOP.json", - "referenceNumber": 607, + "referenceNumber": 521, "name": "Common Lisp LOOP License", "licenseId": "LOOP", "seeAlso": [ @@ -4881,7 +4927,7 @@ "reference": "https://spdx.org/licenses/LPD-document.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPD-document.json", - "referenceNumber": 522, + "referenceNumber": 561, "name": "LPD Documentation License", "licenseId": "LPD-document", "seeAlso": [ @@ -4894,7 +4940,7 @@ "reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", - "referenceNumber": 196, + "referenceNumber": 267, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": [ @@ -4906,7 +4952,7 @@ "reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", - "referenceNumber": 69, + "referenceNumber": 122, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": [ @@ -4920,7 +4966,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", - "referenceNumber": 215, + "referenceNumber": 133, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": [ @@ -4932,7 +4978,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", - "referenceNumber": 114, + "referenceNumber": 284, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": [ @@ -4944,7 +4990,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", - "referenceNumber": 435, + "referenceNumber": 407, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": [ @@ -4957,7 +5003,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", - "referenceNumber": 18, + "referenceNumber": 510, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": [ @@ -4970,7 +5016,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", - "referenceNumber": 240, + "referenceNumber": 300, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": [ @@ -4983,7 +5029,7 @@ "reference": "https://spdx.org/licenses/lsof.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/lsof.json", - "referenceNumber": 605, + "referenceNumber": 76, "name": "lsof License", "licenseId": "lsof", "seeAlso": [ @@ -4995,7 +5041,7 @@ "reference": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.json", - "referenceNumber": 399, + "referenceNumber": 383, "name": "Lucida Bitmap Fonts License", "licenseId": "Lucida-Bitmap-Fonts", "seeAlso": [ @@ -5007,7 +5053,7 @@ "reference": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.json", - "referenceNumber": 430, + "referenceNumber": 239, "name": "LZMA SDK License (versions 9.11 to 9.20)", "licenseId": "LZMA-SDK-9.11-to-9.20", "seeAlso": [ @@ -5020,7 +5066,7 @@ "reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", - "referenceNumber": 244, + "referenceNumber": 600, "name": "LZMA SDK License (versions 9.22 and beyond)", "licenseId": "LZMA-SDK-9.22", "seeAlso": [ @@ -5033,7 +5079,7 @@ "reference": "https://spdx.org/licenses/Mackerras-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause.json", - "referenceNumber": 59, + "referenceNumber": 540, "name": "Mackerras 3-Clause License", "licenseId": "Mackerras-3-Clause", "seeAlso": [ @@ -5045,7 +5091,7 @@ "reference": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.json", - "referenceNumber": 598, + "referenceNumber": 176, "name": "Mackerras 3-Clause - acknowledgment variant", "licenseId": "Mackerras-3-Clause-acknowledgment", "seeAlso": [ @@ -5057,7 +5103,7 @@ "reference": "https://spdx.org/licenses/magaz.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/magaz.json", - "referenceNumber": 516, + "referenceNumber": 93, "name": "magaz License", "licenseId": "magaz", "seeAlso": [ @@ -5069,7 +5115,7 @@ "reference": "https://spdx.org/licenses/mailprio.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mailprio.json", - "referenceNumber": 179, + "referenceNumber": 292, "name": "mailprio License", "licenseId": "mailprio", "seeAlso": [ @@ -5081,7 +5127,7 @@ "reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", - "referenceNumber": 206, + "referenceNumber": 552, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": [ @@ -5093,7 +5139,7 @@ "reference": "https://spdx.org/licenses/Martin-Birgmeier.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Martin-Birgmeier.json", - "referenceNumber": 535, + "referenceNumber": 364, "name": "Martin Birgmeier License", "licenseId": "Martin-Birgmeier", "seeAlso": [ @@ -5105,7 +5151,7 @@ "reference": "https://spdx.org/licenses/McPhee-slideshow.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/McPhee-slideshow.json", - "referenceNumber": 492, + "referenceNumber": 511, "name": "McPhee Slideshow License", "licenseId": "McPhee-slideshow", "seeAlso": [ @@ -5117,7 +5163,7 @@ "reference": "https://spdx.org/licenses/metamail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/metamail.json", - "referenceNumber": 437, + "referenceNumber": 325, "name": "metamail License", "licenseId": "metamail", "seeAlso": [ @@ -5129,7 +5175,7 @@ "reference": "https://spdx.org/licenses/Minpack.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Minpack.json", - "referenceNumber": 512, + "referenceNumber": 634, "name": "Minpack License", "licenseId": "Minpack", "seeAlso": [ @@ -5142,7 +5188,7 @@ "reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", - "referenceNumber": 183, + "referenceNumber": 202, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": [ @@ -5154,7 +5200,7 @@ "reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", - "referenceNumber": 608, + "referenceNumber": 601, "name": "MIT License", "licenseId": "MIT", "seeAlso": [ @@ -5167,7 +5213,7 @@ "reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", - "referenceNumber": 395, + "referenceNumber": 587, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": [ @@ -5181,7 +5227,7 @@ "reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", - "referenceNumber": 293, + "referenceNumber": 39, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": [ @@ -5193,7 +5239,7 @@ "reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", - "referenceNumber": 575, + "referenceNumber": 36, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": [ @@ -5206,7 +5252,7 @@ "reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", - "referenceNumber": 638, + "referenceNumber": 207, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": [ @@ -5218,7 +5264,7 @@ "reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", - "referenceNumber": 53, + "referenceNumber": 146, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": [ @@ -5230,7 +5276,7 @@ "reference": "https://spdx.org/licenses/MIT-Festival.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Festival.json", - "referenceNumber": 317, + "referenceNumber": 431, "name": "MIT Festival Variant", "licenseId": "MIT-Festival", "seeAlso": [ @@ -5243,7 +5289,7 @@ "reference": "https://spdx.org/licenses/MIT-Khronos-old.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Khronos-old.json", - "referenceNumber": 249, + "referenceNumber": 68, "name": "MIT Khronos - old variant", "licenseId": "MIT-Khronos-old", "seeAlso": [ @@ -5255,7 +5301,7 @@ "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", - "referenceNumber": 424, + "referenceNumber": 92, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": [ @@ -5269,7 +5315,7 @@ "reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", - "referenceNumber": 283, + "referenceNumber": 520, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": [ @@ -5284,7 +5330,7 @@ "reference": "https://spdx.org/licenses/MIT-testregex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-testregex.json", - "referenceNumber": 427, + "referenceNumber": 578, "name": "MIT testregex Variant", "licenseId": "MIT-testregex", "seeAlso": [ @@ -5296,7 +5342,7 @@ "reference": "https://spdx.org/licenses/MIT-Wu.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Wu.json", - "referenceNumber": 459, + "referenceNumber": 156, "name": "MIT Tom Wu Variant", "licenseId": "MIT-Wu", "seeAlso": [ @@ -5308,7 +5354,7 @@ "reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", - "referenceNumber": 157, + "referenceNumber": 650, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": [ @@ -5320,7 +5366,7 @@ "reference": "https://spdx.org/licenses/MMIXware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MMIXware.json", - "referenceNumber": 474, + "referenceNumber": 444, "name": "MMIXware License", "licenseId": "MMIXware", "seeAlso": [ @@ -5332,7 +5378,7 @@ "reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", - "referenceNumber": 627, + "referenceNumber": 31, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": [ @@ -5344,7 +5390,7 @@ "reference": "https://spdx.org/licenses/MPEG-SSG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPEG-SSG.json", - "referenceNumber": 417, + "referenceNumber": 323, "name": "MPEG Software Simulation", "licenseId": "MPEG-SSG", "seeAlso": [ @@ -5356,7 +5402,7 @@ "reference": "https://spdx.org/licenses/mpi-permissive.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", - "referenceNumber": 80, + "referenceNumber": 459, "name": "mpi Permissive License", "licenseId": "mpi-permissive", "seeAlso": [ @@ -5368,7 +5414,7 @@ "reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", - "referenceNumber": 482, + "referenceNumber": 448, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": [ @@ -5380,7 +5426,7 @@ "reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", - "referenceNumber": 28, + "referenceNumber": 248, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": [ @@ -5393,7 +5439,7 @@ "reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", - "referenceNumber": 619, + "referenceNumber": 219, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": [ @@ -5407,7 +5453,7 @@ "reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", - "referenceNumber": 263, + "referenceNumber": 147, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": [ @@ -5421,7 +5467,7 @@ "reference": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", - "referenceNumber": 455, + "referenceNumber": 529, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": [ @@ -5434,7 +5480,7 @@ "reference": "https://spdx.org/licenses/mplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mplus.json", - "referenceNumber": 541, + "referenceNumber": 553, "name": "mplus Font License", "licenseId": "mplus", "seeAlso": [ @@ -5446,7 +5492,7 @@ "reference": "https://spdx.org/licenses/MS-LPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", - "referenceNumber": 528, + "referenceNumber": 412, "name": "Microsoft Limited Public License", "licenseId": "MS-LPL", "seeAlso": [ @@ -5460,7 +5506,7 @@ "reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", - "referenceNumber": 499, + "referenceNumber": 360, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": [ @@ -5474,7 +5520,7 @@ "reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", - "referenceNumber": 343, + "referenceNumber": 212, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": [ @@ -5488,7 +5534,7 @@ "reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", - "referenceNumber": 137, + "referenceNumber": 610, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": [ @@ -5500,7 +5546,7 @@ "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", - "referenceNumber": 107, + "referenceNumber": 236, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": [ @@ -5513,7 +5559,7 @@ "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", - "referenceNumber": 490, + "referenceNumber": 523, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": [ @@ -5525,7 +5571,7 @@ "reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", - "referenceNumber": 573, + "referenceNumber": 462, "name": "Multics License", "licenseId": "Multics", "seeAlso": [ @@ -5537,7 +5583,7 @@ "reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", - "referenceNumber": 440, + "referenceNumber": 515, "name": "Mup License", "licenseId": "Mup", "seeAlso": [ @@ -5549,7 +5595,7 @@ "reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", - "referenceNumber": 104, + "referenceNumber": 118, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": [ @@ -5562,7 +5608,7 @@ "reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", - "referenceNumber": 127, + "referenceNumber": 488, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": [ @@ -5576,7 +5622,7 @@ "reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", - "referenceNumber": 128, + "referenceNumber": 400, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": [ @@ -5588,7 +5634,7 @@ "reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", - "referenceNumber": 41, + "referenceNumber": 168, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": [ @@ -5600,7 +5646,7 @@ "reference": "https://spdx.org/licenses/NCBI-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCBI-PD.json", - "referenceNumber": 362, + "referenceNumber": 599, "name": "NCBI Public Domain Notice", "licenseId": "NCBI-PD", "seeAlso": [ @@ -5616,7 +5662,7 @@ "reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", - "referenceNumber": 320, + "referenceNumber": 130, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": [ @@ -5628,7 +5674,7 @@ "reference": "https://spdx.org/licenses/NCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCL.json", - "referenceNumber": 153, + "referenceNumber": 516, "name": "NCL Source Code License", "licenseId": "NCL", "seeAlso": [ @@ -5640,7 +5686,7 @@ "reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", - "referenceNumber": 557, + "referenceNumber": 652, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": [ @@ -5652,9 +5698,9 @@ }, { "reference": "https://spdx.org/licenses/Net-SNMP.html", - "isDeprecatedLicenseId": false, + "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", - "referenceNumber": 234, + "referenceNumber": 469, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": [ @@ -5666,7 +5712,7 @@ "reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", - "referenceNumber": 503, + "referenceNumber": 189, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": [ @@ -5678,7 +5724,7 @@ "reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", - "referenceNumber": 412, + "referenceNumber": 499, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": [ @@ -5690,7 +5736,7 @@ "reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", - "referenceNumber": 275, + "referenceNumber": 167, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": [ @@ -5702,7 +5748,7 @@ "reference": "https://spdx.org/licenses/NICTA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", - "referenceNumber": 311, + "referenceNumber": 486, "name": "NICTA Public Software License, Version 1.0", "licenseId": "NICTA-1.0", "seeAlso": [ @@ -5714,7 +5760,7 @@ "reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", - "referenceNumber": 309, + "referenceNumber": 194, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": [ @@ -5727,7 +5773,7 @@ "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", - "referenceNumber": 34, + "referenceNumber": 223, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": [ @@ -5740,7 +5786,7 @@ "reference": "https://spdx.org/licenses/NIST-Software.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-Software.json", - "referenceNumber": 76, + "referenceNumber": 251, "name": "NIST Software License", "licenseId": "NIST-Software", "seeAlso": [ @@ -5752,7 +5798,7 @@ "reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", - "referenceNumber": 565, + "referenceNumber": 294, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": [ @@ -5764,7 +5810,7 @@ "reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", - "referenceNumber": 483, + "referenceNumber": 566, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": [ @@ -5776,7 +5822,7 @@ "reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", - "referenceNumber": 71, + "referenceNumber": 367, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": [ @@ -5788,7 +5834,7 @@ "reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", - "referenceNumber": 44, + "referenceNumber": 145, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": [ @@ -5801,7 +5847,7 @@ "reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", - "referenceNumber": 126, + "referenceNumber": 254, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": [ @@ -5814,7 +5860,7 @@ "reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", - "referenceNumber": 534, + "referenceNumber": 30, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": [ @@ -5826,7 +5872,7 @@ "reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", - "referenceNumber": 346, + "referenceNumber": 211, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": [ @@ -5839,7 +5885,7 @@ "reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", - "referenceNumber": 418, + "referenceNumber": 595, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": [ @@ -5852,7 +5898,7 @@ "reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", - "referenceNumber": 579, + "referenceNumber": 664, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": [ @@ -5864,7 +5910,7 @@ "reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", - "referenceNumber": 230, + "referenceNumber": 113, "name": "NRL License", "licenseId": "NRL", "seeAlso": [ @@ -5876,7 +5922,7 @@ "reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", - "referenceNumber": 547, + "referenceNumber": 390, "name": "NTP License", "licenseId": "NTP", "seeAlso": [ @@ -5888,7 +5934,7 @@ "reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", - "referenceNumber": 460, + "referenceNumber": 64, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": [ @@ -5900,7 +5946,7 @@ "reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", - "referenceNumber": 634, + "referenceNumber": 27, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": [ @@ -5913,7 +5959,7 @@ "reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", - "referenceNumber": 191, + "referenceNumber": 161, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": [ @@ -5926,7 +5972,7 @@ "reference": "https://spdx.org/licenses/OAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OAR.json", - "referenceNumber": 4, + "referenceNumber": 100, "name": "OAR License", "licenseId": "OAR", "seeAlso": [ @@ -5938,7 +5984,7 @@ "reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", - "referenceNumber": 596, + "referenceNumber": 408, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": [ @@ -5950,7 +5996,7 @@ "reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", - "referenceNumber": 308, + "referenceNumber": 468, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": [ @@ -5963,7 +6009,7 @@ "reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", - "referenceNumber": 243, + "referenceNumber": 611, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": [ @@ -5977,7 +6023,7 @@ "reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", - "referenceNumber": 7, + "referenceNumber": 15, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": [ @@ -5989,7 +6035,7 @@ "reference": "https://spdx.org/licenses/OFFIS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFFIS.json", - "referenceNumber": 238, + "referenceNumber": 418, "name": "OFFIS License", "licenseId": "OFFIS", "seeAlso": [ @@ -6001,7 +6047,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", - "referenceNumber": 475, + "referenceNumber": 603, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": [ @@ -6014,7 +6060,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-no-RFN.json", - "referenceNumber": 23, + "referenceNumber": 545, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": [ @@ -6026,7 +6072,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", - "referenceNumber": 11, + "referenceNumber": 446, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": [ @@ -6038,7 +6084,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", - "referenceNumber": 248, + "referenceNumber": 0, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": [ @@ -6052,7 +6098,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-no-RFN.json", - "referenceNumber": 550, + "referenceNumber": 110, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": [ @@ -6065,7 +6111,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", - "referenceNumber": 507, + "referenceNumber": 90, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": [ @@ -6078,7 +6124,7 @@ "reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", - "referenceNumber": 166, + "referenceNumber": 504, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": [ @@ -6090,7 +6136,7 @@ "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", - "referenceNumber": 468, + "referenceNumber": 23, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": [ @@ -6102,7 +6148,7 @@ "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", - "referenceNumber": 464, + "referenceNumber": 40, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": [ @@ -6114,7 +6160,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", - "referenceNumber": 489, + "referenceNumber": 497, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": [ @@ -6126,7 +6172,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", - "referenceNumber": 467, + "referenceNumber": 556, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": [ @@ -6138,7 +6184,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", - "referenceNumber": 151, + "referenceNumber": 585, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": [ @@ -6150,7 +6196,7 @@ "reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", - "referenceNumber": 367, + "referenceNumber": 97, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": [ @@ -6163,7 +6209,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", - "referenceNumber": 180, + "referenceNumber": 420, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": [ @@ -6175,7 +6221,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", - "referenceNumber": 229, + "referenceNumber": 487, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": [ @@ -6187,7 +6233,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", - "referenceNumber": 224, + "referenceNumber": 627, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": [ @@ -6199,7 +6245,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", - "referenceNumber": 255, + "referenceNumber": 45, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": [ @@ -6211,7 +6257,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", - "referenceNumber": 208, + "referenceNumber": 537, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": [ @@ -6223,7 +6269,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", - "referenceNumber": 79, + "referenceNumber": 179, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": [ @@ -6235,7 +6281,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", - "referenceNumber": 360, + "referenceNumber": 342, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": [ @@ -6247,7 +6293,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", - "referenceNumber": 316, + "referenceNumber": 347, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": [ @@ -6259,7 +6305,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", - "referenceNumber": 426, + "referenceNumber": 208, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": [ @@ -6271,7 +6317,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", - "referenceNumber": 384, + "referenceNumber": 312, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": [ @@ -6283,7 +6329,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", - "referenceNumber": 381, + "referenceNumber": 276, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": [ @@ -6296,7 +6342,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", - "referenceNumber": 93, + "referenceNumber": 108, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": [ @@ -6308,7 +6354,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", - "referenceNumber": 651, + "referenceNumber": 518, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": [ @@ -6320,7 +6366,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", - "referenceNumber": 568, + "referenceNumber": 275, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": [ @@ -6332,7 +6378,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", - "referenceNumber": 220, + "referenceNumber": 79, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": [ @@ -6345,7 +6391,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", - "referenceNumber": 5, + "referenceNumber": 72, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": [ @@ -6357,7 +6403,7 @@ "reference": "https://spdx.org/licenses/OLFL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLFL-1.3.json", - "referenceNumber": 142, + "referenceNumber": 204, "name": "Open Logistics Foundation License Version 1.3", "licenseId": "OLFL-1.3", "seeAlso": [ @@ -6370,7 +6416,7 @@ "reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", - "referenceNumber": 375, + "referenceNumber": 505, "name": "Open Market License", "licenseId": "OML", "seeAlso": [ @@ -6382,7 +6428,7 @@ "reference": "https://spdx.org/licenses/OpenPBS-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenPBS-2.3.json", - "referenceNumber": 314, + "referenceNumber": 159, "name": "OpenPBS v2.3 Software License", "licenseId": "OpenPBS-2.3", "seeAlso": [ @@ -6395,7 +6441,7 @@ "reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", - "referenceNumber": 303, + "referenceNumber": 445, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": [ @@ -6408,7 +6454,7 @@ "reference": "https://spdx.org/licenses/OpenSSL-standalone.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL-standalone.json", - "referenceNumber": 602, + "referenceNumber": 635, "name": "OpenSSL License - standalone", "licenseId": "OpenSSL-standalone", "seeAlso": [ @@ -6421,7 +6467,7 @@ "reference": "https://spdx.org/licenses/OpenVision.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenVision.json", - "referenceNumber": 588, + "referenceNumber": 589, "name": "OpenVision License", "licenseId": "OpenVision", "seeAlso": [ @@ -6435,7 +6481,7 @@ "reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", - "referenceNumber": 91, + "referenceNumber": 80, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": [ @@ -6449,7 +6495,7 @@ "reference": "https://spdx.org/licenses/OPL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-UK-3.0.json", - "referenceNumber": 480, + "referenceNumber": 19, "name": "United Kingdom Open Parliament Licence v3.0", "licenseId": "OPL-UK-3.0", "seeAlso": [ @@ -6461,7 +6507,7 @@ "reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", - "referenceNumber": 329, + "referenceNumber": 266, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": [ @@ -6475,7 +6521,7 @@ "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", - "referenceNumber": 517, + "referenceNumber": 307, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": [ @@ -6488,7 +6534,7 @@ "reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", - "referenceNumber": 162, + "referenceNumber": 306, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": [ @@ -6501,7 +6547,7 @@ "reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", - "referenceNumber": 586, + "referenceNumber": 111, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": [ @@ -6514,7 +6560,7 @@ "reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", - "referenceNumber": 531, + "referenceNumber": 457, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": [ @@ -6527,7 +6573,7 @@ "reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", - "referenceNumber": 138, + "referenceNumber": 247, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": [ @@ -6541,7 +6587,7 @@ "reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", - "referenceNumber": 300, + "referenceNumber": 432, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": [ @@ -6555,7 +6601,7 @@ "reference": "https://spdx.org/licenses/PADL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PADL.json", - "referenceNumber": 113, + "referenceNumber": 43, "name": "PADL License", "licenseId": "PADL", "seeAlso": [ @@ -6567,7 +6613,7 @@ "reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", - "referenceNumber": 246, + "referenceNumber": 49, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": [ @@ -6579,7 +6625,7 @@ "reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", - "referenceNumber": 212, + "referenceNumber": 482, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": [ @@ -6591,7 +6637,7 @@ "reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", - "referenceNumber": 493, + "referenceNumber": 210, "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", "licenseId": "PDDL-1.0", "seeAlso": [ @@ -6604,7 +6650,7 @@ "reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", - "referenceNumber": 584, + "referenceNumber": 580, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": [ @@ -6617,7 +6663,7 @@ "reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", - "referenceNumber": 538, + "referenceNumber": 594, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": [ @@ -6630,7 +6676,7 @@ "reference": "https://spdx.org/licenses/Pixar.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Pixar.json", - "referenceNumber": 204, + "referenceNumber": 619, "name": "Pixar License", "licenseId": "Pixar", "seeAlso": [ @@ -6644,7 +6690,7 @@ "reference": "https://spdx.org/licenses/pkgconf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/pkgconf.json", - "referenceNumber": 389, + "referenceNumber": 16, "name": "pkgconf License", "licenseId": "pkgconf", "seeAlso": [ @@ -6656,7 +6702,7 @@ "reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", - "referenceNumber": 141, + "referenceNumber": 442, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": [ @@ -6668,7 +6714,7 @@ "reference": "https://spdx.org/licenses/pnmstitch.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/pnmstitch.json", - "referenceNumber": 158, + "referenceNumber": 502, "name": "pnmstitch License", "licenseId": "pnmstitch", "seeAlso": [ @@ -6680,7 +6726,7 @@ "reference": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", - "referenceNumber": 54, + "referenceNumber": 575, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": [ @@ -6692,7 +6738,7 @@ "reference": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", - "referenceNumber": 594, + "referenceNumber": 9, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": [ @@ -6704,7 +6750,7 @@ "reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", - "referenceNumber": 643, + "referenceNumber": 94, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": [ @@ -6717,7 +6763,7 @@ "reference": "https://spdx.org/licenses/PPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PPL.json", - "referenceNumber": 580, + "referenceNumber": 454, "name": "Peer Production License", "licenseId": "PPL", "seeAlso": [ @@ -6731,7 +6777,7 @@ "reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", - "referenceNumber": 55, + "referenceNumber": 62, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": [ @@ -6743,7 +6789,7 @@ "reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", - "referenceNumber": 555, + "referenceNumber": 279, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": [ @@ -6755,7 +6801,7 @@ "reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", - "referenceNumber": 260, + "referenceNumber": 387, "name": "psutils License", "licenseId": "psutils", "seeAlso": [ @@ -6767,7 +6813,7 @@ "reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", - "referenceNumber": 285, + "referenceNumber": 498, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": [ @@ -6780,7 +6826,7 @@ "reference": "https://spdx.org/licenses/Python-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", - "referenceNumber": 201, + "referenceNumber": 453, "name": "Python License 2.0.1", "licenseId": "Python-2.0.1", "seeAlso": [ @@ -6794,7 +6840,7 @@ "reference": "https://spdx.org/licenses/python-ldap.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/python-ldap.json", - "referenceNumber": 446, + "referenceNumber": 422, "name": "Python ldap License", "licenseId": "python-ldap", "seeAlso": [ @@ -6806,7 +6852,7 @@ "reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", - "referenceNumber": 326, + "referenceNumber": 123, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": [ @@ -6818,7 +6864,7 @@ "reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", - "referenceNumber": 413, + "referenceNumber": 329, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": [ @@ -6833,7 +6879,7 @@ "reference": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.json", - "referenceNumber": 486, + "referenceNumber": 479, "name": "Q Public License 1.0 - INRIA 2004 variant", "licenseId": "QPL-1.0-INRIA-2004", "seeAlso": [ @@ -6845,7 +6891,7 @@ "reference": "https://spdx.org/licenses/radvd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/radvd.json", - "referenceNumber": 433, + "referenceNumber": 182, "name": "radvd License", "licenseId": "radvd", "seeAlso": [ @@ -6857,7 +6903,7 @@ "reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", - "referenceNumber": 50, + "referenceNumber": 101, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": [ @@ -6869,7 +6915,7 @@ "reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", - "referenceNumber": 99, + "referenceNumber": 373, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": [ @@ -6882,7 +6928,7 @@ "reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", - "referenceNumber": 205, + "referenceNumber": 369, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": [ @@ -6894,7 +6940,7 @@ "reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", - "referenceNumber": 52, + "referenceNumber": 102, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": [ @@ -6906,7 +6952,7 @@ "reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", - "referenceNumber": 637, + "referenceNumber": 663, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": [ @@ -6920,7 +6966,7 @@ "reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", - "referenceNumber": 496, + "referenceNumber": 139, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": [ @@ -6932,7 +6978,7 @@ "reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", - "referenceNumber": 235, + "referenceNumber": 405, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": [ @@ -6945,7 +6991,7 @@ "reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", - "referenceNumber": 223, + "referenceNumber": 192, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": [ @@ -6954,11 +7000,25 @@ "isOsiApproved": false, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/Ruby-pty.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Ruby-pty.json", + "referenceNumber": 473, + "name": "Ruby pty extension license", + "licenseId": "Ruby-pty", + "seeAlso": [ + "https://github.com/ruby/ruby/blob/9f6deaa6888a423720b4b127b5314f0ad26cc2e6/ext/pty/pty.c#L775-L786", + "https://github.com/ruby/ruby/commit/0a64817fb80016030c03518fb9459f63c11605ea#diff-ef5fa30838d6d0cecad9e675cc50b24628cfe2cb277c346053fafcc36c91c204", + "https://github.com/ruby/ruby/commit/0a64817fb80016030c03518fb9459f63c11605ea#diff-fedf217c1ce44bda01f0a678d3ff8b198bed478754d699c527a698ad933979a0" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/SAX-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", - "referenceNumber": 301, + "referenceNumber": 205, "name": "Sax Public Domain Notice", "licenseId": "SAX-PD", "seeAlso": [ @@ -6970,7 +7030,7 @@ "reference": "https://spdx.org/licenses/SAX-PD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD-2.0.json", - "referenceNumber": 561, + "referenceNumber": 209, "name": "Sax Public Domain Notice 2.0", "licenseId": "SAX-PD-2.0", "seeAlso": [ @@ -6982,7 +7042,7 @@ "reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", - "referenceNumber": 109, + "referenceNumber": 67, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": [ @@ -6994,7 +7054,7 @@ "reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", - "referenceNumber": 35, + "referenceNumber": 617, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": [ @@ -7006,7 +7066,7 @@ "reference": "https://spdx.org/licenses/SchemeReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", - "referenceNumber": 425, + "referenceNumber": 472, "name": "Scheme Language Report License", "licenseId": "SchemeReport", "seeAlso": [], @@ -7016,7 +7076,7 @@ "reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", - "referenceNumber": 274, + "referenceNumber": 135, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": [ @@ -7029,7 +7089,7 @@ "reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", - "referenceNumber": 247, + "referenceNumber": 226, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": [ @@ -7042,7 +7102,7 @@ "reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", - "referenceNumber": 476, + "referenceNumber": 631, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": [ @@ -7054,7 +7114,7 @@ "reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", - "referenceNumber": 456, + "referenceNumber": 48, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": [ @@ -7066,7 +7126,7 @@ "reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", - "referenceNumber": 405, + "referenceNumber": 193, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": [ @@ -7079,7 +7139,7 @@ "reference": "https://spdx.org/licenses/SGI-OpenGL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-OpenGL.json", - "referenceNumber": 629, + "referenceNumber": 565, "name": "SGI OpenGL License", "licenseId": "SGI-OpenGL", "seeAlso": [ @@ -7091,7 +7151,7 @@ "reference": "https://spdx.org/licenses/SGP4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGP4.json", - "referenceNumber": 336, + "referenceNumber": 291, "name": "SGP4 Permission Notice", "licenseId": "SGP4", "seeAlso": [ @@ -7103,7 +7163,7 @@ "reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", - "referenceNumber": 338, + "referenceNumber": 623, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": [ @@ -7115,7 +7175,7 @@ "reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", - "referenceNumber": 29, + "referenceNumber": 34, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": [ @@ -7127,7 +7187,7 @@ "reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", - "referenceNumber": 444, + "referenceNumber": 630, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": [ @@ -7139,7 +7199,7 @@ "reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", - "referenceNumber": 268, + "referenceNumber": 655, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": [ @@ -7153,7 +7213,7 @@ "reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", - "referenceNumber": 502, + "referenceNumber": 401, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": [ @@ -7165,7 +7225,7 @@ "reference": "https://spdx.org/licenses/SL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SL.json", - "referenceNumber": 645, + "referenceNumber": 632, "name": "SL License", "licenseId": "SL", "seeAlso": [ @@ -7177,7 +7237,7 @@ "reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", - "referenceNumber": 182, + "referenceNumber": 283, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": [ @@ -7190,7 +7250,7 @@ "reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", - "referenceNumber": 148, + "referenceNumber": 413, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": [ @@ -7203,7 +7263,7 @@ "reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", - "referenceNumber": 250, + "referenceNumber": 321, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": [ @@ -7215,7 +7275,7 @@ "reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", - "referenceNumber": 518, + "referenceNumber": 41, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": [ @@ -7227,7 +7287,7 @@ "reference": "https://spdx.org/licenses/snprintf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/snprintf.json", - "referenceNumber": 161, + "referenceNumber": 507, "name": "snprintf License", "licenseId": "snprintf", "seeAlso": [ @@ -7239,7 +7299,7 @@ "reference": "https://spdx.org/licenses/softSurfer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/softSurfer.json", - "referenceNumber": 523, + "referenceNumber": 496, "name": "softSurfer License", "licenseId": "softSurfer", "seeAlso": [ @@ -7252,7 +7312,7 @@ "reference": "https://spdx.org/licenses/Soundex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Soundex.json", - "referenceNumber": 368, + "referenceNumber": 1, "name": "Soundex License", "licenseId": "Soundex", "seeAlso": [ @@ -7264,7 +7324,7 @@ "reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", - "referenceNumber": 472, + "referenceNumber": 257, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": [ @@ -7276,7 +7336,7 @@ "reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", - "referenceNumber": 378, + "referenceNumber": 228, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": [ @@ -7289,7 +7349,7 @@ "reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", - "referenceNumber": 139, + "referenceNumber": 287, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": [ @@ -7301,7 +7361,7 @@ "reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", - "referenceNumber": 280, + "referenceNumber": 576, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": [ @@ -7314,7 +7374,7 @@ "reference": "https://spdx.org/licenses/ssh-keyscan.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ssh-keyscan.json", - "referenceNumber": 294, + "referenceNumber": 78, "name": "ssh-keyscan License", "licenseId": "ssh-keyscan", "seeAlso": [ @@ -7326,7 +7386,7 @@ "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", - "referenceNumber": 506, + "referenceNumber": 536, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": [ @@ -7338,7 +7398,7 @@ "reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", - "referenceNumber": 563, + "referenceNumber": 438, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": [ @@ -7352,7 +7412,7 @@ "reference": "https://spdx.org/licenses/SSLeay-standalone.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSLeay-standalone.json", - "referenceNumber": 591, + "referenceNumber": 421, "name": "SSLeay License - standalone", "licenseId": "SSLeay-standalone", "seeAlso": [ @@ -7364,7 +7424,7 @@ "reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", - "referenceNumber": 17, + "referenceNumber": 295, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": [ @@ -7376,7 +7436,7 @@ "reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", - "referenceNumber": 658, + "referenceNumber": 201, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": [ @@ -7389,7 +7449,7 @@ "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", - "referenceNumber": 42, + "referenceNumber": 11, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": [ @@ -7401,7 +7461,7 @@ "reference": "https://spdx.org/licenses/Sun-PPP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sun-PPP.json", - "referenceNumber": 385, + "referenceNumber": 313, "name": "Sun PPP License", "licenseId": "Sun-PPP", "seeAlso": [ @@ -7413,7 +7473,7 @@ "reference": "https://spdx.org/licenses/Sun-PPP-2000.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sun-PPP-2000.json", - "referenceNumber": 310, + "referenceNumber": 489, "name": "Sun PPP License (2000)", "licenseId": "Sun-PPP-2000", "seeAlso": [ @@ -7425,7 +7485,7 @@ "reference": "https://spdx.org/licenses/SunPro.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SunPro.json", - "referenceNumber": 57, + "referenceNumber": 440, "name": "SunPro License", "licenseId": "SunPro", "seeAlso": [ @@ -7438,7 +7498,7 @@ "reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", - "referenceNumber": 649, + "referenceNumber": 331, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": [ @@ -7450,7 +7510,7 @@ "reference": "https://spdx.org/licenses/swrule.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/swrule.json", - "referenceNumber": 90, + "referenceNumber": 206, "name": "swrule License", "licenseId": "swrule", "seeAlso": [ @@ -7462,7 +7522,7 @@ "reference": "https://spdx.org/licenses/Symlinks.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Symlinks.json", - "referenceNumber": 414, + "referenceNumber": 136, "name": "Symlinks License", "licenseId": "Symlinks", "seeAlso": [ @@ -7474,7 +7534,7 @@ "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", - "referenceNumber": 242, + "referenceNumber": 317, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": [ @@ -7486,7 +7546,7 @@ "reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", - "referenceNumber": 2, + "referenceNumber": 644, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": [ @@ -7499,7 +7559,7 @@ "reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", - "referenceNumber": 9, + "referenceNumber": 245, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": [ @@ -7511,7 +7571,7 @@ "reference": "https://spdx.org/licenses/TermReadKey.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TermReadKey.json", - "referenceNumber": 256, + "referenceNumber": 37, "name": "TermReadKey License", "licenseId": "TermReadKey", "seeAlso": [ @@ -7523,7 +7583,7 @@ "reference": "https://spdx.org/licenses/TGPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TGPPL-1.0.json", - "referenceNumber": 101, + "referenceNumber": 112, "name": "Transitive Grace Period Public Licence 1.0", "licenseId": "TGPPL-1.0", "seeAlso": [ @@ -7536,7 +7596,7 @@ "reference": "https://spdx.org/licenses/threeparttable.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/threeparttable.json", - "referenceNumber": 398, + "referenceNumber": 319, "name": "threeparttable License", "licenseId": "threeparttable", "seeAlso": [ @@ -7548,7 +7608,7 @@ "reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", - "referenceNumber": 539, + "referenceNumber": 509, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": [ @@ -7560,7 +7620,7 @@ "reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", - "referenceNumber": 61, + "referenceNumber": 105, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": [ @@ -7572,7 +7632,7 @@ "reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", - "referenceNumber": 267, + "referenceNumber": 107, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": [ @@ -7584,7 +7644,7 @@ "reference": "https://spdx.org/licenses/TPDL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPDL.json", - "referenceNumber": 75, + "referenceNumber": 124, "name": "Time::ParseDate License", "licenseId": "TPDL", "seeAlso": [ @@ -7596,7 +7656,7 @@ "reference": "https://spdx.org/licenses/TPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPL-1.0.json", - "referenceNumber": 508, + "referenceNumber": 490, "name": "THOR Public License 1.0", "licenseId": "TPL-1.0", "seeAlso": [ @@ -7608,7 +7668,7 @@ "reference": "https://spdx.org/licenses/TTWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTWL.json", - "referenceNumber": 87, + "referenceNumber": 35, "name": "Text-Tabs+Wrap License", "licenseId": "TTWL", "seeAlso": [ @@ -7621,7 +7681,7 @@ "reference": "https://spdx.org/licenses/TTYP0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTYP0.json", - "referenceNumber": 451, + "referenceNumber": 542, "name": "TTYP0 License", "licenseId": "TTYP0", "seeAlso": [ @@ -7633,7 +7693,7 @@ "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", - "referenceNumber": 159, + "referenceNumber": 372, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": [ @@ -7645,7 +7705,7 @@ "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", - "referenceNumber": 624, + "referenceNumber": 246, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": [ @@ -7653,11 +7713,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Ubuntu-font-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Ubuntu-font-1.0.json", + "referenceNumber": 191, + "name": "Ubuntu Font Licence v1.0", + "licenseId": "Ubuntu-font-1.0", + "seeAlso": [ + "https://ubuntu.com/legal/font-licence", + "https://assets.ubuntu.com/v1/81e5605d-ubuntu-font-licence-1.0.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/UCAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCAR.json", - "referenceNumber": 78, + "referenceNumber": 452, "name": "UCAR License", "licenseId": "UCAR", "seeAlso": [ @@ -7669,7 +7742,7 @@ "reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", - "referenceNumber": 646, + "referenceNumber": 550, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": [ @@ -7681,7 +7754,7 @@ "reference": "https://spdx.org/licenses/ulem.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ulem.json", - "referenceNumber": 566, + "referenceNumber": 399, "name": "ulem License", "licenseId": "ulem", "seeAlso": [ @@ -7693,7 +7766,7 @@ "reference": "https://spdx.org/licenses/UMich-Merit.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UMich-Merit.json", - "referenceNumber": 505, + "referenceNumber": 581, "name": "Michigan/Merit Networks License", "licenseId": "UMich-Merit", "seeAlso": [ @@ -7705,7 +7778,7 @@ "reference": "https://spdx.org/licenses/Unicode-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-3.0.json", - "referenceNumber": 46, + "referenceNumber": 262, "name": "Unicode License v3", "licenseId": "Unicode-3.0", "seeAlso": [ @@ -7717,7 +7790,7 @@ "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", - "referenceNumber": 647, + "referenceNumber": 328, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": [ @@ -7729,7 +7802,7 @@ "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", - "referenceNumber": 152, + "referenceNumber": 484, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": [ @@ -7743,7 +7816,7 @@ "reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", - "referenceNumber": 606, + "referenceNumber": 628, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": [ @@ -7756,7 +7829,7 @@ "reference": "https://spdx.org/licenses/UnixCrypt.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UnixCrypt.json", - "referenceNumber": 462, + "referenceNumber": 95, "name": "UnixCrypt License", "licenseId": "UnixCrypt", "seeAlso": [ @@ -7770,7 +7843,7 @@ "reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", - "referenceNumber": 411, + "referenceNumber": 218, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": [ @@ -7783,7 +7856,7 @@ "reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", - "referenceNumber": 511, + "referenceNumber": 5, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": [ @@ -7796,7 +7869,7 @@ "reference": "https://spdx.org/licenses/URT-RLE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/URT-RLE.json", - "referenceNumber": 443, + "referenceNumber": 165, "name": "Utah Raster Toolkit Run Length Encoded License", "licenseId": "URT-RLE", "seeAlso": [ @@ -7809,7 +7882,7 @@ "reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", - "referenceNumber": 371, + "referenceNumber": 549, "name": "Vim License", "licenseId": "Vim", "seeAlso": [ @@ -7822,7 +7895,7 @@ "reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", - "referenceNumber": 122, + "referenceNumber": 544, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": [ @@ -7834,7 +7907,7 @@ "reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", - "referenceNumber": 510, + "referenceNumber": 109, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": [ @@ -7846,7 +7919,7 @@ "reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", - "referenceNumber": 284, + "referenceNumber": 28, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": [ @@ -7860,7 +7933,7 @@ "reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", - "referenceNumber": 156, + "referenceNumber": 629, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": [ @@ -7872,7 +7945,7 @@ "reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", - "referenceNumber": 452, + "referenceNumber": 315, "name": "W3C Software Notice and Document License (2015-05-13)", "licenseId": "W3C-20150513", "seeAlso": [ @@ -7880,13 +7953,13 @@ "https://www.w3.org/copyright/software-license-2015/", "https://www.w3.org/copyright/software-license-2023/" ], - "isOsiApproved": false + "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/w3m.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/w3m.json", - "referenceNumber": 202, + "referenceNumber": 379, "name": "w3m License", "licenseId": "w3m", "seeAlso": [ @@ -7898,7 +7971,7 @@ "reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", - "referenceNumber": 533, + "referenceNumber": 612, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": [ @@ -7911,7 +7984,7 @@ "reference": "https://spdx.org/licenses/Widget-Workshop.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Widget-Workshop.json", - "referenceNumber": 548, + "referenceNumber": 256, "name": "Widget Workshop License", "licenseId": "Widget-Workshop", "seeAlso": [ @@ -7923,7 +7996,7 @@ "reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", - "referenceNumber": 305, + "referenceNumber": 199, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": [ @@ -7935,7 +8008,7 @@ "reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", - "referenceNumber": 176, + "referenceNumber": 173, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": [ @@ -7949,7 +8022,7 @@ "reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", - "referenceNumber": 258, + "referenceNumber": 350, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": [ @@ -7961,7 +8034,7 @@ "reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", - "referenceNumber": 203, + "referenceNumber": 274, "name": "X11 License", "licenseId": "X11", "seeAlso": [ @@ -7974,7 +8047,7 @@ "reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", - "referenceNumber": 112, + "referenceNumber": 286, "name": "X11 License Distribution Modification Variant", "licenseId": "X11-distribute-modifications-variant", "seeAlso": [ @@ -7982,11 +8055,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/X11-swapped.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/X11-swapped.json", + "referenceNumber": 7, + "name": "X11 swapped final paragraphs", + "licenseId": "X11-swapped", + "seeAlso": [ + "https://github.com/fedeinthemix/chez-srfi/blob/master/srfi/LICENSE" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Xdebug-1.03.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xdebug-1.03.json", - "referenceNumber": 10, + "referenceNumber": 471, "name": "Xdebug License v 1.03", "licenseId": "Xdebug-1.03", "seeAlso": [ @@ -7998,7 +8083,7 @@ "reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", - "referenceNumber": 595, + "referenceNumber": 417, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": [ @@ -8010,7 +8095,7 @@ "reference": "https://spdx.org/licenses/Xfig.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xfig.json", - "referenceNumber": 89, + "referenceNumber": 63, "name": "Xfig License", "licenseId": "Xfig", "seeAlso": [ @@ -8024,7 +8109,7 @@ "reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", - "referenceNumber": 562, + "referenceNumber": 311, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": [ @@ -8037,7 +8122,7 @@ "reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", - "referenceNumber": 465, + "referenceNumber": 406, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": [ @@ -8050,7 +8135,7 @@ "reference": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.json", - "referenceNumber": 140, + "referenceNumber": 55, "name": "xkeyboard-config Zinoviev License", "licenseId": "xkeyboard-config-Zinoviev", "seeAlso": [ @@ -8062,7 +8147,7 @@ "reference": "https://spdx.org/licenses/xlock.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xlock.json", - "referenceNumber": 357, + "referenceNumber": 140, "name": "xlock License", "licenseId": "xlock", "seeAlso": [ @@ -8074,7 +8159,7 @@ "reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", - "referenceNumber": 236, + "referenceNumber": 639, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": [ @@ -8086,7 +8171,7 @@ "reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", - "referenceNumber": 312, + "referenceNumber": 243, "name": "XPP License", "licenseId": "xpp", "seeAlso": [ @@ -8098,7 +8183,7 @@ "reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", - "referenceNumber": 544, + "referenceNumber": 535, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": [ @@ -8110,7 +8195,7 @@ "reference": "https://spdx.org/licenses/xzoom.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xzoom.json", - "referenceNumber": 530, + "referenceNumber": 339, "name": "xzoom License", "licenseId": "xzoom", "seeAlso": [ @@ -8122,7 +8207,7 @@ "reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", - "referenceNumber": 491, + "referenceNumber": 506, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": [ @@ -8134,7 +8219,7 @@ "reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", - "referenceNumber": 473, + "referenceNumber": 538, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": [ @@ -8147,7 +8232,7 @@ "reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", - "referenceNumber": 599, + "referenceNumber": 500, "name": "Zed License", "licenseId": "Zed", "seeAlso": [ @@ -8159,7 +8244,7 @@ "reference": "https://spdx.org/licenses/Zeeff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zeeff.json", - "referenceNumber": 218, + "referenceNumber": 382, "name": "Zeeff License", "licenseId": "Zeeff", "seeAlso": [ @@ -8171,7 +8256,7 @@ "reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", - "referenceNumber": 481, + "referenceNumber": 51, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": [ @@ -8184,7 +8269,7 @@ "reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", - "referenceNumber": 379, + "referenceNumber": 555, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": [ @@ -8197,7 +8282,7 @@ "reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", - "referenceNumber": 304, + "referenceNumber": 227, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": [ @@ -8209,7 +8294,7 @@ "reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", - "referenceNumber": 209, + "referenceNumber": 74, "name": "zlib License", "licenseId": "Zlib", "seeAlso": [ @@ -8223,7 +8308,7 @@ "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", - "referenceNumber": 348, + "referenceNumber": 371, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": [ @@ -8235,7 +8320,7 @@ "reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", - "referenceNumber": 545, + "referenceNumber": 598, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": [ @@ -8247,7 +8332,7 @@ "reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", - "referenceNumber": 51, + "referenceNumber": 539, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": [ @@ -8261,7 +8346,7 @@ "reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", - "referenceNumber": 352, + "referenceNumber": 638, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": [ @@ -8271,5 +8356,5 @@ "isFsfLibre": true } ], - "releaseDate": "2024-05-22" + "releaseDate": "2024-08-19" } \ No newline at end of file From d0f88017b43e5c0c18ea7395ae5c3fd04996bfe8 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 14:18:24 +0200 Subject: [PATCH 120/156] Fix up CONTRIBUTING release flow Signed-off-by: Carmen Bianca BAKKER --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6da99c5ee..9b3cb95cf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -111,10 +111,10 @@ possible, run `poetry lock --no-update`. ## Release checklist -- Verify changelog - Create branch release-x.y.z - `bumpver update --set-version vx.y.z` - `make update-resources` +- `protokolo compile -f version x.y.z` - Alter changelog - Do some final tweaks/bugfixes (and alter changelog) - `make test-release` From 18de74d58066defe595cb10cfac61bbf38819913 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 14:18:54 +0200 Subject: [PATCH 121/156] Compile change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 78 +++++++++++++++++++ changelog.d/added/comment-cabal.md | 2 - changelog.d/added/comment-flake-envrc.md | 2 - changelog.d/added/comment-j2.md | 2 - changelog.d/added/completion.md | 1 - changelog.d/added/jujutsu.md | 1 - changelog.d/added/lint-file.md | 1 - changelog.d/added/new-prefixes.md | 2 - changelog.d/added/poetry.md | 1 - changelog.d/changed/00_spec-3.3.md | 3 - changelog.d/changed/click.md | 17 ---- changelog.d/changed/comment-cargo-lock.md | 1 - changelog.d/changed/comment_gnu_as.md | 1 - changelog.d/changed/comment_gnu_ld.md | 1 - changelog.d/changed/no-license-reuse-toml.md | 1 - changelog.d/changed/remove-gitkeep.md | 3 - changelog.d/changed/reuse-toml-ignored.md | 2 - changelog.d/changed/spdx-resources.md | 1 - changelog.d/changed/unspecly-changes.md | 6 -- changelog.d/fixed/glob.md | 2 - changelog.d/fixed/min-version-attrs.md | 2 - changelog.d/fixed/performance.md | 3 - .../fixed/plain-format-output-new-line-fix.md | 2 - changelog.d/fixed/prefix-merge.md | 2 - changelog.d/fixed/source-bug.md | 3 - changelog.d/removed/python-3.8.md | 1 - 26 files changed, 78 insertions(+), 63 deletions(-) delete mode 100644 changelog.d/added/comment-cabal.md delete mode 100644 changelog.d/added/comment-flake-envrc.md delete mode 100644 changelog.d/added/comment-j2.md delete mode 100644 changelog.d/added/completion.md delete mode 100644 changelog.d/added/jujutsu.md delete mode 100644 changelog.d/added/lint-file.md delete mode 100644 changelog.d/added/new-prefixes.md delete mode 100644 changelog.d/added/poetry.md delete mode 100644 changelog.d/changed/00_spec-3.3.md delete mode 100644 changelog.d/changed/click.md delete mode 100644 changelog.d/changed/comment-cargo-lock.md delete mode 100644 changelog.d/changed/comment_gnu_as.md delete mode 100644 changelog.d/changed/comment_gnu_ld.md delete mode 100644 changelog.d/changed/no-license-reuse-toml.md delete mode 100644 changelog.d/changed/remove-gitkeep.md delete mode 100644 changelog.d/changed/reuse-toml-ignored.md delete mode 100644 changelog.d/changed/spdx-resources.md delete mode 100644 changelog.d/changed/unspecly-changes.md delete mode 100644 changelog.d/fixed/glob.md delete mode 100644 changelog.d/fixed/min-version-attrs.md delete mode 100644 changelog.d/fixed/performance.md delete mode 100644 changelog.d/fixed/plain-format-output-new-line-fix.md delete mode 100644 changelog.d/fixed/prefix-merge.md delete mode 100644 changelog.d/fixed/source-bug.md delete mode 100644 changelog.d/removed/python-3.8.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cdd68175..a59aa8bae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,84 @@ CLI command and its behaviour. There are no guarantees of stability for the +## 5.0.0 - 2024-10-17 + +### Added + +- Added `.cabal` and `cabal.project` (Haskell) as recognised file types for + comments. (#1089, #1090) +- Added `.envrc` (Python) and `.flake.lock` (uncommentable) as recognised file + types for comments. (#1061) +- More file types are recognised: + - Ansible Jinja2 (`.j2`) (#1036) +- Added shell completion via `click`. (#1084) +- Add Jujutsu VCS support. (#TODO) +- Add lint-file subcommand to enable running lint on specific files. +- Added new copyright prefixes `spdx-string`, `spdx-string-c`, and + `spdx-string-symbol`. (#979) +- Make poetry.lock uncommentable. (#1037) + +### Changed + +- Bumped REUSE Specification version to + [version 3.3](https://reuse.software/spec-3.3). This is a small change. + (#1069) +- Switched from `argparse` to `click` for handling the CLI. The CLI should still + handle the same, with identical options and arguments, but some stuff changed + under the hood. (#1084) + + Find here a small list of differences: + + - `-h` is no longer shorthand for `--help`. + - `--version` now outputs "reuse, version X.Y.Z", followed by a licensing + blurb on different paragraphs. + - Some options are made explicitly mutually exclusive, such as `annotate`'s + `--skip-unrecognised` and `--style`, and `download`'s `--output` and + `--all`. + - Subcommands which take a list of things (files, license) as arguments, such + as `annotate`, `lint-file`, or `download`, now also allow zero arguments. + This will do nothing, but can be useful in scripting. + - `annotate` and `lint-file` now also take directories as arguments. This will + do nothing, but can be useful in scripting. + +- Allow Python-style comments in Cargo.lock files +- `.s` files (GNU as) now use the C comment style (#1034) +- `.ld` files (GNU ld) now use the C comment style (#1034) +- `REUSE.toml` no longer needs a licensing header. (#1042) +- `.gitkeep` is no longer ignored, because this is not defined in the + specification. However, if `.gitkeep` is a 0-size file, it will remain ignored + (because 0-size files are ignored). (#1043) +- If `REUSE.toml` is ignored by VCS, the linter now also ignores this files. + (#1047) +- SPDX license and exception list updated to v3.25.0. +- Changes that are not strictly compatible with + [REUSE Specification v3.2](https://reuse.software/spec-3.2): + - More `LICENSE` and `COPYING`-like files are ignored. Now, such files + suffixed by `-anything` are also ignored, typically something like + `LICENSE-MIT`. Files with the UK spelling `LICENCE` are also ignored. + (#1041) + +### Removed + +- Python 3.8 support removed. (#1080) + +### Fixed + +- Fixed the globbing of a single asterisk succeeded by a slash (e.g. + `directory-*/foo.py`). The glob previously did nothing. (#1078) +- Increased the minimum requirement of `attrs` to `>=21.3`. Older versions do + not import correctly. (#1044) +- Performance greatly improved for projects with large directories ignored by + VCS. (#1047) +- Performance slightly improved for large projects. (#1047) +- The plain output of `lint` has been slightly improved, getting rid of an + errant newline. (#1091) +- `reuse annotate --merge-copyrights` now works more reliably with copyright + prefixes. This still needs some work, though. (#979) +- In some scenarios, where a user has multiple `REUSE.toml` files and one of + those files could not be parsed, the wrong `REUSE.toml` was signalled as being + unparseable. This is now fixed. (#1047) + ## 4.0.3 - 2024-07-08 ### Fixed diff --git a/changelog.d/added/comment-cabal.md b/changelog.d/added/comment-cabal.md deleted file mode 100644 index 3b52c3caf..000000000 --- a/changelog.d/added/comment-cabal.md +++ /dev/null @@ -1,2 +0,0 @@ -- Added `.cabal` and `cabal.project` (Haskell) as recognised file types for - comments. (#1089, #1090) diff --git a/changelog.d/added/comment-flake-envrc.md b/changelog.d/added/comment-flake-envrc.md deleted file mode 100644 index 1efc46cbf..000000000 --- a/changelog.d/added/comment-flake-envrc.md +++ /dev/null @@ -1,2 +0,0 @@ -- Added `.envrc` (Python) and `.flake.lock` (uncommentable) as recognised file - types for comments. (#1061) diff --git a/changelog.d/added/comment-j2.md b/changelog.d/added/comment-j2.md deleted file mode 100644 index 77386ff17..000000000 --- a/changelog.d/added/comment-j2.md +++ /dev/null @@ -1,2 +0,0 @@ -- More file types are recognised: - - Ansible Jinja2 (`.j2`) (#1036) diff --git a/changelog.d/added/completion.md b/changelog.d/added/completion.md deleted file mode 100644 index 3bd05e0d7..000000000 --- a/changelog.d/added/completion.md +++ /dev/null @@ -1 +0,0 @@ -- Added shell completion via `click`. (#1084) diff --git a/changelog.d/added/jujutsu.md b/changelog.d/added/jujutsu.md deleted file mode 100644 index c005e592f..000000000 --- a/changelog.d/added/jujutsu.md +++ /dev/null @@ -1 +0,0 @@ -- Add Jujutsu VCS support. (#TODO) diff --git a/changelog.d/added/lint-file.md b/changelog.d/added/lint-file.md deleted file mode 100644 index a349d03c8..000000000 --- a/changelog.d/added/lint-file.md +++ /dev/null @@ -1 +0,0 @@ -- Add lint-file subcommand to enable running lint on specific files. diff --git a/changelog.d/added/new-prefixes.md b/changelog.d/added/new-prefixes.md deleted file mode 100644 index 7ff626c73..000000000 --- a/changelog.d/added/new-prefixes.md +++ /dev/null @@ -1,2 +0,0 @@ -- Added new copyright prefixes `spdx-string`, `spdx-string-c`, and - `spdx-string-symbol`. (#979) diff --git a/changelog.d/added/poetry.md b/changelog.d/added/poetry.md deleted file mode 100644 index 44c761708..000000000 --- a/changelog.d/added/poetry.md +++ /dev/null @@ -1 +0,0 @@ -- Make poetry.lock uncommentable. (#1037) diff --git a/changelog.d/changed/00_spec-3.3.md b/changelog.d/changed/00_spec-3.3.md deleted file mode 100644 index 823338dd0..000000000 --- a/changelog.d/changed/00_spec-3.3.md +++ /dev/null @@ -1,3 +0,0 @@ -- Bumped REUSE Specification version to - [version 3.3](https://reuse.software/spec-3.3). This is a small change. - (#1069) diff --git a/changelog.d/changed/click.md b/changelog.d/changed/click.md deleted file mode 100644 index bedc5e5a7..000000000 --- a/changelog.d/changed/click.md +++ /dev/null @@ -1,17 +0,0 @@ -- Switched from `argparse` to `click` for handling the CLI. The CLI should still - handle the same, with identical options and arguments, but some stuff changed - under the hood. (#1084) - - Find here a small list of differences: - - - `-h` is no longer shorthand for `--help`. - - `--version` now outputs "reuse, version X.Y.Z", followed by a licensing - blurb on different paragraphs. - - Some options are made explicitly mutually exclusive, such as `annotate`'s - `--skip-unrecognised` and `--style`, and `download`'s `--output` and - `--all`. - - Subcommands which take a list of things (files, license) as arguments, such - as `annotate`, `lint-file`, or `download`, now also allow zero arguments. - This will do nothing, but can be useful in scripting. - - `annotate` and `lint-file` now also take directories as arguments. This will - do nothing, but can be useful in scripting. diff --git a/changelog.d/changed/comment-cargo-lock.md b/changelog.d/changed/comment-cargo-lock.md deleted file mode 100644 index fa3351020..000000000 --- a/changelog.d/changed/comment-cargo-lock.md +++ /dev/null @@ -1 +0,0 @@ -- Allow Python-style comments in Cargo.lock files diff --git a/changelog.d/changed/comment_gnu_as.md b/changelog.d/changed/comment_gnu_as.md deleted file mode 100644 index 54b5cdaa3..000000000 --- a/changelog.d/changed/comment_gnu_as.md +++ /dev/null @@ -1 +0,0 @@ -- `.s` files (GNU as) now use the C comment style (#1034) diff --git a/changelog.d/changed/comment_gnu_ld.md b/changelog.d/changed/comment_gnu_ld.md deleted file mode 100644 index 8f8b93fc0..000000000 --- a/changelog.d/changed/comment_gnu_ld.md +++ /dev/null @@ -1 +0,0 @@ -- `.ld` files (GNU ld) now use the C comment style (#1034) diff --git a/changelog.d/changed/no-license-reuse-toml.md b/changelog.d/changed/no-license-reuse-toml.md deleted file mode 100644 index e30058221..000000000 --- a/changelog.d/changed/no-license-reuse-toml.md +++ /dev/null @@ -1 +0,0 @@ -- `REUSE.toml` no longer needs a licensing header. (#1042) diff --git a/changelog.d/changed/remove-gitkeep.md b/changelog.d/changed/remove-gitkeep.md deleted file mode 100644 index 451e19cdb..000000000 --- a/changelog.d/changed/remove-gitkeep.md +++ /dev/null @@ -1,3 +0,0 @@ -- `.gitkeep` is no longer ignored, because this is not defined in the - specification. However, if `.gitkeep` is a 0-size file, it will remain ignored - (because 0-size files are ignored). (#1043) diff --git a/changelog.d/changed/reuse-toml-ignored.md b/changelog.d/changed/reuse-toml-ignored.md deleted file mode 100644 index c99ce516b..000000000 --- a/changelog.d/changed/reuse-toml-ignored.md +++ /dev/null @@ -1,2 +0,0 @@ -- If `REUSE.toml` is ignored by VCS, the linter now also ignores this files. - (#1047) diff --git a/changelog.d/changed/spdx-resources.md b/changelog.d/changed/spdx-resources.md deleted file mode 100644 index d5b6315b4..000000000 --- a/changelog.d/changed/spdx-resources.md +++ /dev/null @@ -1 +0,0 @@ -- SPDX license and exception list updated to v3.25.0. diff --git a/changelog.d/changed/unspecly-changes.md b/changelog.d/changed/unspecly-changes.md deleted file mode 100644 index 8c8e85d58..000000000 --- a/changelog.d/changed/unspecly-changes.md +++ /dev/null @@ -1,6 +0,0 @@ -- Changes that are not strictly compatible with - [REUSE Specification v3.2](https://reuse.software/spec-3.2): - - More `LICENSE` and `COPYING`-like files are ignored. Now, such files - suffixed by `-anything` are also ignored, typically something like - `LICENSE-MIT`. Files with the UK spelling `LICENCE` are also ignored. - (#1041) diff --git a/changelog.d/fixed/glob.md b/changelog.d/fixed/glob.md deleted file mode 100644 index dac4d9525..000000000 --- a/changelog.d/fixed/glob.md +++ /dev/null @@ -1,2 +0,0 @@ -- Fixed the globbing of a single asterisk succeeded by a slash (e.g. - `directory-*/foo.py`). The glob previously did nothing. (#1078) diff --git a/changelog.d/fixed/min-version-attrs.md b/changelog.d/fixed/min-version-attrs.md deleted file mode 100644 index 5732fd644..000000000 --- a/changelog.d/fixed/min-version-attrs.md +++ /dev/null @@ -1,2 +0,0 @@ -- Increased the minimum requirement of `attrs` to `>=21.3`. Older versions do - not import correctly. (#1044) diff --git a/changelog.d/fixed/performance.md b/changelog.d/fixed/performance.md deleted file mode 100644 index fafae0995..000000000 --- a/changelog.d/fixed/performance.md +++ /dev/null @@ -1,3 +0,0 @@ -- Performance greatly improved for projects with large directories ignored by - VCS. (#1047) -- Performance slightly improved for large projects. (#1047) diff --git a/changelog.d/fixed/plain-format-output-new-line-fix.md b/changelog.d/fixed/plain-format-output-new-line-fix.md deleted file mode 100644 index 58e8c617a..000000000 --- a/changelog.d/fixed/plain-format-output-new-line-fix.md +++ /dev/null @@ -1,2 +0,0 @@ -- The plain output of `lint` has been slightly improved, getting rid of an - errant newline. (#1091) diff --git a/changelog.d/fixed/prefix-merge.md b/changelog.d/fixed/prefix-merge.md deleted file mode 100644 index 3a5e3ca63..000000000 --- a/changelog.d/fixed/prefix-merge.md +++ /dev/null @@ -1,2 +0,0 @@ -- `reuse annotate --merge-copyrights` now works more reliably with copyright - prefixes. This still needs some work, though. (#979) diff --git a/changelog.d/fixed/source-bug.md b/changelog.d/fixed/source-bug.md deleted file mode 100644 index a4959bc75..000000000 --- a/changelog.d/fixed/source-bug.md +++ /dev/null @@ -1,3 +0,0 @@ -- In some scenarios, where a user has multiple `REUSE.toml` files and one of - those files could not be parsed, the wrong `REUSE.toml` was signalled as being - unparseable. This is now fixed. (#1047) diff --git a/changelog.d/removed/python-3.8.md b/changelog.d/removed/python-3.8.md deleted file mode 100644 index 46bc7c986..000000000 --- a/changelog.d/removed/python-3.8.md +++ /dev/null @@ -1 +0,0 @@ -- Python 3.8 support removed. (#1080) From f8becb9fcb308b5626aac9f34ab20cdd4ba382f4 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 14:30:20 +0200 Subject: [PATCH 122/156] Improve CHANGELOG Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a59aa8bae..be0182248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,26 +27,29 @@ CLI command and its behaviour. There are no guarantees of stability for the ## 5.0.0 - 2024-10-17 +This is a big release for a small change set. With this release, the tool +becomes compatible with +[REUSE Specification 3.3](https://reuse.software/spec-3.3), which is a very +subtly improved release of the much bigger version 3.2. + ### Added -- Added `.cabal` and `cabal.project` (Haskell) as recognised file types for - comments. (#1089, #1090) -- Added `.envrc` (Python) and `.flake.lock` (uncommentable) as recognised file - types for comments. (#1061) - More file types are recognised: + - Cabal (`.cabal`, `cabal.project`) (#1089, #1090) + - `.envrc` (#1061) + - `.flake.lock` (#1061) - Ansible Jinja2 (`.j2`) (#1036) + - Poetry lock file (`poetry.lock`) (#1037) +- Added `lint-file` subcommand to enable running lint on specific files. (#1055) - Added shell completion via `click`. (#1084) -- Add Jujutsu VCS support. (#TODO) -- Add lint-file subcommand to enable running lint on specific files. +- Added Jujutsu VCS support. (#TODO) - Added new copyright prefixes `spdx-string`, `spdx-string-c`, and `spdx-string-symbol`. (#979) -- Make poetry.lock uncommentable. (#1037) ### Changed - Bumped REUSE Specification version to - [version 3.3](https://reuse.software/spec-3.3). This is a small change. - (#1069) + [version 3.3](https://reuse.software/spec-3.3). (#1069) - Switched from `argparse` to `click` for handling the CLI. The CLI should still handle the same, with identical options and arguments, but some stuff changed under the hood. (#1084) @@ -65,22 +68,20 @@ CLI command and its behaviour. There are no guarantees of stability for the - `annotate` and `lint-file` now also take directories as arguments. This will do nothing, but can be useful in scripting. -- Allow Python-style comments in Cargo.lock files -- `.s` files (GNU as) now use the C comment style (#1034) -- `.ld` files (GNU ld) now use the C comment style (#1034) +- Changes to comment styles: + - Allow Python-style comments in Cargo.lock files. (#1060) + - `.s` files (GNU as) now use the C comment style. (#1034) + - `.ld` files (GNU ld) now use the C comment style. (#1034) - `REUSE.toml` no longer needs a licensing header. (#1042) - `.gitkeep` is no longer ignored, because this is not defined in the specification. However, if `.gitkeep` is a 0-size file, it will remain ignored (because 0-size files are ignored). (#1043) -- If `REUSE.toml` is ignored by VCS, the linter now also ignores this files. +- If `REUSE.toml` is ignored by VCS, the linter no longer parses this file. (#1047) - SPDX license and exception list updated to v3.25.0. -- Changes that are not strictly compatible with - [REUSE Specification v3.2](https://reuse.software/spec-3.2): - - More `LICENSE` and `COPYING`-like files are ignored. Now, such files - suffixed by `-anything` are also ignored, typically something like - `LICENSE-MIT`. Files with the UK spelling `LICENCE` are also ignored. - (#1041) +- More `LICENSE` and `COPYING`-like files are ignored. Now, such files suffixed + by `-anything` are also ignored, typically something like `LICENSE-MIT`. Files + with the UK spelling `LICENCE` are also ignored. (#1041) ### Removed @@ -88,8 +89,8 @@ CLI command and its behaviour. There are no guarantees of stability for the ### Fixed -- Fixed the globbing of a single asterisk succeeded by a slash (e.g. - `directory-*/foo.py`). The glob previously did nothing. (#1078) +- In `REUSE.toml`, fixed the globbing of a single asterisk succeeded by a slash + (e.g. `directory-*/foo.py`). The glob previously did nothing. (#1078) - Increased the minimum requirement of `attrs` to `>=21.3`. Older versions do not import correctly. (#1044) - Performance greatly improved for projects with large directories ignored by From edc793581e9481b8e69450b3100039135e96749d Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 16:58:43 +0200 Subject: [PATCH 123/156] Include reuse-lint-file in index Signed-off-by: Carmen Bianca BAKKER --- docs/man/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/man/index.rst b/docs/man/index.rst index f858ec4b5..db150ae7f 100644 --- a/docs/man/index.rst +++ b/docs/man/index.rst @@ -17,5 +17,6 @@ information about the functioning of the tool. reuse-convert-dep5 reuse-download reuse-lint + reuse-lint-file reuse-spdx reuse-supported-licenses From f660e322b2acfbd9b5792dc015325f13fed83b11 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 17 Oct 2024 17:16:09 +0200 Subject: [PATCH 124/156] Remove unused code Signed-off-by: Carmen Bianca BAKKER --- src/reuse/__init__.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 1d9c9e651..0aeb02065 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -45,16 +45,6 @@ _LICENSING = Licensing() -_PACKAGE_PATH = os.path.dirname(__file__) -_LOCALE_DIR = os.path.join(_PACKAGE_PATH, "locale") - -if gettext.find("reuse", localedir=_LOCALE_DIR): - gettext.bindtextdomain("reuse", _LOCALE_DIR) - gettext.textdomain("reuse") - _LOGGER.debug("translations found at %s", _LOCALE_DIR) -else: - _LOGGER.debug("no translations found at %s", _LOCALE_DIR) - class SourceType(Enum): """ From 83c655921feb090cac0cdf5e4f58128f0b76f05b Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 09:32:46 +0200 Subject: [PATCH 125/156] Add a missing space in the documentation (Between 'Python' and '`click`'.) Signed-off-by: Carmen Bianca BAKKER --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 938db40f2..71d96eb6d 100644 --- a/README.md +++ b/README.md @@ -272,9 +272,9 @@ repos: In order to enable shell completion, you need to generate the shell completion script. You do this with `_REUSE_COMPLETE=bash_source reuse`. Replace `bash` -with `zsh` or `fish` as needed, or any other shells supported by the -Python`click` library. You can then source the output in your shell rc file, -like so (e.g.`~/.bashrc`): +with `zsh` or `fish` as needed, or any other shells supported by the Python +`click` library. You can then source the output in your shell rc file, like so +(e.g.`~/.bashrc`): ```bash eval "$(_REUSE__COMPLETE=bash_source reuse)" From 8ed714e8e74b7a33fb664357a23131a7a27e2154 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 24 Oct 2024 13:51:43 +0200 Subject: [PATCH 126/156] Compile change log again I rebased this branch, so I needed to do this again. Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 2 ++ changelog.d/fixed/license-overriding-global-name.md | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 changelog.d/fixed/license-overriding-global-name.md diff --git a/CHANGELOG.md b/CHANGELOG.md index be0182248..438b85d79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,8 @@ subtly improved release of the much bigger version 3.2. - In some scenarios, where a user has multiple `REUSE.toml` files and one of those files could not be parsed, the wrong `REUSE.toml` was signalled as being unparseable. This is now fixed. (#1047) +- Fixed a bug where `REUSE.toml` did not correctly apply its annotations to + files which have an accompanying `.license` file. (#1058) ## 4.0.3 - 2024-07-08 diff --git a/changelog.d/fixed/license-overriding-global-name.md b/changelog.d/fixed/license-overriding-global-name.md deleted file mode 100644 index f010d4727..000000000 --- a/changelog.d/fixed/license-overriding-global-name.md +++ /dev/null @@ -1,2 +0,0 @@ -- `REUSE.toml` `[[annotations]]` now use the correct path if a `.license` file - is present (#1058) From 3c7c56d403b4cb257eb9e6a53764bd34e9711bce Mon Sep 17 00:00:00 2001 From: eulalio Date: Sat, 26 Oct 2024 14:49:36 +0000 Subject: [PATCH 127/156] Translated using Weblate (Spanish) Currently translated at 17.2% (26 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/po/es.po b/po/es.po index e2cc983e2..7c5574866 100644 --- a/po/es.po +++ b/po/es.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-10-10 16:26+0000\n" -"Last-Translator: gallegonovato \n" +"PO-Revision-Date: 2024-10-27 15:00+0000\n" +"Last-Translator: eulalio \n" "Language-Team: Spanish \n" "Language: es\n" @@ -17,43 +17,42 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: src/reuse/cli/annotate.py:58 -#, fuzzy msgid "Option '--copyright', '--license', or '--contributor' is required." -msgstr "se requiere la opción --contributor, --copyright o --license" +msgstr "se requiere la opción '--copyright', '--license', o '--contributor'" #: src/reuse/cli/annotate.py:119 -#, fuzzy msgid "" "The following files do not have a recognised file extension. Please use '--" "style', '--force-dot-license', '--fallback-dot-license', or '--skip-" "unrecognised':" msgstr "" "Los siguientes archivos no tienen una extensión de archivo reconocida. Por " -"favor use --style, -force-dot-license, -fallback-dot-license o -skip-" -"unrecognized:" +"favor use '--style', '--force-dot-license', '--fallback-dot-license', o " +"'--skip-unrecognised':" #: src/reuse/cli/annotate.py:152 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use '--single-" "line'." msgstr "" -"'{path}' no admite comentarios de una sola línea, no utilices --single-line" +"'{path}' no admite comentarios de una sola línea, no utilices '--single-" +"line'." #: src/reuse/cli/annotate.py:159 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use '--multi-" "line'." -msgstr "'{path}' no admite comentarios multilínea, no utilices --multi-line" +msgstr "'{path}' no admite comentarios multilínea, no utilices '--multi-line'." #: src/reuse/cli/annotate.py:205 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Template '{template}' could not be found." -msgstr "no pudo encontrarse la plantilla {template}" +msgstr "no pudo encontrarse la plantilla '{template}'" #: src/reuse/cli/annotate.py:268 #, fuzzy @@ -65,17 +64,24 @@ msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" +"Al usar -- copyright y -- license, puede especificar qué titulares de " +"derechos de autor y licencias agregar a los encabezados de los archivos " +"dados." #: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"Al usar -- contributor, puede especificar personas o entidades que " +"contribuyeron pero que no son titulares de los derechos de autor de los " +"archivos dados." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:290 +#, fuzzy msgid "COPYRIGHT" -msgstr "" +msgstr "COPYRIGHT" #: src/reuse/cli/annotate.py:293 #, fuzzy @@ -125,17 +131,15 @@ msgstr "prefijo de copyright para usar, opcional" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" -msgstr "" +msgstr "PLANTILLA" #: src/reuse/cli/annotate.py:352 -#, fuzzy msgid "Name of template to use." -msgstr "nombre de la plantilla a utilizar; opcional" +msgstr "nombre de la plantilla a utilizar." #: src/reuse/cli/annotate.py:359 -#, fuzzy msgid "Do not include year in copyright statement." -msgstr "no incluir el año en la declaración" +msgstr "No incluir el año en la declaración de derechos de autor." #: src/reuse/cli/annotate.py:364 #, fuzzy @@ -145,14 +149,12 @@ msgstr "" "idénticas" #: src/reuse/cli/annotate.py:371 -#, fuzzy msgid "Force single-line comment style." -msgstr "forzar el estilo del comentario de una sola línea, opcional" +msgstr "forzar el estilo del comentario de una sola línea." #: src/reuse/cli/annotate.py:378 -#, fuzzy msgid "Force multi-line comment style." -msgstr "forzar el estilo del comentario multilínea, opcional" +msgstr "Forzar estilo de comentario multilínea." #: src/reuse/cli/annotate.py:384 #, fuzzy From c5ff73012a713b4a6d94018cdae8302771c1b8c4 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Tue, 29 Oct 2024 08:53:16 +0100 Subject: [PATCH 128/156] Fix URL anchors of change log By adding at least one letter to each change log section, Sphinx can create URL anchors for them. Without this, they would be something like #id1, #id2, in order. But the meaning of #id1 could change when a new section is added, so this was not reliable. Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 86 ++++++++++++++++++++++++------------------------- CONTRIBUTING.md | 2 +- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 438b85d79..fe2de2359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ CLI command and its behaviour. There are no guarantees of stability for the -## 5.0.0 - 2024-10-17 +## v5.0.0 - 2024-10-17 This is a big release for a small change set. With this release, the tool becomes compatible with @@ -106,14 +106,14 @@ subtly improved release of the much bigger version 3.2. - Fixed a bug where `REUSE.toml` did not correctly apply its annotations to files which have an accompanying `.license` file. (#1058) -## 4.0.3 - 2024-07-08 +## v4.0.3 - 2024-07-08 ### Fixed - Increased the minimum requirement of `attrs` to `>=21.3`. Older versions do not import correctly. (#1044) -## 4.0.2 - 2024-07-03 +## v4.0.2 - 2024-07-03 ### Fixed @@ -121,14 +121,14 @@ subtly improved release of the much bigger version 3.2. `annotate --merge-copyrights` on a file that does not yet have a year in the copyright statement. This bug was introduced in v4.0.1. (#1030) -## 4.0.1 - 2024-07-03 +## v4.0.1 - 2024-07-03 ### Fixed - Make sure that Read the Docs can compile the documentation. This necesitated updating `poetry.lock`. (#1028) -## 4.0.0 - 2024-07-03 +## v4.0.0 - 2024-07-03 This release of REUSE implements the new [REUSE Specification v3.2](https://reuse.software/spec-3.2). It adds the @@ -238,14 +238,14 @@ This changeset also contains the changes of v3.1.0a1. - In `reuse spdx`, fixed the output to be more compliant by capitalising `SPDXRef-Document DESCRIBES` appropriately. (#1013) -## 3.0.2 - 2024-04-08 +## v3.0.2 - 2024-04-08 ### Fixed - `annotate`'s '`--style` now works again when used for a file with an unrecognised extension. (#909) -## 3.0.1 - 2024-01-19 +## v3.0.1 - 2024-01-19 ### Fixed @@ -255,7 +255,7 @@ This changeset also contains the changes of v3.1.0a1. files are scanned for REUSE information again. The contents of binary files are not. (#896) -## 3.0.0 - 2024-01-17 +## v3.0.0 - 2024-01-17 This release contains a lot of small improvements and changes without anything big per se. Rather, it is made in advance of a release which will contain a @@ -330,7 +330,7 @@ That future 3.1 release will have some alpha testing in advance. . (#874) -## 2.1.0 - 2023-07-18 +## v2.1.0 - 2023-07-18 After the yanked 2.0.0 release, we're excited to announce our latest major version packed with new features and improvements! We've expanded our file type @@ -438,7 +438,7 @@ and licensing information to your code! ### Security -## 2.0.0 - 2023-06-21 [YANKED] +## v2.0.0 - 2023-06-21 [YANKED] This version was yanked because of an unanticipated workflow that we broke. The breaking change is the fact that an order of precedence was defined for @@ -453,14 +453,14 @@ were broken as a result of this. Apologies to everyone whose CI broke. We'll get this one right before long. -## 1.1.2 - 2023-02-09 +## v1.1.2 - 2023-02-09 ### Fixed - Note to maintainers: It is now possible/easier to use the `build` module to build this module. Previously, there was a namespace conflict. (#640) -## 1.1.1 - 2023-02-05 +## v1.1.1 - 2023-02-05 ### Fixed @@ -468,7 +468,7 @@ Apologies to everyone whose CI broke. We'll get this one right before long. `site-packages/`). (#657) - Include documentation directory in sdist. (#657) -## 1.1.0 - 2022-12-01 +## v1.1.0 - 2022-12-01 ### Added @@ -521,7 +521,7 @@ Apologies to everyone whose CI broke. We'll get this one right before long. comment style on a single line could not be parsed (#593). - In PHP files, add header after ` to . -## 0.3.3 - 2018-07-15 +## v0.3.3 - 2018-07-15 ### Fixed - Any files with the suffix `.spdx` are no longer considered licenses. -## 0.3.2 - 2018-07-15 +## v0.3.2 - 2018-07-15 ### Fixed - The documentation now builds under Python 3.7. -## 0.3.1 - 2018-07-14 +## v0.3.1 - 2018-07-14 ### Fixed - When using reuse from a child directory using pygit2, correctly find the root. -## 0.3.0 - 2018-05-16 +## v0.3.0 - 2018-05-16 ### Changed @@ -1091,7 +1091,7 @@ backwards-incompatible) version is in the works. now correctly matches corresponding SPDX identifiers. Still it is recommended to use `SPDX-Valid-License: GPL-3.0` instead. -## 0.2.0 - 2018-04-17 +## v0.2.0 - 2018-04-17 ### Added @@ -1117,7 +1117,7 @@ backwards-incompatible) version is in the works. - click removed as dependency. Good old argparse from the library is used instead. -## 0.1.1 - 2017-12-14 +## v0.1.1 - 2017-12-14 ### Changed @@ -1128,7 +1128,7 @@ backwards-incompatible) version is in the works. - Release date in change log fixed. - The PyPI homepage now gets reStructuredText instead of Markdown. -## 0.1.0 - 2017-12-14 +## v0.1.0 - 2017-12-14 ### Added @@ -1167,19 +1167,19 @@ backwards-incompatible) version is in the works. a file still has errors during decoding, those errors are silently ignored and replaced. -## 0.0.4 - 2017-11-06 +## v0.0.4 - 2017-11-06 ### Fixed - Removed dependency on `os.PathLike` so that Python 3.5 is actually supported -## 0.0.3 - 2017-11-06 +## v0.0.3 - 2017-11-06 ### Fixed - Fixed the link to PyPI in the README. -## 0.0.2 - 2017-11-03 +## v0.0.2 - 2017-11-03 This is a very early development release aimed at distributing the program as soon as possible. Because this is the first release, the changelog is a little diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9b3cb95cf..6067fa675 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,7 +114,7 @@ possible, run `poetry lock --no-update`. - Create branch release-x.y.z - `bumpver update --set-version vx.y.z` - `make update-resources` -- `protokolo compile -f version x.y.z` +- `protokolo compile -f version vx.y.z` - Alter changelog - Do some final tweaks/bugfixes (and alter changelog) - `make test-release` From 3ff7331dc19e07cab6c0c9214b08d97628d039a2 Mon Sep 17 00:00:00 2001 From: eulalio Date: Mon, 28 Oct 2024 18:19:11 +0000 Subject: [PATCH 129/156] Translated using Weblate (Spanish) Currently translated at 27.1% (41 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 55 ++++++++++++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/po/es.po b/po/es.po index 7c5574866..dab544751 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-10-27 15:00+0000\n" +"PO-Revision-Date: 2024-10-29 17:08+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -215,23 +215,21 @@ msgstr "" #: src/reuse/cli/common.py:97 #, python-brace-format msgid "'{name}' is mutually exclusive with: {opts}" -msgstr "" +msgstr "'{name}' se excluye mutuamente con: {opts}" #: src/reuse/cli/common.py:114 -#, fuzzy msgid "'{}' is not a valid SPDX expression." -msgstr "'{}' no es una expresión SPDX válida; abortando" +msgstr "'{}' no es una expresión SPDX válida," #: src/reuse/cli/convert_dep5.py:19 -#, fuzzy msgid "" "Convert .reuse/dep5 into a REUSE.toml file. The generated file is placed in " "the project root and is semantically identical. The .reuse/dep5 file is " "subsequently deleted." msgstr "" -"Convertir . reuse/dep5 en un archivo REUSE.toml en la raíz del proyecto. El " -"archivo generado es semánticamente idéntico. El . reutilización/dep5 archivo " -"se elimina posteriormente." +"Convertir .reuse/dep5 en un archivo REUSE.toml. El archivo generado se " +"coloca en la raíz del proyecto y es semánticamente idéntico. El archivo ." +"reuse/dep5 se elimina posteriormente." #: src/reuse/cli/convert_dep5.py:31 #, fuzzy @@ -287,30 +285,29 @@ msgid "" "LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " "multiple times to download multiple licenses." msgstr "" +"LICENSE debe ser un identificador de licencia SPDX válido. Puede especificar " +"LICENSE varias veces para descargar varias licencias." #: src/reuse/cli/download.py:122 -#, fuzzy msgid "Download all missing licenses detected in the project." -msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" +msgstr "Descargar todas las licencias no disponibles detectadas en el proyecto." #: src/reuse/cli/download.py:130 msgid "Path to download to." -msgstr "" +msgstr "Ruta a la que descargar." #: src/reuse/cli/download.py:136 -#, fuzzy msgid "" "Source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself." msgstr "" -"fuente desde la que copiar las licencias LicenseRef- personalizadas, ya sea " +"Fuente desde la que copiar las licencias LicenseRef- personalizadas, ya sea " "un directorio que contenga el archivo o el propio archivo" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/download.py:143 -#, fuzzy msgid "LICENSE" -msgstr "LICENCIAS MALAS" +msgstr "LICENCIA" #: src/reuse/cli/download.py:159 #, fuzzy @@ -363,16 +360,18 @@ msgid "" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?" msgstr "" +"- ¿ Hay licencias incluidas en el directorio LICENSES/ que no se utilicen " +"dentro del proyecto?" #: src/reuse/cli/lint.py:57 msgid "- Are there any read errors?" -msgstr "" +msgstr "- ¿Hay algún error de lectura?" #: src/reuse/cli/lint.py:59 -#, fuzzy msgid "- Do all files have valid copyright and licensing information?" msgstr "" -"Los siguientes archivos carecen de información de copyright y licencia:" +"- ¿Todos los archivos tienen información válida sobre derechos de autor y " +"licencias?" #: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 #, fuzzy @@ -380,30 +379,27 @@ msgid "Prevent output." msgstr "impide la producción" #: src/reuse/cli/lint.py:78 -#, fuzzy msgid "Format output as JSON." -msgstr "formato de salida JSON" +msgstr "Formato de salida JSON." #: src/reuse/cli/lint.py:86 -#, fuzzy msgid "Format output as plain text. (default)" -msgstr "Formato de salida como texto sin formato (por defecto)" +msgstr "Formato de salida como texto plano (por defecto)" #: src/reuse/cli/lint.py:94 -#, fuzzy msgid "Format output as errors per line." -msgstr "formatea la salida como un texto plano" +msgstr "Formato de salida como errores por línea." #: src/reuse/cli/lint_file.py:25 -#, fuzzy msgid "" "Lint individual files for REUSE compliance. The specified FILEs are checked " "for the presence of copyright and licensing information, and whether the " "found licenses are included in the LICENSES/ directory." msgstr "" -"Archivos individuales de Lint. Los archivos especificados se comprueban para " -"ver si hay información de copyright y licencias, y si las licencias " -"encontradas están incluidas en el directorio LICENSES/ ." +"Eliminar archivos individuales para el cumplimiento de REUSE. Se comprueba " +"en los ARCHIVOs especificados la presencia de información sobre derechos de " +"autor y licencias, y si las licencias encontradas están incluidas en el " +"directorio LICENSES/." #: src/reuse/cli/lint_file.py:46 #, fuzzy @@ -412,8 +408,9 @@ msgstr "Formatea la salida como errores por línea (por defecto)" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/lint_file.py:51 +#, fuzzy msgid "FILE" -msgstr "" +msgstr "FILE" #: src/reuse/cli/lint_file.py:65 #, fuzzy, python-brace-format From eedf5d54f30bcc869eb18edf4faaa96c9f5f39f0 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 29 Oct 2024 17:13:08 +0000 Subject: [PATCH 130/156] Translated using Weblate (Spanish) Currently translated at 38.4% (58 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/po/es.po b/po/es.po index dab544751..70dd9c420 100644 --- a/po/es.po +++ b/po/es.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-10-29 17:08+0000\n" -"Last-Translator: eulalio \n" +"PO-Revision-Date: 2024-10-30 17:09+0000\n" +"Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -55,9 +55,8 @@ msgid "Template '{template}' could not be found." msgstr "no pudo encontrarse la plantilla '{template}'" #: src/reuse/cli/annotate.py:268 -#, fuzzy msgid "Add copyright and licensing into the headers of files." -msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" +msgstr "Añadir derechos de autor y licencias en las cabeceras de los archivos." #: src/reuse/cli/annotate.py:271 msgid "" @@ -79,54 +78,47 @@ msgstr "" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:290 -#, fuzzy msgid "COPYRIGHT" -msgstr "COPYRIGHT" +msgstr "DERECHOS DE AUTOR" #: src/reuse/cli/annotate.py:293 -#, fuzzy msgid "Copyright statement, repeatable." -msgstr "declaración de los derechos de autor, repetible" +msgstr "Declaración de derechos de autor, repetible." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" -msgstr "" +msgstr "SPDX_IDENTIFIER" #: src/reuse/cli/annotate.py:303 -#, fuzzy msgid "SPDX License Identifier, repeatable." -msgstr "Identificador SPDX, repetible" +msgstr "Identificador de licencia SPDX, repetible." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" -msgstr "" +msgstr "COLABORADOR" #: src/reuse/cli/annotate.py:312 -#, fuzzy msgid "File contributor, repeatable." -msgstr "colaborador de archivos, repetible" +msgstr "Claborador de archivos, repetible." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:319 msgid "YEAR" -msgstr "" +msgstr "AÑO" #: src/reuse/cli/annotate.py:325 -#, fuzzy msgid "Year of copyright statement." -msgstr "año de la declaración de copyright; opcional" +msgstr "Año de la declaración de derechos de autor." #: src/reuse/cli/annotate.py:333 -#, fuzzy msgid "Comment style to use." -msgstr "estilo de comentario a utilizar; opcional" +msgstr "Estilo de comentario a utilizar." #: src/reuse/cli/annotate.py:338 -#, fuzzy msgid "Copyright prefix to use." -msgstr "prefijo de copyright para usar, opcional" +msgstr "Prefijo de derechos de autor a utilizar." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:350 @@ -408,20 +400,19 @@ msgstr "Formatea la salida como errores por línea (por defecto)" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/lint_file.py:51 -#, fuzzy msgid "FILE" -msgstr "FILE" +msgstr "ARCHIVO" #: src/reuse/cli/lint_file.py:65 -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{file}' is not inside of '{root}'." -msgstr "'{file}' no está dentro de '{root}'" +msgstr "'{file}' no está dentro de '{root}'." #: src/reuse/cli/main.py:37 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format +#, python-format msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s, versión %(version)s" #: src/reuse/cli/main.py:40 msgid "" @@ -430,6 +421,10 @@ msgid "" "Software Foundation, either version 3 of the License, or (at your option) " "any later version." msgstr "" +"Este programa es software libre: puede redistribuirlo y/o modificarlo bajo " +"los términos de la Licencia Pública General GNU publicada por la Free " +"Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) " +"cualquier versión posterior." #: src/reuse/cli/main.py:47 msgid "" @@ -438,12 +433,18 @@ msgid "" "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" +"Este programa se distribuye con la esperanza de que sea útil, pero SIN " +"NINGUNA GARANTÍA; ni siquiera la garantía implícita de COMERCIABILIDAD o " +"IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la Licencia Pública General " +"GNU para más detalles." #: src/reuse/cli/main.py:54 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" +"Debería haber recibido una copia de la Licencia Pública General GNU junto " +"con este programa. Si no es así, consulte ." #: src/reuse/cli/main.py:62 msgid "" From 8be2a14f934ae35c4f406ca0cb18460dd02924cc Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 09:39:33 +0100 Subject: [PATCH 131/156] Add convenience functions for handling '+' in SPDX identifiers Signed-off-by: Carmen Bianca BAKKER --- src/reuse/_util.py | 26 ++++++++++++++++++++++++++ src/reuse/report.py | 26 ++++++++++++++++---------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/reuse/_util.py b/src/reuse/_util.py index af226cf1d..b5286950b 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -109,6 +109,32 @@ def _determine_license_suffix_path(path: StrPath) -> Path: return Path(f"{path}.license") +def _strip_plus_from_identifier(spdx_identifier: str) -> str: + """Strip final plus from identifier. + + >>> _strip_plus_from_identifier("EUPL-1.2+") + 'EUPL-1.2' + >>> _strip_plus_from_identifier("EUPL-1.2") + 'EUPL-1.2' + """ + if spdx_identifier.endswith("+"): + return spdx_identifier[:-1] + return spdx_identifier + + +def _add_plus_to_identifier(spdx_identifier: str) -> str: + """Add final plus to identifier. + + >>> _add_plus_to_identifier("EUPL-1.2") + 'EUPL-1.2+' + >>> _add_plus_to_identifier("EUPL-1.2+") + 'EUPL-1.2+' + """ + if spdx_identifier.endswith("+"): + return spdx_identifier + return f"{spdx_identifier}+" + + def relative_from_root(path: StrPath, root: StrPath) -> Path: """A helper function to get *path* relative to *root*.""" path = Path(path) diff --git a/src/reuse/report.py b/src/reuse/report.py index 4277a9cec..d95003629 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -32,7 +32,11 @@ from uuid import uuid4 from . import _LICENSING, __REUSE_version__, __version__ -from ._util import _checksum +from ._util import ( + _add_plus_to_identifier, + _checksum, + _strip_plus_from_identifier, +) from .extract import _LICENSEREF_PATTERN from .global_licensing import ReuseDep5 from .i18n import _ @@ -436,15 +440,13 @@ def unused_licenses(self) -> set[str]: if self._unused_licenses is not None: return self._unused_licenses - # First collect licenses that are suspected to be unused. - suspected_unused_licenses = { - lic for lic in self.licenses if lic not in self.used_licenses - } - # Remove false positives. self._unused_licenses = { lic - for lic in suspected_unused_licenses - if f"{lic}+" not in self.used_licenses + for lic in self.licenses + if not any( + identifier in self.used_licenses + for identifier in set((lic, _add_plus_to_identifier(lic))) + ) } return self._unused_licenses @@ -750,8 +752,12 @@ def generate( # A license expression akin to Apache-1.0+ should register # correctly if LICENSES/Apache-1.0.txt exists. identifiers = {identifier} - if identifier.endswith("+"): - identifiers.add(identifier[:-1]) + if ( + plus_identifier := _strip_plus_from_identifier( + identifier + ) + ) != identifier: + identifiers.add(plus_identifier) # Bad license if not identifiers.intersection(project.license_map): report.bad_licenses.add(identifier) From bc740fe47e6ef08637b786074f4f3dd4ef1ce306 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 10:52:38 +0100 Subject: [PATCH 132/156] Correctly download License if License+ was detected Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/download.py | 2 ++ tests/test_cli_download.py | 69 +++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index a1e0256bb..94b47822f 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -15,6 +15,7 @@ import click from .._licenses import ALL_NON_DEPRECATED_MAP +from .._util import _strip_plus_from_identifier from ..download import _path_to_license_file, put_license_in_file from ..i18n import _ from ..report import ProjectReport @@ -173,6 +174,7 @@ def download( _("Cannot use '--output' with more than one license.") ) + licenses = {_strip_plus_from_identifier(lic) for lic in licenses} return_code = 0 for lic in licenses: destination: Path = output # type: ignore diff --git a/tests/test_cli_download.py b/tests/test_cli_download.py index d1aa6630c..5a7f6b336 100644 --- a/tests/test_cli_download.py +++ b/tests/test_cli_download.py @@ -4,10 +4,11 @@ """Tests for download.""" -# pylint: disable=redefined-outer-name,unused-argument +# pylint: disable=redefined-outer-name,unused-argument,unspecified-encoding import errno import os +import shutil from pathlib import Path from unittest.mock import create_autospec from urllib.error import URLError @@ -18,6 +19,8 @@ from reuse.cli import download from reuse.cli.main import main +# REUSE-IgnoreStart + @pytest.fixture() def mock_put_license_in_file(monkeypatch): @@ -39,6 +42,67 @@ def test_simple(self, empty_directory, mock_put_license_in_file): "0BSD", Path(os.path.realpath("LICENSES/0BSD.txt")), source=None ) + def test_strip_plus(self, empty_directory, mock_put_license_in_file): + """If downloading LIC+, download LIC instead.""" + result = CliRunner().invoke(main, ["download", "EUPL-1.2+"]) + + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_with( + "EUPL-1.2", + Path(os.path.realpath("LICENSES/EUPL-1.2.txt")), + source=None, + ) + + def test_all(self, fake_repository, mock_put_license_in_file): + """--all downloads all detected licenses.""" + shutil.rmtree("LICENSES") + result = CliRunner().invoke(main, ["download", "--all"]) + + assert result.exit_code == 0 + for lic in [ + "GPL-3.0-or-later", + "LicenseRef-custom", + "Autoconf-exception-3.0", + "Apache-2.0", + "CC0-1.0", + ]: + mock_put_license_in_file.assert_any_call( + lic, Path(os.path.realpath(f"LICENSES/{lic}.txt")), source=None + ) + + def test_all_with_plus(self, fake_repository, mock_put_license_in_file): + """--all downloads EUPL-1.2 if EUPL-1.2+ is detected.""" + Path("foo.py").write_text("# SPDX-License-Identifier: EUPL-1.2+") + result = CliRunner().invoke(main, ["download", "--all"]) + + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_once_with( + "EUPL-1.2", + Path(os.path.realpath("LICENSES/EUPL-1.2.txt")), + source=None, + ) + + def test_all_with_plus_and_non_plus( + self, fake_repository, mock_put_license_in_file + ): + """If both EUPL-1.2 and EUPL-1.2+ is detected, download EUPL-1.2 only + once. + """ + Path("foo.py").write_text( + """ + # SPDX-License-Identifier: EUPL-1.2+ + # SPDX-License-Identifier: EUPL-1.2 + """ + ) + result = CliRunner().invoke(main, ["download", "--all"]) + + assert result.exit_code == 0 + mock_put_license_in_file.assert_called_once_with( + "EUPL-1.2", + Path(os.path.realpath("LICENSES/EUPL-1.2.txt")), + source=None, + ) + def test_all_and_license_mutually_exclusive(self, empty_directory): """--all and license args are mutually exclusive.""" result = CliRunner().invoke(main, ["download", "--all", "0BSD"]) @@ -223,3 +287,6 @@ def test_prefix(self): result = download._similar_spdx_identifiers("CC0") assert "CC0-1.0" in result + + +# REUSE-IgnoreEnd From 09298490c77ee44b0a9da72ae631b7c436d21668 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 10:57:00 +0100 Subject: [PATCH 133/156] Rename argument Signed-off-by: Carmen Bianca BAKKER --- src/reuse/cli/download.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/reuse/cli/download.py b/src/reuse/cli/download.py index 94b47822f..00a0361e0 100644 --- a/src/reuse/cli/download.py +++ b/src/reuse/cli/download.py @@ -139,7 +139,7 @@ def _successfully_downloaded(destination: StrPath) -> None: ), ) @click.argument( - "license_", + "licenses", # TRANSLATORS: You may translate this. Please preserve capital letters. metavar=_("LICENSE"), type=str, @@ -148,13 +148,13 @@ def _successfully_downloaded(destination: StrPath) -> None: @click.pass_obj def download( obj: ClickObj, - license_: Collection[str], + licenses: Collection[str], all_: bool, output: Optional[Path], source: Optional[Path], ) -> None: # pylint: disable=missing-function-docstring - if all_ and license_: + if all_ and licenses: raise click.UsageError( _( "The 'LICENSE' argument and '--all' option are mutually" @@ -162,8 +162,6 @@ def download( ) ) - licenses: Collection[str] = license_ # type: ignore - if all_: # TODO: This is fairly inefficient, but gets the job done. report = ProjectReport.generate(obj.project, do_checksum=False) From ebb3bac043614126839b66162a3c9e365df18bf9 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 11:09:21 +0100 Subject: [PATCH 134/156] Add change log entry Signed-off-by: Carmen Bianca BAKKER --- changelog.d/fixed/strip-plus.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 changelog.d/fixed/strip-plus.md diff --git a/changelog.d/fixed/strip-plus.md b/changelog.d/fixed/strip-plus.md new file mode 100644 index 000000000..7bb17a561 --- /dev/null +++ b/changelog.d/fixed/strip-plus.md @@ -0,0 +1,2 @@ +- When running `reuse download SPDX-IDENTIFIER+`, download `SPDX-IDENTIFIER` + instead. This also works for `reuse download --all`. (#1098) From 6b8faef7fda7c150f11d1f66d1e759a4d3e573f0 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 11:58:47 +0100 Subject: [PATCH 135/156] Declare support for Python 3.13 Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/test.yaml | 2 +- CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d8e1314c9..e94583d44 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -20,7 +20,7 @@ jobs: # do not abort the whole test job if one combination in the matrix fails fail-fast: false matrix: - python-version: ["3.9", "3.12"] + python-version: ["3.9", "3.13"] os: [ubuntu-22.04] include: - python-version: "3.9" diff --git a/CHANGELOG.md b/CHANGELOG.md index fe2de2359..64f35442c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ subtly improved release of the much bigger version 3.2. - Added Jujutsu VCS support. (#TODO) - Added new copyright prefixes `spdx-string`, `spdx-string-c`, and `spdx-string-symbol`. (#979) +- Support for Python 3.13. (#1092) ### Changed From ab524a1a6f3c7cd4ed54cc562a47a8862009e5d4 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 31 Oct 2024 12:26:36 +0100 Subject: [PATCH 136/156] Use Ubuntu 24.04 images Signed-off-by: Carmen Bianca BAKKER --- .github/workflows/docker.yaml | 4 ++-- .github/workflows/jujutsu.yaml | 2 +- .github/workflows/license_list_up_to_date.yaml | 2 +- .github/workflows/pijul.yaml | 2 +- .github/workflows/test.yaml | 14 +++++++------- .github/workflows/third_party_lint.yaml | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 6b3a815dc..60331883f 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -23,7 +23,7 @@ jobs: # =========================================================================== docker_test: name: Test the Docker images - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 # Dockerfile @@ -46,7 +46,7 @@ jobs: # =========================================================================== docker_push_tag: name: Push Docker images for tags to Docker Hub - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 # Depends on successful Docker build/test needs: - docker_test diff --git a/.github/workflows/jujutsu.yaml b/.github/workflows/jujutsu.yaml index b59d9d898..3173e6ab5 100644 --- a/.github/workflows/jujutsu.yaml +++ b/.github/workflows/jujutsu.yaml @@ -16,7 +16,7 @@ on: - "tests/**.py" jobs: test-jujutsu: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python diff --git a/.github/workflows/license_list_up_to_date.yaml b/.github/workflows/license_list_up_to_date.yaml index 0c8add474..2901213d8 100644 --- a/.github/workflows/license_list_up_to_date.yaml +++ b/.github/workflows/license_list_up_to_date.yaml @@ -10,7 +10,7 @@ on: jobs: license-list-up-to-date: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/pijul.yaml b/.github/workflows/pijul.yaml index d9d59f00a..b39723027 100644 --- a/.github/workflows/pijul.yaml +++ b/.github/workflows/pijul.yaml @@ -16,7 +16,7 @@ on: - "tests/**.py" jobs: test-pijul: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d8e1314c9..870a6e7b4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,7 +21,7 @@ jobs: fail-fast: false matrix: python-version: ["3.9", "3.12"] - os: [ubuntu-22.04] + os: [ubuntu-24.04] include: - python-version: "3.9" os: macos-latest @@ -43,7 +43,7 @@ jobs: poetry run pytest --cov=reuse pylint: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python @@ -59,7 +59,7 @@ jobs: poetry run pylint src/reuse/ tests/ black: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python @@ -76,7 +76,7 @@ jobs: poetry run black --check . mypy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python @@ -92,7 +92,7 @@ jobs: poetry run mypy prettier: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 container: node:latest steps: - uses: actions/checkout@v2 @@ -102,7 +102,7 @@ jobs: run: npx prettier --check . reuse: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python @@ -117,7 +117,7 @@ jobs: run: make reuse docs: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v2 - name: Set up Python diff --git a/.github/workflows/third_party_lint.yaml b/.github/workflows/third_party_lint.yaml index ed2a7c33c..59d971106 100644 --- a/.github/workflows/third_party_lint.yaml +++ b/.github/workflows/third_party_lint.yaml @@ -18,7 +18,7 @@ on: jobs: third-party-lint: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: # do not abort the whole test job if one combination in the matrix fails fail-fast: false @@ -45,7 +45,7 @@ jobs: matrix.repo }} third-party-lint-expect-failure: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: # do not abort the whole test job if one combination in the matrix fails fail-fast: false From cf8697e98bdefde61ae5e87d091e50541af021d2 Mon Sep 17 00:00:00 2001 From: eulalio Date: Thu, 31 Oct 2024 18:31:55 +0000 Subject: [PATCH 137/156] Translated using Weblate (Spanish) Currently translated at 50.3% (76 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 61 +++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/po/es.po b/po/es.po index 70dd9c420..303a64fde 100644 --- a/po/es.po +++ b/po/es.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-10-30 17:09+0000\n" -"Last-Translator: gallegonovato \n" +"PO-Revision-Date: 2024-11-01 19:00+0000\n" +"Last-Translator: eulalio \n" "Language-Team: Spanish \n" "Language: es\n" @@ -596,54 +596,52 @@ msgid "Options" msgstr "opciones" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Got unexpected extra argument ({args})" msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "se espera un parámetro" -msgstr[1] "se espera un parámetro" +msgstr[0] "Tiene un argumento extra inesperado ({args})" +msgstr[1] "Tiene unos argumentos extras inesperados ({args})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" +msgstr "DeprecationWarning: : El comando {name!r} está en desuso." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 -#, fuzzy msgid "Commands" -msgstr "subcomandos" +msgstr "Comandos" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 -#, fuzzy msgid "Missing command." -msgstr "Licencias no encontradas:" +msgstr "Comando que falta." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 msgid "No such command {name!r}." -msgstr "" +msgstr "No hay tal comando {name!r}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 msgid "Value must be an iterable." -msgstr "" +msgstr "El valor debe ser capaz de repetirse." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format msgid "Takes {nargs} values but 1 was given." msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Toma valores {nargs} pero se dio 1." +msgstr[1] "Toma valores {nargs} pero se dieron {len}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 -#, python-brace-format +#, fuzzy, python-brace-format msgid "env var: {var}" -msgstr "" +msgstr "env var: {var}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 msgid "(dynamic)" -msgstr "" +msgstr "(dinámico)" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 -#, python-brace-format +#, fuzzy, python-brace-format msgid "default: {default}" -msgstr "" +msgstr "predeterminado: {predeterminado}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 msgid "required" @@ -681,56 +679,55 @@ msgid "Missing argument" msgstr "parámetros posicionales" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 -#, fuzzy msgid "Missing option" -msgstr "Licencias no encontradas:" +msgstr "Opción que falta" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 msgid "Missing parameter" -msgstr "" +msgstr "Parámetro que falta" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 #, python-brace-format msgid "Missing {param_type}" -msgstr "" +msgstr "Que falta {param_type}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 #, python-brace-format msgid "Missing parameter: {param_name}" -msgstr "" +msgstr "Parámetro que falta: {param_name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 #, python-brace-format msgid "No such option: {name}" -msgstr "" +msgstr "No existe tal opción: {name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 #, fuzzy, python-brace-format msgid "Did you mean {possibility}?" msgid_plural "(Possible options: {possibilities})" -msgstr[0] "Querías decir:" -msgstr[1] "Querías decir:" +msgstr[0] "¿Querías decir {possibility}?" +msgstr[1] "¿Querían decir: {possibility}?" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" -msgstr "" +msgstr "error desconocido" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 msgid "Could not open file {filename!r}: {message}" -msgstr "" +msgstr "No se pudo abrir el archivo {filename!r}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 msgid "Argument {name!r} takes {nargs} values." -msgstr "" +msgstr "Argumento {name!r} toma valores {nargs}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 msgid "Option {name!r} does not take a value." -msgstr "" +msgstr "Opción {name!r} no toma un valor." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 msgid "Option {name!r} requires an argument." msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" +msgstr[0] "Opción {name!r} requiere argumentos {nargs}." msgstr[1] "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 From 054fe8f0a988583fcf3740f7d6862c4cabd0d426 Mon Sep 17 00:00:00 2001 From: eulalio Date: Sun, 3 Nov 2024 12:45:22 +0000 Subject: [PATCH 138/156] Translated using Weblate (Spanish) Currently translated at 56.9% (86 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/po/es.po b/po/es.po index 303a64fde..abcc06d24 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-01 19:00+0000\n" +"PO-Revision-Date: 2024-11-04 13:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8.2-dev\n" +"X-Generator: Weblate 5.8.2\n" #: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." @@ -779,46 +779,45 @@ msgstr[1] "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 msgid "{value!r} does not match the format {format}." msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{¡valor!r} no coincide con el formato {format}." +msgstr[1] "{¡valor!r} no coinciden con los formatos {formats}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 msgid "{value!r} is not a valid {number_type}." -msgstr "" +msgstr "{¡valor!r} no es un {number_type} válido." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 #, python-brace-format msgid "{value} is not in the range {range}." -msgstr "" +msgstr "{value} no está en el rango {range}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 msgid "{value!r} is not a valid boolean." -msgstr "" +msgstr "{¡valor!r} no es un valor booleano válido." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 msgid "{value!r} is not a valid UUID." -msgstr "" +msgstr "{¡valor!r} no es un UUID válido." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 msgid "file" -msgstr "" +msgstr "archivo" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 msgid "directory" -msgstr "" +msgstr "directorio" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 msgid "path" -msgstr "" +msgstr "trayectoria" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 -#, fuzzy msgid "{name} {filename!r} does not exist." -msgstr "Error: {path} no existe." +msgstr "{name} {filename!r} no existe." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 msgid "{name} {filename!r} is a file." -msgstr "" +msgstr "{name} {filename!r} es un archivo." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 #, fuzzy, python-brace-format From ee6f9139f9bb3c30630dff087eef2d47bf6f2bcf Mon Sep 17 00:00:00 2001 From: eulalio Date: Mon, 4 Nov 2024 18:29:39 +0000 Subject: [PATCH 139/156] Translated using Weblate (Spanish) Currently translated at 67.5% (102 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 54 +++++++++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/po/es.po b/po/es.po index abcc06d24..edc164835 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-04 13:00+0000\n" +"PO-Revision-Date: 2024-11-05 19:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -134,10 +134,9 @@ msgid "Do not include year in copyright statement." msgstr "No incluir el año en la declaración de derechos de autor." #: src/reuse/cli/annotate.py:364 -#, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" -"fusionar las líneas del copyright si las declaraciones del copyright son " +"Fusionar las líneas del copyright si las declaraciones del copyright son " "idénticas" #: src/reuse/cli/annotate.py:371 @@ -149,45 +148,40 @@ msgid "Force multi-line comment style." msgstr "Forzar estilo de comentario multilínea." #: src/reuse/cli/annotate.py:384 -#, fuzzy msgid "Add headers to all files under specified directories recursively." msgstr "" -"añadir las cabeceras a todos los archivos de los directorios especificados " -"de forma recursiva" +"Añadir cabeceras a todos los archivos de los directorios especificados de " +"forma recursiva" #: src/reuse/cli/annotate.py:389 -#, fuzzy msgid "Do not replace the first header in the file; just add a new one." -msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" +msgstr "No sustituir la primera cabecera del archivo; añadir una nueva" #: src/reuse/cli/annotate.py:396 -#, fuzzy msgid "Always write a .license file instead of a header inside the file." msgstr "" -"escribir siempre un archivo .license en lugar de una cabecera dentro del " +"Escribir siempre un archivo .license en lugar de una cabecera dentro del " "archivo" #: src/reuse/cli/annotate.py:403 -#, fuzzy msgid "Write a .license file to files with unrecognised comment styles." msgstr "" -"escribir un archivo .license en archivos con estilos de comentario no " +"Escribir un archivo .license en archivos con estilos de comentario no " "reconocidos" #: src/reuse/cli/annotate.py:410 -#, fuzzy msgid "Skip files with unrecognised comment styles." -msgstr "omitir los archivos con estilos de comentario no reconocidos" +msgstr "Omitir los archivos con estilos de comentario no reconocidos" #: src/reuse/cli/annotate.py:421 -#, fuzzy msgid "Skip files that already contain REUSE information." -msgstr "omitir los archivos que ya contienen la información REUSE" +msgstr "Omitir los archivos que ya contienen la información REUSE" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:426 +#, fuzzy msgid "PATH" -msgstr "" +msgstr "PATH" #: src/reuse/cli/annotate.py:476 #, python-brace-format @@ -224,9 +218,8 @@ msgstr "" "reuse/dep5 se elimina posteriormente." #: src/reuse/cli/convert_dep5.py:31 -#, fuzzy msgid "No '.reuse/dep5' file." -msgstr "sin archivo '.reuse/dep5'" +msgstr "Sin archivo '.reuse/dep5'" #: src/reuse/cli/download.py:52 msgid "'{}' is not a valid SPDX License Identifier." @@ -346,6 +339,8 @@ msgid "" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?" msgstr "" +"- ¿Se hace referencia a alguna licencia dentro del proyecto, pero no se " +"incluye en el directorio LICENSES/?" #: src/reuse/cli/lint.py:53 msgid "" @@ -366,9 +361,8 @@ msgstr "" "licencias?" #: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 -#, fuzzy msgid "Prevent output." -msgstr "impide la producción" +msgstr "Evita la producción" #: src/reuse/cli/lint.py:78 msgid "Format output as JSON." @@ -486,34 +480,28 @@ msgid "Enable debug statements." msgstr "habilita instrucciones de depuración" #: src/reuse/cli/main.py:94 -#, fuzzy msgid "Hide deprecation warnings." -msgstr "ocultar las advertencias de que está obsoleto" +msgstr "Ocultar las advertencias de que está obsoleto" #: src/reuse/cli/main.py:99 -#, fuzzy msgid "Do not skip over Git submodules." -msgstr "no omitas los submódulos de Git" +msgstr "No omitir los submódulos de Git" #: src/reuse/cli/main.py:104 -#, fuzzy msgid "Do not skip over Meson subprojects." -msgstr "no te saltes los subproyectos de Meson" +msgstr "No saltarse los subproyectos de Meson" #: src/reuse/cli/main.py:109 -#, fuzzy msgid "Do not use multiprocessing." -msgstr "no utilices multiproceso" +msgstr "No utilizar multiproceso" #: src/reuse/cli/main.py:119 -#, fuzzy msgid "Define root of project." -msgstr "define el origen del proyecto" +msgstr "Definir el origen del proyecto" #: src/reuse/cli/spdx.py:23 -#, fuzzy msgid "Generate an SPDX bill of materials." -msgstr "Genere una lista de materiales SPDX en formato RDF." +msgstr "Generar una lista de materiales SPDX." #: src/reuse/cli/spdx.py:33 #, fuzzy From ae656d2861a30d473a2fa61fce98b0317adad178 Mon Sep 17 00:00:00 2001 From: eulalio Date: Wed, 6 Nov 2024 15:28:59 +0000 Subject: [PATCH 140/156] Translated using Weblate (Spanish) Currently translated at 75.4% (114 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/po/es.po b/po/es.po index edc164835..2ac655cd1 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-05 19:00+0000\n" +"PO-Revision-Date: 2024-11-07 16:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -564,24 +564,22 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 msgid "Aborted!" -msgstr "" +msgstr "¡Abortado!" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 -#, fuzzy msgid "Show this message and exit." -msgstr "mostrar este mensaje de ayuda y salir" +msgstr "Mostrar este mensaje y salir." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 #, fuzzy, python-brace-format msgid "(Deprecated) {text}" -msgstr "Licencias obsoletas:" +msgstr "(Deprecated) {text}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 -#, fuzzy msgid "Options" -msgstr "opciones" +msgstr "Opciones" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 #, python-brace-format @@ -636,15 +634,14 @@ msgid "required" msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 -#, fuzzy msgid "Show the version and exit." -msgstr "mostrar este mensaje de ayuda y salir" +msgstr "Mostrar la versión y salir." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 -#, python-brace-format +#, fuzzy, python-brace-format msgid "Error: {message}" -msgstr "" +msgstr "Error: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 #, python-brace-format @@ -721,35 +718,39 @@ msgstr[1] "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 msgid "Shell completion is not supported for Bash versions older than 4.4." msgstr "" +"El término del shell no es compatible con versiones de Bash anteriores a la 4" +".4." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 msgid "Couldn't detect Bash version, shell completion is not supported." msgstr "" +"No se pudo detectar la versión de Bash, no se admite la finalización del " +"shell." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 msgid "Repeat for confirmation" -msgstr "" +msgstr "Repita para confirmar" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 msgid "Error: The value you entered was invalid." -msgstr "" +msgstr "Error: El valor que ingresó no era válido." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 -#, python-brace-format +#, fuzzy, python-brace-format msgid "Error: {e.message}" -msgstr "" +msgstr "Error: {e.message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 msgid "Error: The two entered values do not match." -msgstr "" +msgstr "Error: No coinciden los dos valores introducidos." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 msgid "Error: invalid input" -msgstr "" +msgstr "Error: entrada inválida" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 msgid "Press any key to continue..." -msgstr "" +msgstr "Pulsar cualquier tecla para continuar..." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format @@ -757,6 +758,8 @@ msgid "" "Choose from:\n" "\t{choices}" msgstr "" +"Elige entre:\n" +"\t{choices}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 msgid "{value!r} is not {choice}." From b2f797d1f79614fa9ecb074a20da6f44ce72c37d Mon Sep 17 00:00:00 2001 From: eulalio Date: Sat, 9 Nov 2024 10:48:08 +0000 Subject: [PATCH 141/156] Translated using Weblate (Spanish) Currently translated at 80.1% (121 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/po/es.po b/po/es.po index 2ac655cd1..cafb4d614 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-07 16:00+0000\n" +"PO-Revision-Date: 2024-11-10 11:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -295,14 +295,12 @@ msgid "LICENSE" msgstr "LICENCIA" #: src/reuse/cli/download.py:159 -#, fuzzy msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." -msgstr "las opciones --single-line y --multi-line se excluyen mutuamente" +msgstr "El argumento 'LICENSE' y la opción '--all' se excluyen mutuamente" #: src/reuse/cli/download.py:173 -#, fuzzy msgid "Cannot use '--output' with more than one license." -msgstr "no se puede utilizar --output con más de una licencia" +msgstr "No se puede utilizar '--output' con más de una licencia" #: src/reuse/cli/lint.py:27 #, python-brace-format @@ -312,27 +310,34 @@ msgid "" "find the latest version of the specification at ." msgstr "" +"Elimine el directorio del proyecto para cumplir con REUSE. Esta versión de " +"la herramienta se compara con la versión {reuse_version} de la " +"especificación de REUSE. Puede encontrar la última versión de la " +"especificación en ." #: src/reuse/cli/lint.py:33 msgid "Specifically, the following criteria are checked:" -msgstr "" +msgstr "Específicamente, se verifican los siguientes criterios:" #: src/reuse/cli/lint.py:36 msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?" msgstr "" +"- ¿ Hay alguna licencia incorrecta (no reconocida, que no cumpla con SPDX) " +"en el proyecto?" #: src/reuse/cli/lint.py:40 -#, fuzzy msgid "- Are there any deprecated licenses in the project?" -msgstr "¿Cuál es la dirección de Internet del proyecto?" +msgstr "- ¿Hay licencias obsoletas en el proyecto?" #: src/reuse/cli/lint.py:43 msgid "" "- Are there any license files in the LICENSES/ directory without file " "extension?" msgstr "" +"- ¿Hay algún archivo de licencia en el directorio LICENSES/ sin extensión de " +"archivo?" #: src/reuse/cli/lint.py:48 msgid "" From b154360e69b120e3eb4af84d21696f8869482961 Mon Sep 17 00:00:00 2001 From: eulalio Date: Mon, 11 Nov 2024 12:42:25 +0000 Subject: [PATCH 142/156] Translated using Weblate (Spanish) Currently translated at 91.3% (138 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 51 ++++++++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/po/es.po b/po/es.po index cafb4d614..1d97892ab 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-10 11:00+0000\n" +"PO-Revision-Date: 2024-11-11 13:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -393,9 +393,8 @@ msgstr "" "directorio LICENSES/." #: src/reuse/cli/lint_file.py:46 -#, fuzzy msgid "Format output as errors per line. (default)" -msgstr "Formatea la salida como errores por línea (por defecto)" +msgstr "Formatea la salida como errores por línea. (por defecto)" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/lint_file.py:51 @@ -480,9 +479,8 @@ msgstr "" "donate/>." #: src/reuse/cli/main.py:89 -#, fuzzy msgid "Enable debug statements." -msgstr "habilita instrucciones de depuración" +msgstr "Habilita instrucciones de depuración." #: src/reuse/cli/main.py:94 msgid "Hide deprecation warnings." @@ -509,37 +507,32 @@ msgid "Generate an SPDX bill of materials." msgstr "Generar una lista de materiales SPDX." #: src/reuse/cli/spdx.py:33 -#, fuzzy msgid "File to write to." -msgstr "archivos para limpiar" +msgstr "Archivo para escribir." #: src/reuse/cli/spdx.py:39 -#, fuzzy msgid "" "Populate the LicenseConcluded field; note that reuse cannot guarantee that " "the field is accurate." msgstr "" -"rellenar el campo LicenseConcluded; ten en cuenta que la reutilización no " -"puede garantizar que el campo sea exacto" +"Rellenar el campo LicenseConcluded; ten en cuenta que reuse no puede " +"garantizar que el campo sea exacto" #: src/reuse/cli/spdx.py:51 -#, fuzzy msgid "Name of the person signing off on the SPDX report." -msgstr "nombre de la persona que firma el informe SPDX" +msgstr "Nombre de la persona que firma el informe SPDX." #: src/reuse/cli/spdx.py:55 -#, fuzzy msgid "Name of the organization signing off on the SPDX report." -msgstr "nombre de la organización que firma el informe SPDX" +msgstr "Nombre de la organización que firma el informe SPDX." #: src/reuse/cli/spdx.py:82 -#, fuzzy msgid "" "'--creator-person' or '--creator-organization' is required when '--add-" "license-concluded' is provided." msgstr "" -"error: se requiere --creator-person=NAME o --creator-organization=NAME " -"cuando se proporciona --add-license-concluded" +"Se requiere '--creator-person' o '--creator-organization' cuando se " +"proporciona '--add-license-concluded'." #: src/reuse/cli/spdx.py:97 #, python-brace-format @@ -560,12 +553,12 @@ msgstr "Lista de todas las licencias SPDX compatibles" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format msgid "{editor}: Editing failed" -msgstr "" +msgstr "{editor}: Error de edición" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 #, python-brace-format msgid "{editor}: Editing failed: {e}" -msgstr "" +msgstr "{editor}: Error de edición: {e}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 msgid "Aborted!" @@ -630,13 +623,13 @@ msgid "(dynamic)" msgstr "(dinámico)" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 -#, fuzzy, python-brace-format +#, python-brace-format msgid "default: {default}" -msgstr "predeterminado: {predeterminado}" +msgstr "predeterminado: {default}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 msgid "required" -msgstr "" +msgstr "requerido" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 msgid "Show the version and exit." @@ -651,12 +644,12 @@ msgstr "Error: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 #, python-brace-format msgid "Try '{command} {option}' for help." -msgstr "" +msgstr "Probar '{command} {option}' para obtener ayuda." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 #, python-brace-format msgid "Invalid value: {message}" -msgstr "" +msgstr "Valor no válido: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 #, python-brace-format @@ -822,22 +815,22 @@ msgstr "'{}' no es un directorio" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." -msgstr "" +msgstr "{name} {filename!r} no es legible." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 msgid "{name} {filename!r} is not writable." -msgstr "" +msgstr "{name} {filename!r} no se puede escribir." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 msgid "{name} {filename!r} is not executable." -msgstr "" +msgstr "{name} {filename!r} no es ejecutable." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 #, python-brace-format msgid "{len_type} values are required, but {len_value} was given." msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{len_type} se requieren valores, pero se proporcionó {len_value}." +msgstr[1] "{len_type} se requieren valores, pero se proporcionaron {len_value}." #, python-brace-format #~ msgid "Skipped unrecognised file '{path}'" From ff93a87f9d60bbed02087d9f9e1bc36cbda1ac3e Mon Sep 17 00:00:00 2001 From: eulalio Date: Tue, 12 Nov 2024 15:26:09 +0000 Subject: [PATCH 143/156] Translated using Weblate (Spanish) Currently translated at 94.7% (143 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/po/es.po b/po/es.po index 1d97892ab..ee0ff3f4c 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-11 13:00+0000\n" +"PO-Revision-Date: 2024-11-13 16:00+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8.2\n" +"X-Generator: Weblate 5.9-dev\n" #: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." @@ -546,9 +546,8 @@ msgstr "" "spec/conformance/#44-standard-data-format-requirements" #: src/reuse/cli/supported_licenses.py:15 -#, fuzzy msgid "List all licenses on the SPDX License List." -msgstr "Lista de todas las licencias SPDX compatibles" +msgstr "Enumere todas las licencias en la lista de licencias SPDX." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format @@ -654,12 +653,11 @@ msgstr "Valor no válido: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 #, python-brace-format msgid "Invalid value for {param_hint}: {message}" -msgstr "" +msgstr "Valor no válido para {param_hint}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 -#, fuzzy msgid "Missing argument" -msgstr "parámetros posicionales" +msgstr "Argumento que falta" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 msgid "Missing option" @@ -762,8 +760,8 @@ msgstr "" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 msgid "{value!r} is not {choice}." msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{value!r} no es {choice}." +msgstr[1] "{value!r} no es uno de los {choices}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 msgid "{value!r} does not match the format {format}." @@ -809,9 +807,9 @@ msgid "{name} {filename!r} is a file." msgstr "{name} {filename!r} es un archivo." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} '{filename}' is a directory." -msgstr "'{}' no es un directorio" +msgstr "{name} '{filename}' es un directorio." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." From d2ab913e720613181883fc64601ab08588924ca5 Mon Sep 17 00:00:00 2001 From: eulalio Date: Wed, 13 Nov 2024 17:15:44 +0000 Subject: [PATCH 144/156] Translated using Weblate (Spanish) Currently translated at 95.3% (144 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/es/ --- po/es.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/es.po b/po/es.po index ee0ff3f4c..87cd9a2c9 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-13 16:00+0000\n" +"PO-Revision-Date: 2024-11-14 07:53+0000\n" "Last-Translator: eulalio \n" "Language-Team: Spanish \n" @@ -683,11 +683,11 @@ msgid "No such option: {name}" msgstr "No existe tal opción: {name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Did you mean {possibility}?" msgid_plural "(Possible options: {possibilities})" msgstr[0] "¿Querías decir {possibility}?" -msgstr[1] "¿Querían decir: {possibility}?" +msgstr[1] "(Opciones posibles: {possibilities})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" From 65350bb28bfe784443d4b037a8921a9adaa5574c Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:13:20 +0100 Subject: [PATCH 145/156] Update poetry.lock Signed-off-by: Carmen Bianca BAKKER --- poetry.lock | 772 +++++++++++++++++++++++----------------------------- 1 file changed, 342 insertions(+), 430 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5403c5225..d5f3dceb5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.16" description = "A light, configurable Sphinx theme" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -14,14 +13,13 @@ files = [ [[package]] name = "astroid" -version = "3.3.4" +version = "3.3.5" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.4-py3-none-any.whl", hash = "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd"}, - {file = "astroid-3.3.4.tar.gz", hash = "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162"}, + {file = "astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8"}, + {file = "astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d"}, ] [package.dependencies] @@ -31,7 +29,6 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} name = "attrs" version = "24.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -51,7 +48,6 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] name = "babel" version = "2.16.0" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -66,7 +62,6 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -88,7 +83,6 @@ lxml = ["lxml"] name = "binaryornot" version = "0.4.4" description = "Ultra-lightweight pure Python package to check if a file is binary or text." -category = "main" optional = false python-versions = "*" files = [ @@ -101,34 +95,33 @@ chardet = ">=3.0.2" [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" description = "The uncompromising code formatter." -category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, ] [package.dependencies] @@ -142,7 +135,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -150,7 +143,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "boolean-py" version = "4.0" description = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL." -category = "main" optional = false python-versions = "*" files = [ @@ -160,28 +152,25 @@ files = [ [[package]] name = "bumpver" -version = "2023.1129" +version = "2024.1130" description = "Bump version numbers in project files." -category = "dev" optional = false python-versions = ">=2.7" files = [ - {file = "bumpver-2023.1129-py2.py3-none-any.whl", hash = "sha256:b2a55c0224215b6ca1c3a0c99827749927b7c61cbb5dfef75565dbda8e75f687"}, - {file = "bumpver-2023.1129.tar.gz", hash = "sha256:2a09813066d92ae2eabf882d4f9a88ebd60135e828c424bdf7800e1723e15010"}, + {file = "bumpver-2024.1130-py2.py3-none-any.whl", hash = "sha256:8e54220aefe7db25148622f45959f7beb6b8513af0b0429b38b9072566665a49"}, + {file = "bumpver-2024.1130.tar.gz", hash = "sha256:74f7ebc294b2240f346e99748cc6f238e57b050999d7428db75d76baf2bf1437"}, ] [package.dependencies] click = {version = "*", markers = "python_version >= \"3.6\""} colorama = ">=0.4" lexid = "*" -looseversion = {version = "*", markers = "python_version >= \"3.5\""} toml = "*" [[package]] name = "certifi" version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -193,7 +182,6 @@ files = [ name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -205,7 +193,6 @@ files = [ name = "chardet" version = "5.2.0" description = "Universal encoding detector for Python 3" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -215,109 +202,122 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -332,7 +332,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -342,84 +341,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.4" description = "Code coverage measurement for Python" -category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.dependencies] @@ -430,14 +418,13 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -446,21 +433,19 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] name = "docstring-to-markdown" version = "0.15" description = "On the fly conversion of Python docstrings to markdown" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -472,7 +457,6 @@ files = [ name = "docutils" version = "0.21.2" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -484,7 +468,6 @@ files = [ name = "exceptiongroup" version = "1.2.2" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -499,7 +482,6 @@ test = ["pytest (>=6)"] name = "filelock" version = "3.16.1" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -516,7 +498,6 @@ typing = ["typing-extensions (>=4.12.2)"] name = "freezegun" version = "1.5.1" description = "Let your Python tests travel through time" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -531,7 +512,6 @@ python-dateutil = ">=2.7" name = "furo" version = "2024.8.6" description = "A clean customisable Sphinx documentation theme." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -549,7 +529,6 @@ sphinx-basic-ng = ">=1.0.0.beta2" name = "gitdb" version = "4.0.11" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -564,7 +543,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -581,14 +559,13 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "identify" -version = "2.6.1" +version = "2.6.2" description = "File identification library for Python" -category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, - {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, + {file = "identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3"}, + {file = "identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd"}, ] [package.extras] @@ -598,7 +575,6 @@ license = ["ukkonen"] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -613,7 +589,6 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -625,7 +600,6 @@ files = [ name = "importlib-metadata" version = "8.5.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -649,7 +623,6 @@ type = ["pytest-mypy"] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -661,7 +634,6 @@ files = [ name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -674,29 +646,27 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -714,7 +684,6 @@ i18n = ["Babel (>=2.7)"] name = "lexid" version = "2021.1006" description = "Variable width build numbers with lexical ordering." -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -724,14 +693,13 @@ files = [ [[package]] name = "license-expression" -version = "30.3.1" +version = "30.4.0" description = "license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic." -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "license_expression-30.3.1-py3-none-any.whl", hash = "sha256:97904b9185c7bbb1e98799606fa7424191c375e70ba63a524b6f7100e42ddc46"}, - {file = "license_expression-30.3.1.tar.gz", hash = "sha256:60d5bec1f3364c256a92b9a08583d7ea933c7aa272c8d36d04144a89a3858c01"}, + {file = "license_expression-30.4.0-py3-none-any.whl", hash = "sha256:7c8f240c6e20d759cb8455e49cb44a923d9e25c436bf48d7e5b8eea660782c04"}, + {file = "license_expression-30.4.0.tar.gz", hash = "sha256:6464397f8ed4353cc778999caec43b099f8d8d5b335f282e26a9eb9435522f05"}, ] [package.dependencies] @@ -741,23 +709,10 @@ files = [ docs = ["Sphinx (>=5.0.2)", "doc8 (>=0.11.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-reredirects (>=0.1.2)", "sphinx-rtd-dark-mode (>=1.3.0)", "sphinx-rtd-theme (>=1.0.0)", "sphinxcontrib-apidoc (>=0.4.0)"] testing = ["black", "isort", "pytest (>=6,!=7.0.0)", "pytest-xdist (>=2)", "twine"] -[[package]] -name = "looseversion" -version = "1.3.0" -description = "Version numbering for anarchists and software realists" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "looseversion-1.3.0-py2.py3-none-any.whl", hash = "sha256:781ef477b45946fc03dd4c84ea87734b21137ecda0e1e122bcb3c8d16d2a56e0"}, - {file = "looseversion-1.3.0.tar.gz", hash = "sha256:ebde65f3f6bb9531a81016c6fef3eb95a61181adc47b7f949e9c0ea47911669e"}, -] - [[package]] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -780,79 +735,78 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -864,7 +818,6 @@ files = [ name = "mdit-py-plugins" version = "0.4.2" description = "Collection of plugins for markdown-it-py" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -884,7 +837,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -894,39 +846,43 @@ files = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.13.0" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] @@ -936,6 +892,7 @@ typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -944,7 +901,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -956,7 +912,6 @@ files = [ name = "myst-parser" version = "3.0.1" description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -983,7 +938,6 @@ testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0, name = "nodeenv" version = "1.9.1" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -993,21 +947,19 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] name = "parso" version = "0.8.4" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1023,7 +975,6 @@ testing = ["docopt", "pytest"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1035,7 +986,6 @@ files = [ name = "pbr" version = "6.1.0" description = "Python Build Reasonableness" -category = "dev" optional = false python-versions = ">=2.6" files = [ @@ -1047,7 +997,6 @@ files = [ name = "platformdirs" version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1064,7 +1013,6 @@ type = ["mypy (>=1.11.2)"] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1078,14 +1026,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.8.0" +version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, - {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, ] [package.dependencies] @@ -1099,7 +1046,6 @@ virtualenv = ">=20.10.0" name = "protokolo" version = "3.0.0" description = "Protokolo is a change log generator." -category = "dev" optional = false python-versions = "<4.0,>=3.11" files = [ @@ -1115,7 +1061,6 @@ click = ">=8.0" name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1130,7 +1075,6 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pylint" version = "3.3.1" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -1143,8 +1087,8 @@ astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" @@ -1161,7 +1105,6 @@ testutils = ["gitpython (>3)"] name = "pyls-isort" version = "0.2.2" description = "Isort plugin for python-lsp-server" -category = "dev" optional = false python-versions = "*" files = [ @@ -1176,7 +1119,6 @@ python-lsp-server = "*" name = "pylsp-mypy" version = "0.6.9" description = "Mypy linter for the Python LSP Server" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1196,7 +1138,6 @@ test = ["coverage", "pytest", "pytest-cov", "tox"] name = "pytest" version = "8.3.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1217,18 +1158,17 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-cov" -version = "5.0.0" +version = "6.0.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} +coverage = {version = ">=7.5", extras = ["toml"]} pytest = ">=4.6" [package.extras] @@ -1238,7 +1178,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1253,7 +1192,6 @@ six = ">=1.5" name = "python-debian" version = "0.1.49" description = "Debian package related modules" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1268,7 +1206,6 @@ chardet = "*" name = "python-lsp-black" version = "2.0.0" description = "Black plugin for the Python LSP Server" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1288,7 +1225,6 @@ dev = ["flake8", "isort (>=5.0)", "mypy", "pre-commit", "pytest", "types-pkg-res name = "python-lsp-jsonrpc" version = "1.1.2" description = "JSON RPC 2.0 server library" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1306,7 +1242,6 @@ test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] name = "python-lsp-server" version = "1.12.0" description = "Python Language Server for the Language Server Protocol" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1340,7 +1275,6 @@ yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] name = "pyyaml" version = "6.0.2" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1403,7 +1337,6 @@ files = [ name = "requests" version = "2.32.3" description = "Python HTTP for Humans." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1425,7 +1358,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1437,7 +1369,6 @@ files = [ name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1449,7 +1380,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -1461,7 +1391,6 @@ files = [ name = "soupsieve" version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1473,7 +1402,6 @@ files = [ name = "sphinx" version = "7.4.7" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1510,7 +1438,6 @@ test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1528,7 +1455,6 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta name = "sphinxcontrib-apidoc" version = "0.5.0" description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1544,7 +1470,6 @@ Sphinx = ">=5.0.0" name = "sphinxcontrib-applehelp" version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1561,7 +1486,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1578,7 +1502,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1595,7 +1518,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1610,7 +1532,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1627,7 +1548,6 @@ test = ["defusedxml (>=0.7.1)", "pytest"] name = "sphinxcontrib-serializinghtml" version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1644,7 +1564,6 @@ test = ["pytest"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1654,21 +1573,19 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.1.0" description = "A lil' TOML parser" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] name = "tomlkit" version = "0.13.2" description = "Style preserving TOML library" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1680,7 +1597,6 @@ files = [ name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1692,7 +1608,6 @@ files = [ name = "ujson" version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1780,7 +1695,6 @@ files = [ name = "urllib3" version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1796,14 +1710,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.27.1" description = "Virtual Python Environment builder" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, - {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, + {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] @@ -1817,14 +1730,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] From d7671bf11876ca50469d7449280df96ea514455c Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:15:11 +0100 Subject: [PATCH 146/156] =?UTF-8?q?Bump=20version:=20v5.0.0=20=E2=86=92=20?= =?UTF-8?q?v5.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- docs/conf.py | 2 +- pyproject.toml | 4 ++-- src/reuse/__init__.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 71d96eb6d..bea45d7f5 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ Git. This uses [pre-commit](https://pre-commit.com/). Once you ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v5.0.0 + rev: v5.0.1 hooks: - id: reuse ``` @@ -263,7 +263,7 @@ use the following configuration: ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v5.0.0 + rev: v5.0.1 hooks: - id: reuse-lint-file ``` diff --git a/docs/conf.py b/docs/conf.py index aabb018cb..f9b2a2ee3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ # The full version, including alpha/beta/rc tags. release = get_version("reuse") except PackageNotFoundError: - release = "5.0.0" + release = "5.0.1" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) diff --git a/pyproject.toml b/pyproject.toml index 20df9cf2c..fc6caf6fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ [tool.poetry] name = "reuse" -version = "5.0.0" +version = "5.0.1" description = "reuse is a tool for compliance with the REUSE recommendations." authors = [ "Free Software Foundation Europe ", @@ -106,7 +106,7 @@ requires = ["poetry-core>=1.1.0"] build-backend = "poetry.core.masonry.api" [bumpver] -current_version = "v5.0.0" +current_version = "v5.0.1" version_pattern = "vMAJOR.MINOR.PATCH[PYTAGNUM]" commit_message = "Bump version: {old_version} → {new_version}" tag_message = "{new_version}" diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 0aeb02065..f358ee57d 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -34,7 +34,7 @@ __version__ = version("reuse") except PackageNotFoundError: # package is not installed - __version__ = "5.0.0" + __version__ = "5.0.1" __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" From 9625a50fbe7e22f3d3b6386d28545e81004bab07 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:17:09 +0100 Subject: [PATCH 147/156] v5.0.1 entry for change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 8 ++++++++ changelog.d/fixed/strip-plus.md | 2 -- 2 files changed, 8 insertions(+), 2 deletions(-) delete mode 100644 changelog.d/fixed/strip-plus.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 64f35442c..bb951fa72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ CLI command and its behaviour. There are no guarantees of stability for the +## v5.0.1 - 2024-11-14 + +### Fixed + +- Fix readthedocs build. + ## v5.0.0 - 2024-10-17 This is a big release for a small change set. With this release, the tool @@ -106,6 +112,8 @@ subtly improved release of the much bigger version 3.2. unparseable. This is now fixed. (#1047) - Fixed a bug where `REUSE.toml` did not correctly apply its annotations to files which have an accompanying `.license` file. (#1058) +- When running `reuse download SPDX-IDENTIFIER+`, download `SPDX-IDENTIFIER` + instead. This also works for `reuse download --all`. (#1098) ## v4.0.3 - 2024-07-08 diff --git a/changelog.d/fixed/strip-plus.md b/changelog.d/fixed/strip-plus.md deleted file mode 100644 index 7bb17a561..000000000 --- a/changelog.d/fixed/strip-plus.md +++ /dev/null @@ -1,2 +0,0 @@ -- When running `reuse download SPDX-IDENTIFIER+`, download `SPDX-IDENTIFIER` - instead. This also works for `reuse download --all`. (#1098) From fd7b76cd902f52878e4e7a307471ae9d55e27275 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:19:03 +0100 Subject: [PATCH 148/156] Add step to release check list Signed-off-by: Carmen Bianca BAKKER --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6067fa675..788480c64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -116,6 +116,8 @@ possible, run `poetry lock --no-update`. - `make update-resources` - `protokolo compile -f version vx.y.z` - Alter changelog +- `poetry lock` (otherwise documentation won't generate; + ) - Do some final tweaks/bugfixes (and alter changelog) - `make test-release` - `pip install -i https://test.pypi.org/simple reuse` and test the package. From e4399ce777e67b6a1112b57330ddf406c9759904 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:27:41 +0100 Subject: [PATCH 149/156] Fix v5.0.0 date in change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb951fa72..e089f70f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ CLI command and its behaviour. There are no guarantees of stability for the - Fix readthedocs build. -## v5.0.0 - 2024-10-17 +## v5.0.0 - 2024-11-14 This is a big release for a small change set. With this release, the tool becomes compatible with From 2078f109e709b2c0fa47c86374ad7bfa06a7fb69 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:27:41 +0100 Subject: [PATCH 150/156] Fix v5.0.0 date in change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb951fa72..e089f70f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ CLI command and its behaviour. There are no guarantees of stability for the - Fix readthedocs build. -## v5.0.0 - 2024-10-17 +## v5.0.0 - 2024-11-14 This is a big release for a small change set. With this release, the tool becomes compatible with From ed9cf7457175694be45a4a95fc5cb79a20cc2878 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:31:34 +0100 Subject: [PATCH 151/156] Add change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e089f70f2..2ff4e2717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ CLI command and its behaviour. There are no guarantees of stability for the +## v5.0.2 - 2024-11-14 + +### Fixed + +- The release date for the v5.0.0 entry in the change log was wrong. + ## v5.0.1 - 2024-11-14 ### Fixed From 920b64419e8e15e2e60818d3d473f8a110b97e87 Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:32:08 +0100 Subject: [PATCH 152/156] =?UTF-8?q?Bump=20version:=20v5.0.1=20=E2=86=92=20?= =?UTF-8?q?v5.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- docs/conf.py | 2 +- pyproject.toml | 4 ++-- src/reuse/__init__.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bea45d7f5..0525db72d 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ Git. This uses [pre-commit](https://pre-commit.com/). Once you ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v5.0.1 + rev: v5.0.2 hooks: - id: reuse ``` @@ -263,7 +263,7 @@ use the following configuration: ```yaml repos: - repo: https://github.com/fsfe/reuse-tool - rev: v5.0.1 + rev: v5.0.2 hooks: - id: reuse-lint-file ``` diff --git a/docs/conf.py b/docs/conf.py index f9b2a2ee3..106029518 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ # The full version, including alpha/beta/rc tags. release = get_version("reuse") except PackageNotFoundError: - release = "5.0.1" + release = "5.0.2" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) diff --git a/pyproject.toml b/pyproject.toml index fc6caf6fa..eb4c41f62 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ [tool.poetry] name = "reuse" -version = "5.0.1" +version = "5.0.2" description = "reuse is a tool for compliance with the REUSE recommendations." authors = [ "Free Software Foundation Europe ", @@ -106,7 +106,7 @@ requires = ["poetry-core>=1.1.0"] build-backend = "poetry.core.masonry.api" [bumpver] -current_version = "v5.0.1" +current_version = "v5.0.2" version_pattern = "vMAJOR.MINOR.PATCH[PYTAGNUM]" commit_message = "Bump version: {old_version} → {new_version}" tag_message = "{new_version}" diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index f358ee57d..19b849312 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -34,7 +34,7 @@ __version__ = version("reuse") except PackageNotFoundError: # package is not installed - __version__ = "5.0.1" + __version__ = "5.0.2" __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" From 3a82e7e43a4b0614da4ed63a16c7220af9edf46b Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Thu, 14 Nov 2024 10:49:44 +0100 Subject: [PATCH 153/156] Remove TODO in change log Signed-off-by: Carmen Bianca BAKKER --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ff4e2717..b85bf93cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,7 +54,7 @@ subtly improved release of the much bigger version 3.2. - Poetry lock file (`poetry.lock`) (#1037) - Added `lint-file` subcommand to enable running lint on specific files. (#1055) - Added shell completion via `click`. (#1084) -- Added Jujutsu VCS support. (#TODO) +- Added Jujutsu VCS support. (#1051) - Added new copyright prefixes `spdx-string`, `spdx-string-c`, and `spdx-string-symbol`. (#979) - Support for Python 3.13. (#1092) From a7896a5be6347cc917abb7eb3afd7fffbcedb99b Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Sun, 24 Nov 2024 15:30:19 +0000 Subject: [PATCH 154/156] Translated using Weblate (Russian) Currently translated at 27.1% (41 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/ru/ --- po/ru.po | 62 ++++++++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/po/ru.po b/po/ru.po index 13e104d8b..2140a49c4 100644 --- a/po/ru.po +++ b/po/ru.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-10-12 11:15+0000\n" +"PO-Revision-Date: 2024-11-24 19:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." @@ -68,109 +68,99 @@ msgid "" "By using --copyright and --license, you can specify which copyright holders " "and licenses to add to the headers of the given files." msgstr "" +"Используя --copyright и --license, вы можете указать, каких правообладателей " +"и лицензии следует добавить в заголовки заданных файлов." #: src/reuse/cli/annotate.py:277 msgid "" "By using --contributor, you can specify people or entity that contributed " "but are not copyright holder of the given files." msgstr "" +"Используя команду --contributor, вы можете указать людей или организации, " +"которые внесли свой вклад, но не являются правообладателями данных файлов." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:290 msgid "COPYRIGHT" -msgstr "" +msgstr "КОПИРАЙТ" #: src/reuse/cli/annotate.py:293 -#, fuzzy msgid "Copyright statement, repeatable." -msgstr "заявление об авторских правах, повторяемое" +msgstr "Заявление об авторских правах, повторяемое." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:300 msgid "SPDX_IDENTIFIER" -msgstr "" +msgstr "SPDX_ИДЕНТИФИКАТОР" #: src/reuse/cli/annotate.py:303 -#, fuzzy msgid "SPDX License Identifier, repeatable." -msgstr "Идентификатор SPDX, повторяемый" +msgstr "Идентификатор лицензии SPDX, повторяемый." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:309 msgid "CONTRIBUTOR" -msgstr "" +msgstr "КОНТРИБЬЮТОР" #: src/reuse/cli/annotate.py:312 -#, fuzzy msgid "File contributor, repeatable." -msgstr "вкладчик файлов, повторяемость" +msgstr "Вкладчик файлов, повторяющийся." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:319 msgid "YEAR" -msgstr "" +msgstr "ГОД" #: src/reuse/cli/annotate.py:325 -#, fuzzy msgid "Year of copyright statement." -msgstr "год утверждения авторского права, необязательно" +msgstr "Год утверждения авторских прав." #: src/reuse/cli/annotate.py:333 -#, fuzzy msgid "Comment style to use." -msgstr "стиль комментария, который следует использовать, необязательно" +msgstr "Используйте стиль комментариев." #: src/reuse/cli/annotate.py:338 -#, fuzzy msgid "Copyright prefix to use." -msgstr "используемый префикс авторского права, необязательно" +msgstr "Используемый префикс авторского права." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:350 msgid "TEMPLATE" -msgstr "" +msgstr "ОБРАЗЕЦ" #: src/reuse/cli/annotate.py:352 -#, fuzzy msgid "Name of template to use." -msgstr "имя шаблона, который будет использоваться, необязательно" +msgstr "Название используемого шаблона." #: src/reuse/cli/annotate.py:359 -#, fuzzy msgid "Do not include year in copyright statement." -msgstr "не указывайте год в отчете" +msgstr "Не указывайте год в заявлении об авторских правах." #: src/reuse/cli/annotate.py:364 -#, fuzzy msgid "Merge copyright lines if copyright statements are identical." msgstr "" -"объединить строки с авторскими правами, если заявления об авторских правах " -"идентичны" +"Объедините строки с авторскими правами, если заявления об авторских правах " +"идентичны." #: src/reuse/cli/annotate.py:371 -#, fuzzy msgid "Force single-line comment style." -msgstr "стиль однострочных комментариев, необязательно" +msgstr "Принудительный стиль однострочных комментариев." #: src/reuse/cli/annotate.py:378 -#, fuzzy msgid "Force multi-line comment style." -msgstr "установить стиль многострочного комментария, необязательно" +msgstr "Принудительный стиль многострочных комментариев." #: src/reuse/cli/annotate.py:384 -#, fuzzy msgid "Add headers to all files under specified directories recursively." -msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" +msgstr "Рекурсивно добавляет заголовки ко всем файлам в указанных каталогах." #: src/reuse/cli/annotate.py:389 -#, fuzzy msgid "Do not replace the first header in the file; just add a new one." -msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" +msgstr "Не заменяйте первый заголовок в файле, просто добавьте новый." #: src/reuse/cli/annotate.py:396 -#, fuzzy msgid "Always write a .license file instead of a header inside the file." -msgstr "всегда записывайте файл .license вместо заголовка внутри файла" +msgstr "Всегда пишите файл .license вместо заголовка внутри файла." #: src/reuse/cli/annotate.py:403 #, fuzzy From 7a3a7c18491b61ad1be35f28e06f6d72bb42107d Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Mon, 13 Jan 2025 06:44:19 +0000 Subject: [PATCH 155/156] Translated using Weblate (Russian) Currently translated at 98.0% (148 of 151 strings) Translation: Free Software Foundation Europe/reuse-tool Translate-URL: https://hosted.weblate.org/projects/fsfe/reuse-tool/ru/ --- po/ru.po | 315 +++++++++++++++++++++++++++---------------------------- 1 file changed, 156 insertions(+), 159 deletions(-) diff --git a/po/ru.po b/po/ru.po index 2140a49c4..3ac512db0 100644 --- a/po/ru.po +++ b/po/ru.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-24 08:57+0000\n" -"PO-Revision-Date: 2024-11-24 19:09+0000\n" +"PO-Revision-Date: 2025-01-14 06:00+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: src/reuse/cli/annotate.py:58 msgid "Option '--copyright', '--license', or '--contributor' is required." @@ -163,25 +163,22 @@ msgid "Always write a .license file instead of a header inside the file." msgstr "Всегда пишите файл .license вместо заголовка внутри файла." #: src/reuse/cli/annotate.py:403 -#, fuzzy msgid "Write a .license file to files with unrecognised comment styles." -msgstr "" -"записывать файл .license в файлы с нераспознанными стилями комментариев" +msgstr "Запись файла .license в файлы с нераспознанными стилями комментариев." #: src/reuse/cli/annotate.py:410 -#, fuzzy msgid "Skip files with unrecognised comment styles." -msgstr "пропускать файлы с нераспознанными стилями комментариев" +msgstr "Пропуск файлов с нераспознанными стилями комментариев." #: src/reuse/cli/annotate.py:421 -#, fuzzy msgid "Skip files that already contain REUSE information." -msgstr "пропускать файлы, которые уже содержат информацию о REUSE" +msgstr "Пропустить файлы, которые уже содержат информацию REUSE." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/annotate.py:426 +#, fuzzy msgid "PATH" -msgstr "" +msgstr "PATH" #: src/reuse/cli/annotate.py:476 #, python-brace-format @@ -201,12 +198,11 @@ msgstr "" #: src/reuse/cli/common.py:97 #, python-brace-format msgid "'{name}' is mutually exclusive with: {opts}" -msgstr "" +msgstr "'{name}' является взаимоисключающим с: {opts}" #: src/reuse/cli/common.py:114 -#, fuzzy msgid "'{}' is not a valid SPDX expression." -msgstr "'{}' не является правильным выражением SPDX, прерывается" +msgstr "'{}' не является допустимым выражением SPDX." #: src/reuse/cli/convert_dep5.py:19 msgid "" @@ -214,18 +210,19 @@ msgid "" "the project root and is semantically identical. The .reuse/dep5 file is " "subsequently deleted." msgstr "" +"Преобразуйте файл .reuse/dep5 в файл REUSE.toml. Созданный файл помещается в " +"корень проекта и является семантически идентичным. Файл .reuse/dep5 " +"впоследствии удаляется." #: src/reuse/cli/convert_dep5.py:31 -#, fuzzy msgid "No '.reuse/dep5' file." -msgstr "Нет файла '.reuse/dep5'" +msgstr "Файл '.reuse/dep5' отсутствует." #: src/reuse/cli/download.py:52 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не является действительным идентификатором лицензии SPDX." #: src/reuse/cli/download.py:59 -#, fuzzy msgid "Did you mean:" msgstr "Вы имели в виду:" @@ -243,7 +240,7 @@ msgid "Error: {spdx_identifier} already exists." msgstr "Ошибка: {spdx_identifier} уже существует." #: src/reuse/cli/download.py:82 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Error: {path} does not exist." msgstr "Ошибка: {path} не существует." @@ -269,39 +266,37 @@ msgid "" "LICENSE must be a valid SPDX License Identifier. You may specify LICENSE " "multiple times to download multiple licenses." msgstr "" +"LICENSE должен быть действительным идентификатором лицензии SPDX. Вы можете " +"указать LICENSE несколько раз, чтобы загрузить несколько лицензий." #: src/reuse/cli/download.py:122 -#, fuzzy msgid "Download all missing licenses detected in the project." -msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" +msgstr "Загрузите все недостающие лицензии, обнаруженные в проекте." #: src/reuse/cli/download.py:130 msgid "Path to download to." -msgstr "" +msgstr "Путь для загрузки." #: src/reuse/cli/download.py:136 -#, fuzzy msgid "" "Source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself." msgstr "" -"источник, из которого копируются пользовательские лицензии LicenseRef-, либо " -"каталог, содержащий файл, либо сам файл" +"Источник, из которого копируются пользовательские лицензии LicenseRef-, либо " +"каталог, содержащий файл, либо сам файл." #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/download.py:143 -#, fuzzy msgid "LICENSE" -msgstr "ПЛОХАЯ ЛИЦЕНЗИЯ" +msgstr "ЛИЦЕНЗИЯ" #: src/reuse/cli/download.py:159 msgid "The 'LICENSE' argument and '--all' option are mutually exclusive." -msgstr "" +msgstr "Аргумент ' ЛИЦЕНЗИЯ' и опция '--все' являются взаимоисключающими." #: src/reuse/cli/download.py:173 -#, fuzzy msgid "Cannot use '--output' with more than one license." -msgstr "Невозможно использовать --output с более чем одной лицензией" +msgstr "Невозможно использовать '--output' с более чем одной лицензией." #: src/reuse/cli/lint.py:27 #, python-brace-format @@ -311,68 +306,72 @@ msgid "" "find the latest version of the specification at ." msgstr "" +"Проверка каталога проекта на соответствие требованиям REUSE. Эта версия " +"инструмента проверяет версию {reuse_version} спецификации REUSE. Последнюю " +"версию спецификации можно найти по адресу ." #: src/reuse/cli/lint.py:33 msgid "Specifically, the following criteria are checked:" -msgstr "" +msgstr "В частности, проверяются следующие критерии:" #: src/reuse/cli/lint.py:36 msgid "" "- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " "project?" msgstr "" +"- Есть ли в проекте плохие (непризнанные, не соответствующие SPDX) лицензии?" #: src/reuse/cli/lint.py:40 msgid "- Are there any deprecated licenses in the project?" -msgstr "" +msgstr "- Есть ли в проекте устаревшие лицензии?" #: src/reuse/cli/lint.py:43 msgid "" "- Are there any license files in the LICENSES/ directory without file " "extension?" -msgstr "" +msgstr "- Есть ли в каталоге LICENSES/ файлы лицензий без расширения?" #: src/reuse/cli/lint.py:48 msgid "" "- Are any licenses referred to inside of the project, but not included in " "the LICENSES/ directory?" msgstr "" +"- Есть ли лицензии, на которые ссылаются внутри проекта, но которые не " +"включены в каталог LICENSES/?" #: src/reuse/cli/lint.py:53 msgid "" "- Are any licenses included in the LICENSES/ directory that are not used " "inside of the project?" msgstr "" +"- Включены ли в каталог LICENSES/ какие-либо лицензии, которые не " +"используются внутри проекта?" #: src/reuse/cli/lint.py:57 msgid "- Are there any read errors?" -msgstr "" +msgstr "- Есть ли ошибки чтения?" #: src/reuse/cli/lint.py:59 -#, fuzzy msgid "- Do all files have valid copyright and licensing information?" msgstr "" -"Следующие файлы не содержат информации об авторских правах и лицензировании:" +"- Все ли файлы содержат достоверную информацию об авторских правах и " +"лицензировании?" #: src/reuse/cli/lint.py:70 src/reuse/cli/lint_file.py:38 -#, fuzzy msgid "Prevent output." -msgstr "предотвращает выход" +msgstr "Предотвращение выхода." #: src/reuse/cli/lint.py:78 -#, fuzzy msgid "Format output as JSON." -msgstr "форматирует вывод в формате JSON" +msgstr "Формат как JSON." #: src/reuse/cli/lint.py:86 -#, fuzzy msgid "Format output as plain text. (default)" -msgstr "Форматирует вывод в виде обычного текста" +msgstr "Форматирование вывода как обычного текста. (по умолчанию)" #: src/reuse/cli/lint.py:94 -#, fuzzy msgid "Format output as errors per line." -msgstr "Форматирует вывод в виде ошибок на строку" +msgstr "Форматируйте вывод как ошибки в строке." #: src/reuse/cli/lint_file.py:25 msgid "" @@ -380,27 +379,29 @@ msgid "" "for the presence of copyright and licensing information, and whether the " "found licenses are included in the LICENSES/ directory." msgstr "" +"Проверка отдельных файлов на соответствие стандарту REUSE. Указанные ФАЙЛЫ " +"проверяются на наличие информации об авторских правах и лицензировании, а " +"также на то, включены ли найденные лицензии в каталог LICENSES/." #: src/reuse/cli/lint_file.py:46 -#, fuzzy msgid "Format output as errors per line. (default)" -msgstr "Форматирует вывод в виде ошибок на строку" +msgstr "Форматировать вывод в виде ошибок в строке. (по умолчанию)" #. TRANSLATORS: You may translate this. Please preserve capital letters. #: src/reuse/cli/lint_file.py:51 msgid "FILE" -msgstr "" +msgstr "ФАЙЛ" #: src/reuse/cli/lint_file.py:65 #, python-brace-format msgid "'{file}' is not inside of '{root}'." -msgstr "" +msgstr "'{file}' не находится внутри '{root}'." #: src/reuse/cli/main.py:37 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:465 -#, fuzzy, python-format +#, python-format msgid "%(prog)s, version %(version)s" -msgstr "%(prog)s: ошибка: %(message)s\n" +msgstr "%(prog)s, версия %(version)s" #: src/reuse/cli/main.py:40 msgid "" @@ -409,6 +410,11 @@ msgid "" "Software Foundation, either version 3 of the License, or (at your option) " "any later version." msgstr "" +"Эта программа является свободным программным обеспечением: вы можете " +"распространять ее и/или изменять в соответствии с условиями Стандартной " +"общественной лицензии GNU, опубликованной Фондом свободного программного " +"обеспечения, либо версии 3 этой лицензии, либо (по вашему выбору) любой " +"более поздней версии." #: src/reuse/cli/main.py:47 msgid "" @@ -417,12 +423,19 @@ msgid "" "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" +"Эта программа распространяется в надежде, что она окажется полезной, но БЕЗ " +"КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий ТОВАРНОЙ ПРИГОДНОСТИ " +"или ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ. Более подробную информацию см. в " +"Стандартной общественной лицензии GNU." #: src/reuse/cli/main.py:54 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" +"Вместе с этой программой вы должны были получить копию Стандартной " +"общественной лицензии GNU. Если нет, смотрите ." #: src/reuse/cli/main.py:62 msgid "" @@ -458,71 +471,60 @@ msgstr "" "сделать пожертвование по адресу ." #: src/reuse/cli/main.py:89 -#, fuzzy msgid "Enable debug statements." -msgstr "включить отладочные операторы" +msgstr "Включить отладочные операторы." #: src/reuse/cli/main.py:94 -#, fuzzy msgid "Hide deprecation warnings." -msgstr "скрыть предупреждения об устаревании" +msgstr "Скрыть предупреждения об устаревании." #: src/reuse/cli/main.py:99 -#, fuzzy msgid "Do not skip over Git submodules." -msgstr "не пропускайте подмодули Git" +msgstr "Не пропускайте подмодули Git." #: src/reuse/cli/main.py:104 -#, fuzzy msgid "Do not skip over Meson subprojects." -msgstr "не пропускайте мезонные подпроекты" +msgstr "Не пропускайте подпроекты \"Мезон\"." #: src/reuse/cli/main.py:109 -#, fuzzy msgid "Do not use multiprocessing." -msgstr "не используйте многопроцессорную обработку" +msgstr "Не используйте многопроцессорную обработку." #: src/reuse/cli/main.py:119 -#, fuzzy msgid "Define root of project." -msgstr "определить корень проекта" +msgstr "Определите корень проекта." #: src/reuse/cli/spdx.py:23 -#, fuzzy msgid "Generate an SPDX bill of materials." -msgstr "распечатать ведомость материалов проекта в формате SPDX" +msgstr "Создать ведомость материалов в формате SPDX." #: src/reuse/cli/spdx.py:33 msgid "File to write to." -msgstr "" +msgstr "Файл для записи." #: src/reuse/cli/spdx.py:39 -#, fuzzy msgid "" "Populate the LicenseConcluded field; note that reuse cannot guarantee that " "the field is accurate." msgstr "" -"заполните поле LicenseConcluded; обратите внимание, что повторное " -"использование не может гарантировать точность поля" +"Заполните поле LicenseConcluded; обратите внимание, что повторное " +"использование не может гарантировать точность поля." #: src/reuse/cli/spdx.py:51 -#, fuzzy msgid "Name of the person signing off on the SPDX report." -msgstr "имя лица, подписавшего отчет SPDX" +msgstr "Имя лица, подписавшего отчет SPDX." #: src/reuse/cli/spdx.py:55 -#, fuzzy msgid "Name of the organization signing off on the SPDX report." -msgstr "название организации, подписавшей отчет SPDX" +msgstr "Название организации, подписавшей отчет SPDX." #: src/reuse/cli/spdx.py:82 -#, fuzzy msgid "" "'--creator-person' or '--creator-organization' is required when '--add-" "license-concluded' is provided." msgstr "" -"ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= ИМЯ, " -"если указано --добавить- лицензию- заключенную" +"'--creator-person' или '--creator-organization' требуется, если указано " +"'--add-license-concluded'." #: src/reuse/cli/spdx.py:97 #, python-brace-format @@ -536,215 +538,208 @@ msgstr "" "io/spdx-spec/conformance/#44-standard-data-format-requirements" #: src/reuse/cli/supported_licenses.py:15 -#, fuzzy msgid "List all licenses on the SPDX License List." -msgstr "список всех поддерживаемых лицензий SPDX" +msgstr "Перечислите все лицензии в списке лицензий SPDX." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:518 #, python-brace-format msgid "{editor}: Editing failed" -msgstr "" +msgstr "{editor}: Редактирование не удалось" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/_termui_impl.py:522 #, python-brace-format msgid "{editor}: Editing failed: {e}" -msgstr "" +msgstr "{editor}: Редактирование не удалось: {e}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1120 msgid "Aborted!" -msgstr "" +msgstr "Прервано!" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1309 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:559 -#, fuzzy msgid "Show this message and exit." -msgstr "покажите это справочное сообщение и выйдите" +msgstr "Покажите это сообщение и выйдите." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1340 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1370 -#, fuzzy, python-brace-format +#, python-brace-format msgid "(Deprecated) {text}" -msgstr "Утраченные лицензии:" +msgstr "(Исправлено) {text}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1387 -#, fuzzy msgid "Options" -msgstr "варианты" +msgstr "Параметры" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1413 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Got unexpected extra argument ({args})" msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "ожидается один аргумент" -msgstr[1] "ожидается один аргумент" -msgstr[2] "ожидается один аргумент" +msgstr[0] "Получен неожиданный дополнительный аргумент ({args})" +msgstr[1] "Получили неожиданных дополнительных аргументов ({args})" +msgstr[2] "Получили неожиданных дополнительных аргументов ({args})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1429 msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" +msgstr "DeprecationWarning: Команда {name!r} устарела." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1636 -#, fuzzy msgid "Commands" -msgstr "подкоманды" +msgstr "Команды" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1668 -#, fuzzy msgid "Missing command." -msgstr "Отсутствующие лицензии:" +msgstr "Отсутствующая команда." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:1746 msgid "No such command {name!r}." -msgstr "" +msgstr "Нет такой команды {name!r}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2310 msgid "Value must be an iterable." -msgstr "" +msgstr "Значение должно быть итерируемым." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2331 #, python-brace-format msgid "Takes {nargs} values but 1 was given." msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Принимает значения {nargs}, но было задано 1." +msgstr[1] "Принимает значения {nargs}, но было задано {len}." +msgstr[2] "Принимает значений {nargs}, но было задано {len}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2778 -#, python-brace-format +#, fuzzy, python-brace-format msgid "env var: {var}" -msgstr "" +msgstr "env var: {var}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2808 msgid "(dynamic)" -msgstr "" +msgstr "(динамика)" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2821 #, python-brace-format msgid "default: {default}" -msgstr "" +msgstr "по умолчанию: {default}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/core.py:2834 msgid "required" -msgstr "" +msgstr "требуется" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/decorators.py:528 -#, fuzzy msgid "Show the version and exit." -msgstr "покажите это справочное сообщение и выйдите" +msgstr "Показать версию и выйти." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:44 #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:80 #, python-brace-format msgid "Error: {message}" -msgstr "" +msgstr "Ошибка: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:72 #, python-brace-format msgid "Try '{command} {option}' for help." -msgstr "" +msgstr "Попробуйте '{command} {option}' для помощи." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:121 #, python-brace-format msgid "Invalid value: {message}" -msgstr "" +msgstr "Неверное значение: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:123 #, python-brace-format msgid "Invalid value for {param_hint}: {message}" -msgstr "" +msgstr "Недопустимое значение для {param_hint}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:179 -#, fuzzy msgid "Missing argument" -msgstr "позиционные аргументы" +msgstr "Отсутствующий аргумент" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:181 -#, fuzzy msgid "Missing option" -msgstr "Отсутствующие лицензии:" +msgstr "Отсутствующая опция" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:183 msgid "Missing parameter" -msgstr "" +msgstr "Отсутствующий параметр" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:185 #, python-brace-format msgid "Missing {param_type}" -msgstr "" +msgstr "Отсутствует {param_type}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:192 #, python-brace-format msgid "Missing parameter: {param_name}" -msgstr "" +msgstr "Пропущенный параметр: {param_name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:212 #, python-brace-format msgid "No such option: {name}" -msgstr "" +msgstr "Нет такой опции: {name}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:224 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Did you mean {possibility}?" msgid_plural "(Possible options: {possibilities})" -msgstr[0] "Вы имели в виду:" -msgstr[1] "Вы имели в виду:" -msgstr[2] "Вы имели в виду:" +msgstr[0] "Вы имели в виду {possibility}?" +msgstr[1] "(Возможных вариантов: {possibilities})" +msgstr[2] "(Возможных вариантов: {possibilities})" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:262 msgid "unknown error" -msgstr "" +msgstr "неизвестная ошибка" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/exceptions.py:269 msgid "Could not open file {filename!r}: {message}" -msgstr "" +msgstr "Не удалось открыть файл {filename!r}: {message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:231 msgid "Argument {name!r} takes {nargs} values." -msgstr "" +msgstr "Аргумент {name!r} принимает значения {nargs}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:413 msgid "Option {name!r} does not take a value." -msgstr "" +msgstr "Опция {name!r} не принимает значения." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/parser.py:474 msgid "Option {name!r} requires an argument." msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Опция {name!r} требует аргумента." +msgstr[1] "Опция {name!r} требует аргументов {nargs}." +msgstr[2] "Опция {name!r} требует аргументов {nargs}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:319 msgid "Shell completion is not supported for Bash versions older than 4.4." -msgstr "" +msgstr "Завершение оболочки не поддерживается для версий Bash старше 4.4." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/shell_completion.py:326 msgid "Couldn't detect Bash version, shell completion is not supported." msgstr "" +"Не удалось определить версию Bash, завершение оболочки не поддерживается." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:158 msgid "Repeat for confirmation" -msgstr "" +msgstr "Повторить для подтверждения" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:174 msgid "Error: The value you entered was invalid." -msgstr "" +msgstr "Ошибка: Введенное значение недействительно." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:176 #, python-brace-format msgid "Error: {e.message}" -msgstr "" +msgstr "Ошибка: {e.message}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:187 msgid "Error: The two entered values do not match." -msgstr "" +msgstr "Ошибка: Два введенных значения не совпадают." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:243 msgid "Error: invalid input" -msgstr "" +msgstr "Ошибка: недопустимый ввод" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/termui.py:773 msgid "Press any key to continue..." -msgstr "" +msgstr "Нажмите любую клавишу, чтобы продолжить..." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:266 #, python-brace-format @@ -752,83 +747,85 @@ msgid "" "Choose from:\n" "\t{choices}" msgstr "" +"Выберите из:\n" +"{choices}" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:298 msgid "{value!r} is not {choice}." msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{value!r} не является {choice}." +msgstr[1] "{value!r} не является одним из {choices}." +msgstr[2] "{value!r} не является одним из {choices}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:392 msgid "{value!r} does not match the format {format}." msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{value!r} не соответствует формату {format}." +msgstr[1] "{value!r} не соответствует форматам {formats}." +msgstr[2] "{ value!r} не соответствует форматам {formats}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:414 msgid "{value!r} is not a valid {number_type}." -msgstr "" +msgstr "{value!r} не является допустимым {number_type}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:470 #, python-brace-format msgid "{value} is not in the range {range}." -msgstr "" +msgstr "{value} не входит в диапазон {range}." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:611 msgid "{value!r} is not a valid boolean." -msgstr "" +msgstr "{value!r} не является допустимым булевым числом." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:635 msgid "{value!r} is not a valid UUID." -msgstr "" +msgstr "{value!r} не является действительным UUID." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:822 msgid "file" -msgstr "" +msgstr "файл" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:824 msgid "directory" -msgstr "" +msgstr "каталог" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:826 +#, fuzzy msgid "path" -msgstr "" +msgstr "path" #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:877 -#, fuzzy msgid "{name} {filename!r} does not exist." -msgstr "Ошибка: {path} не существует." +msgstr "{name} {filename!r} не существует." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:886 msgid "{name} {filename!r} is a file." -msgstr "" +msgstr "{name}filename!r} - это файл." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:894 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} '{filename}' is a directory." -msgstr "'{}' не является каталогом" +msgstr "{name} '{filename}' - это каталог." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:903 msgid "{name} {filename!r} is not readable." -msgstr "" +msgstr "{name}filename!r} не читается." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:912 msgid "{name} {filename!r} is not writable." -msgstr "" +msgstr "{name}filename!r} не является критичной." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:921 msgid "{name} {filename!r} is not executable." -msgstr "" +msgstr "{name}filename!r} не подлежит исполнению." #: /home/runner/.cache/pypoetry/virtualenvs/reuse-MK6tuBk_-py3.12/lib/python3.12/site-packages/click/types.py:988 #, python-brace-format msgid "{len_type} values are required, but {len_value} was given." msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Требуется значение {len_type}, но было указано {len_value}." +msgstr[1] "Требуется значение {len_type}, но было указано {len_value}." +msgstr[2] "{len_type} значения необходимы, но {len_value} были даны." #, python-brace-format #~ msgid "Skipped unrecognised file '{path}'" From 512b0e41bad21707ebbfd4c9045d2808ba6530f4 Mon Sep 17 00:00:00 2001 From: Kevin Broch Date: Wed, 25 Oct 2023 08:00:16 -0700 Subject: [PATCH 156/156] add reuse annotate pre-commit hook --- .pre-commit-hooks.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 9533c2658..eca7d6665 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -18,3 +18,10 @@ language: python description: "Lint the changed files for compliance with the REUSE Specification." + +- id: reuse-annotate + name: reuse-annotate + entry: "reuse annotate" + language: python + description: "Add copyright/license header to files" + language_version: python3