pax_global_header00006660000000000000000000000064141623110100014477gustar00rootroot0000000000000052 comment=69eebf8c599cc4811fda3a7d25725be0c14d5e37 reuse-tool-0.14.0/000077500000000000000000000000001416231101000136575ustar00rootroot00000000000000reuse-tool-0.14.0/.bumpversion.cfg000066400000000000000000000006651416231101000167760ustar00rootroot00000000000000[bumpversion] current_version = 0.14.0 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(?P(a|b|rc)?)(?P\d*) serialize = {major}.{minor}.{patch}{release}{releasenumber} {major}.{minor}.{patch} [bumpversion:part:release] values = a b rc [bumpversion:part:releasenumber] [bumpversion:file:src/reuse/__init__.py] [bumpversion:file:setup.py] [bumpversion:file:docs/conf.py] reuse-tool-0.14.0/.editorconfig000066400000000000000000000005441416231101000163370ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later root = true [*] indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf [*.{rst,md,yaml,yml,json}] indent_size = 2 [Makefile] indent_style = tab reuse-tool-0.14.0/.github/000077500000000000000000000000001416231101000152175ustar00rootroot00000000000000reuse-tool-0.14.0/.github/workflows/000077500000000000000000000000001416231101000172545ustar00rootroot00000000000000reuse-tool-0.14.0/.github/workflows/latesttag.py000066400000000000000000000014261416231101000216210ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later import json import subprocess from distutils.version import LooseVersion from urllib.request import urlopen from packaging.version import parse from reuse import __version__ as current def main(): data = json.loads( urlopen("https://pypi.python.org/pypi/reuse/json") .read() .decode("utf-8") ) latest = max( LooseVersion(release) for release in data["releases"] if not parse(release).is_prerelease ) print(f"Latest stable version on PyPI is '{latest}'") print(f"Version in this revision is '{current}'") assert str(latest) == current if __name__ == "__main__": main() reuse-tool-0.14.0/.github/workflows/latesttag.yaml000066400000000000000000000014631416231101000221340ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later name: Verify latest tag on: schedule: - cron: "0 9 * * *" jobs: latest-tag: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 ref: latest - name: Set up Python uses: actions/setup-python@v1 with: python-version: 3.x - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install -r requirements-dev.txt - name: Install reuse run: | python setup.py install - name: Verify latest tag run: | python .github/workflows/latesttag.py reuse-tool-0.14.0/.github/workflows/license_list_up_to_date.py000066400000000000000000000021511416231101000245050ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """A simple script that checks whether the license lists in reuse are up-to-date. For convenience, also overwrite the files. """ from pathlib import Path import requests URLS = { "exceptions.json": "https://raw.githubusercontent.com/spdx/license-list-data/master/json/exceptions.json", "licenses.json": "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json", } def main(): result = 0 for file_, url in URLS.items(): path = Path(f"src/reuse/resources/{file_}") contents = path.read_text() response = requests.get(url) if response.status_code == 200: if response.text == contents: print(f"{file_} is up-to-date") else: result = 1 print(f"{file_} is not up-to-date") path.write_text(response.text) else: result = 1 print(f"could not download {file_}") return result if __name__ == "__main__": main() reuse-tool-0.14.0/.github/workflows/license_list_up_to_date.yaml000066400000000000000000000013271416231101000250230ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later name: Verify that the license lists are up-to-date on: schedule: - cron: "0 9 * * *" jobs: license-list-up-to-date: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v1 with: python-version: 3.x - name: Install dependencies run: | python -m pip install --upgrade pip pip install requests - name: Verify that the license lists are up-to-date run: | python .github/workflows/license_list_up_to_date.py reuse-tool-0.14.0/.github/workflows/pythonpackage.yaml000066400000000000000000000066011416231101000230000ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later name: Python package on: [push, pull_request] jobs: test: runs-on: ${{ matrix.os }} strategy: max-parallel: 10 matrix: python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] os: [ubuntu-latest, macos-latest, windows-latest] exclude: - os: macos-latest python-version: '3.6' steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Install reuse run: | python setup.py install - name: Run tests with pytest run: | make test pylint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.6 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Lint with PyLint run: | make lint black: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.6 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Test formatting with black run: | make blackcheck reuse: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.6 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Install reuse run: | python setup.py install - name: Test REUSE compliance run: | make reuse docs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.6 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Install reuse run: | python setup.py install - name: Create docs with Sphinx run: | make docs docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Dockerfile run: | docker build -t reuse . - name: Run Docker image run: | docker run -v "$(pwd):/data" reuse - name: Build Dockerfile-extra run: | docker build -t reuse-extra --file Dockerfile-extra . - name: Run Docker extra image run: | docker run -v "$(pwd):/data" reuse-extra - name: Build Dockerfile-debian run: | docker build -t reuse-debian --file Dockerfile-debian . - name: Run Docker debian image run: | docker run -v "$(pwd):/data" reuse-debian reuse-tool-0.14.0/.gitignore000066400000000000000000000045401416231101000156520ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: CC0-1.0 # Created by https://www.gitignore.io/api/linux,python # Edit at https://www.gitignore.io/?templates=linux,python ### Linux ### *~ # temporary files which can be created if a process still has a handle open of a deleted file .fuse_hidden* # KDE directory preferences .directory # Linux trash folder which might appear on any partition or disk .Trash-* # .nfs files are created when an open file is removed but is still being accessed .nfs* ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don’t work, or not # install all needed dependencies. #Pipfile.lock # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # End of https://www.gitignore.io/api/linux,python po/reuse.pot *.mo docs/api/ docs/history.md docs/readme.md prof/ reuse-tool-0.14.0/.pre-commit-config.yaml000066400000000000000000000012331416231101000201370ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later repos: - repo: https://github.com/ambv/black rev: stable hooks: - id: black - repo: https://github.com/pycqa/isort rev: 5.9.3 hooks: - id: isort name: isort (python) types: [python] - id: isort name: isort (cython) types: [cython] - id: isort name: isort (pyi) types: [pyi] - repo: local hooks: - id: pylint name: pylint entry: pylint language: system types: [python] files: ^(src|tests)/ reuse-tool-0.14.0/.pre-commit-hooks.yaml000066400000000000000000000005061416231101000200170ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later - id: reuse name: reuse entry: reuse lint language: python pass_filenames: false description: "Lint the project directory for compliance with the REUSE Specification" language_version: python3 reuse-tool-0.14.0/.pylintrc000066400000000000000000000034401416231101000155250ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later [MASTER] jobs=0 [MESSAGES CONTROL] # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=redefined-builtin,C0330,duplicate-code,logging-format-interpolation,line-too-long,implicit-str-concat,logging-fstring-interpolation,unsubscriptable-object,inherit-non-class [REPORTS] # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio).You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages reports=yes [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format=LF # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=79 # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [BASIC] # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_,fp [MISCELLANEOUS] notes=FIXME,XXX reuse-tool-0.14.0/.reuse/000077500000000000000000000000001416231101000150605ustar00rootroot00000000000000reuse-tool-0.14.0/.reuse/dep5000066400000000000000000000014671416231101000156500ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: reuse Upstream-Contact: Carmen Bianca Bakker Source: https://github.com/fsfe/reuse-tool Files: .bumpversion.cfg setup.cfg Copyright: 2017 Free Software Foundation Europe e.V. License: GPL-3.0-or-later Files: docs/reuse*.rst Copyright: 2017 Free Software Foundation Europe e.V. License: CC-BY-SA-4.0 Files: docs/modules.rst Copyright: 2017 Free Software Foundation Europe e.V. License: CC-BY-SA-4.0 Files: tests/resources/* Copyright: 2017 Free Software Foundation Europe e.V. License: GPL-3.0-or-later Files: src/reuse.egg-info/* Copyright: 2017 Free Software Foundation Europe e.V. License: GPL-3.0-or-later reuse-tool-0.14.0/AUTHORS.rst000066400000000000000000000027461416231101000155470ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-FileCopyrightText: 2017 Sebastian Schuberth SPDX-License-Identifier: CC-BY-SA-4.0 ======= Credits ======= Development Lead ---------------- - Carmen Bianca Bakker Contributors ------------ - Sebastian Schuberth - Max Mehl - Matija Šuklje - Greg Kroah-Hartman - Basil Peace - Keith Maxwell - Stefan Bakker - Kirill Elagin - John Mulligan - Tuomas Siipola - Diego Elio Pettenò - David Alfonso - Maximilian Dolling - yoctocell - Tuomas Siipola Translators ----------- - Dutch: + André Ockers + Carmen Bianca Bakker - French: + OliBug + Vincent Lequertier - Galician: + pd - German: + Max Mehl + Thomas Doczkal - Esperanto: + Carmen Bianca Bakker + Tirifto - Italian: + Luca Bonissi - Portuguese: + José Vieira - Spanish: + flow + pd + Roberto Bauglir - Turkish: + T. E. Kalayci reuse-tool-0.14.0/CHANGELOG.md000066400000000000000000000501671416231101000155010ustar00rootroot00000000000000 # Change log This change log follows the [Keep a Changelog](http://keepachangelog.com/) spec. Every release contains the following sections: - `Added` for new features. - `Changed` for changes in existing functionality. - `Deprecated` for soon-to-be removed features. - `Removed` for now removed features. - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. The versions follow [semantic versioning](https://semver.org). ## 0.14.0 - 2021-12-27 Happy holidays! This is mainly a maintenance release fixing some subcommands and adding loads of supported file types and file names. However, you can also enjoy the `supported-licenses` subcommand and the `--quiet` flag for linting as well as better suggestions for license identifiers. Thanks to everyone who contributed! ### Added - `supported-licenses` command that lists all licenses supported by REUSE (#401) - `--quiet` switch to the `lint` command (#402) - Better suggestions for faulty SPDX license identifiers in `download` and `init` (#416) - Python 3.10 support declared - More file types are recognised: - Apache FreeMarker Template Language (`.ftl`) - AsciiDoc (`.adoc`, `.asc`, `.asciidoc`) - Bibliography (`.csl`) - C++ (`.cc` and `.hh`) - GraphQL (`.graphql`) - Handlebars (`.hbs`) - Markdown-linter config (`.mdlrc`) - MS Office (`.doc`, `.xls`, `.pptx` and many more) - Nimble (`.nim.cfg`, `.nimble`) - Open Document Format (`.odt`, `.ods`, `.fodp` and many more) - Perl plain old documentation (`.pod`) - Portable document format (`.pdf`) - Protobuf files (`.proto`) - Soy templates (`.soy`) - SuperCollider (`.sc`, `.scsyndef`) - Turtle/RDF (`.ttl`) - V-Lang (`.v`, `.vsh`) - Vue.js (`.vue`) - More file names are recognised: - Doxygen (`Doxyfile`) - ESLint (`.eslintignore` and `.eslintrc`) - Meson options file (`meson_options.txt`) - NPM ignore (`.npmignore`) - Podman container files (`Containerfile`) - SuperCollider (`archive.sctxar`) - Yarn package manager (`.yarn.lock` and `.yarnrc`) ### Changed - Updated SPDX license list to 3.15 ### Fixed - Fix Extensible Stylesheet Language (`.xsl`) to use HTML comment syntax - Allow creating .license file for write-protected files (#347) (#418) - Do not break XML files special first line (#378) - Make `download` subcommand work correctly outside of project root and with `--root` (#430) ## 0.13.0 - 2021-06-11 ### Added - `addheader` recognises file types that specifically require .license files instead of headers using `UncommentableCommentStyle`. (#189) - `.hgtags` is ignored. (#227) - `spdx-symbol` added to possible copyright styles. (#350) - `addheader` ignores case when matching file extensions and names. (#359) - Provide `latest-debian` as Docker Hub tag, created by `Dockerfile-debian`. (#321) - More file types are recognised: - Javascript modules (`.mjs`) - Jupyter Notebook (`.ipynb`) - Scalable Vector Graphics (`.svg`) - JSON (`.json`) - Comma-separated values (`.csv`) - Racket (`.rkt`) - Org-mode (`.org`) - LaTeX package files (`.sty`) - devicetree (`.dts`, `.dtsi`) - Bitbake (.bb, .bbappend, .bbclass) - XML schemas (`.xsd`) - OpenSCAD (`.scad`) - More file names are recognised: - Bash configuration (`.bashrc`) - Coverage.py (`.coveragerc`) - Jenkins (`Jenkinsfile`) - SonarScanner (`sonar-project.properties`) - Gradle (`gradle-wrapper.properties`, `gradlew`) ### Changed - Bump `alpine` Docker base image to 3.13. (#369) ### Fixed - Fixed a regression where unused licenses were not at all detected. (#285) - Declared dependency on `python-debian != 0.1.39` on Windows. This version does not import on Windows. (#310) - `MANIFEST.in` is now recognised instead of the incorrect `Manifest.in` by `addheader`. (#306) - `addheader` now checks whether a file is both readable and writeable instead of only writeable. (#241) - `addheader` now preserves line endings. (#308) - `download` does no longer fail when both `--output` and `--all` are used. (#326) - Catch erroneous SPDX expressions. (#331) - Updated SPDX license list to 3.13. ## 0.12.1 - 2020-12-17 ### Fixed - Bumped versions of requirements. (#288) ## 0.12.0 - 2020-12-16 This release was delayed due to the absence of the lead developer (Carmen, me, the person writing these release notes). Many thanks to Max Mehl for coordinating the project in my absence. Many thanks also to the contributors who sent in pull requests, in reverse chronological order: Olaf Meeuwissen, Mikko Piuola, Wolfgang Traylor, Paul Spooren, Robert Cohn, ethulhu, pukkamustard, and Diego Elio Pettenò. ### Added - Separate Docker image with additional executables installed (`fsfe/reuse:latest-extra`) (#238) - Allow different styles of copyright lines: SPDX (default), String, String (C), String ©, and © (#248) - Convenience function to update resources (SPDX license list and exceptions) (#268) - More file types are recognised: - ClojureScript (`.cljc`, `.cljs`) - Fortran (`.F`, `.F90`, `.f90`, `.f95`, `.f03`, `.f`, `.for`) - Makefile (`.mk`) - PlantUML (`.iuml`, `.plantuml`, `.pu`, `.puml`) - R (`.R`, `.Renviron`, `.Rprofile`) - ReStructured Text (`.rst`) - RMarkdown (`.Rmd`) - Scheme (`.scm`) - TypeScript (`.ts`) - TypeScript JSX (`.tsx`) - Windows Batch (`.bat`) - More file names are recognised: - .dockerignore - Gemfile - go.mod - meson.build - Rakefile ### Changed - Use UTF-8 explicitly when reading files (#242) ### Fixed - Updated license list to 3.11. ## 0.11.1 - 2020-06-08 ### Fixed - Similar to CAL-1.0 and CAL-1.0-Combined-Work-Exception, SHL-2.1 is now ignored because it contains an SPDX tag within itself. ## 0.11.0 - 2020-05-25 ### Added - Added `--skip-unrecognised` flag to `addheader` in order to skip files with unrecognised comment styles instead of aborting without processing any file. ### Changed - Always write the output files encoded in UTF-8, explicitly. This is already the default on most Unix systems, but it was not on Windows. - All symlinks and 0-sized files in projects are now ignored. ### Fixed - The licenses CAL-1.0 and CAL-1.0-Combined-Work-Exception contain an SPDX tag within themselves. Files that are named after these licenses are now ignored. - Fixed a bug where `addheader` wouldn't properly apply the template on `.license` files if the `.license` file was non-empty, but did not contain valid SPDX tags. ## 0.10.1 - 2020-05-14 ### Fixed - Updated license list to 3.8-106-g4cfec76. ## 0.10.0 - 2020-04-24 ### Added - Add support for autoconf comment style (listed as m4). - More file types are recognised: - Cython (`.pyx`, `.pxd`) - Sass and SCSS (`.sass`, `.scss`) - XSL (`.xsl`) - Mailmap (`.mailmap`) - Added `--single-line` and `--multi-line` flags to `addheader`. These flags force a certain comment style. ### Changed - The Docker image has an entrypoint now. In effect, this means running: `docker run -v $(pwd):/data fsfe/reuse lint` instead of `docker run -v $(pwd):/data fsfe/reuse reuse lint`. ## 0.9.0 - 2020-04-21 ### Added - Added support for Mercurial 4.3+. - A pre-commit hook has been added. - When an incorrect SPDX identifier is forwarded to `download` or `init`, the tool now suggests what you might have meant. ### Changed - Under the hood, a lot of code that has to do with Git and Mercurial was moved into its own module. - The Docker image has been changed such that it now automagically runs `reuse lint` on the `/data` directory unless something else is specified by the user. ### Fixed - Fixed a bug with `addheader --explicit-license` that would result in `file.license.license` if `file.license` already existed. - Fixed a Windows-only bug to do with calling subprocesses. - Fixed a rare bug that would trigger when a directory is both ignored and contains a `.git` file. ## 0.8.1 - 2020-02-22 ### Added - Support Jinja (Jinja2) comment style. - Support all multi-line comment endings when parsing for SPDX information. ### Fixed - Improvements to German translation by Thomas Doczkal. - No longer remove newlines at the end of files when using `addheader`. - There can now be a tab as whitespace after `SPDX-License-Identifier` and `SPDX-FileCopyrightText`. ## 0.8.0 - 2020-01-20 ### Added - Implemented `--root` argument to specify the root of the project without heuristics. - The linter will complain about licenses without file extensions. - Deprecated licenses are now recognised. `lint` will complain about deprecated licenses. - ProjectReport generation (`lint`, `spdx`) now uses Python multiprocessing, more commonly called multi-threading outside of Python. This has a significant speedup of approximately 300% in testing. Because of overhead, performance increase is not exactly linear. - For setups where multiprocessing is unsupported or unwanted, `--no-multiprocessing` is added as flag. - `addheader` now recognises many more extensions. Too many to list here. - `addheader` now also recognises full filenames such as `Makefile` and `.gitignore`. - Added BibTex comment style. - Updated translations: - Dutch (André Ockers, Carmen Bianca Bakker) - French (OliBug, Vincent Lequertier) - Galician (pd) - German (Max Mehl) - Esperanto (Carmen Bianca Bakker) - Portuguese (José Vieira) - Spanish (Roberto Bauglir) - Turkish (T. E. Kalayci) ### Changed - The linter output has been very slightly re-ordered to be more internally consistent. - `reuse --version` now prints a version with a Git hash on development versions. Towards that end, the tool now depends on `setuptools-scm` during setup. It is not a runtime dependency. ### Removed - `lint` no longer accepts path arguments. Where previously one could do `reuse lint SUBDIRECTORY`, this is no longer possible. When linting, you must always lint the entire project. To change the project's root, use `--root`. - `FileReportInfo` has been removed. `FileReport` is used instead. ### Fixed - A license that does not have a file extension, but whose full name is a valid SPDX License Identifier, is now correctly identified as such. The linter will complain about them, however. - If the linter detects a license as being a bad license, that license can now also be detected as being missing. - Performance of `project.all_files()` has been improved by quite a lot. - Files with CRLF line endings are now better supported. ## 0.7.0 - 2019-11-28 ### Changed - The program's package name on PyPI has been changed from `fsfe-reuse` to `reuse`. `fsfe-reuse==1.0.0` has been created as an alias that depends on `reuse`. `fsfe-reuse` will not receive any more updates, but will still host the old versions. - For users of `fsfe-reuse`, this means: - If you depend on `fsfe-reuse` or `fsfe-reuse>=0.X.Y` in your requirements.txt, you will get the latest version of `reuse` when you install `fsfe-reuse`. You may like to change the name to `reuse` explicitly, but this is not strictly necessary. - If you depend on `fsfe-reuse==0.X.Y`, then you will keep getting that version. When you bump the version you depend on, you will need to change the name to `reuse`. - If you depend on `fsfe-reuse>=0.X.Y<1.0.0`, then 0.6.0 will be the latest version you receive. In order to get a later version, you will need to change the name to `reuse`. ## 0.6.0 - 2019-11-19 ### Added - `--include-submodules` is added to also include submodules when linting et cetera. - `addheader` now also recognises the following extensions: - .kt - .xml - .yaml - .yml ### Changed - Made the workaround for `MachineReadableFormatError` introduced in 0.5.2 more generic. - Improved shebang detection in `addheader`. - For `addheader`, the SPDX comment block now need not be the first thing in the file. It will find the SPDX comment block and deal with it in-place. - Git submodules are now ignored by default. - `addheader --explicit-license` now no longer breaks on unsupported filetypes. ## 0.5.2 - 2019-10-27 ### Added - `python3 -m reuse` now works. ### Changed - Updated license list to 3.6-2-g2a14810. ### Fixed - Performance of `reuse lint` improved by at least a factor of 2. It no longer does any checksums on files behind the scenes. - Also handle `MachineReadableFormatError` when parsing DEP5 files. Tries to import that error. If the import is unsuccessful, it is handled. ## 0.5.1 - 2019-10-24 [YANKED] This release was replaced by 0.5.2 due to importing `MachineReadableFormatError`, which is not a backwards-compatible change. ## 0.5.0 - 2019-08-29 ### Added - TeX and ML comment styles added. - Added `--year` and `--exclude-year` to `reuse addheader`. - Added `--template` to `reuse addheader`. - Added `--explicit-license` to `reuse addheader`. - `binaryornot` added as new dependency. - Greatly improved the usage documentation. ### Changed - `reuse addheader` now automatically adds the current year to the copyright notice. - `reuse addheader` preserves the original header below the new header if it did not contain any SPDX information. - `reuse addheader` now correctly handles `.license` files. - Bad licenses are no longer resolved to LicenseRef-Unknown. They are instead resolved to the stem of the path. This reduces the magic in the code base. - `.gitkeep` files are now ignored by the tool. - Changed Lisp's comment character from ';;' to ';'. ## 0.4.1 - 2019-08-07 ### Added - `--all` argument help to `reuse download`, which downloads all detected missing licenses. ### Fixed - When using `reuse addheader` on a file that contains a shebang, the shebang is preserved. - Copyright lines in `reuse spdx` are now sorted. - Some publicly visible TODOs were patched away. ## 0.4.0 - 2019-08-07 This release is a major overhaul and refactoring of the tool. Its primary focus is improved usability and speed, as well as adhering to version 3.0 of the REUSE Specification. ### Added - `reuse addheader` has been added as a way to automatically add copyright statements and license identifiers to the headers of files. It is currently not complete. - `reuse init` has been added as a way to initialise a REUSE project. Its functionality is currently scarce, but should improve in the future. ### Changed - `reuse lint` now provides a helpful summary instead of merely spitting out non-compliant files. - `reuse compile` is now `reuse spdx`. - In addition to `Copyright` and `©`, copyright lines can be marked with the tag `SPDX-FileCopyrightText:`. This is the new recommended default. - Project no longer depends on pygit2. - The list of SPDX licenses has been updated. - `Valid-License-Identifier` is no longer used, and licenses and exceptions can now only live inside of the LICENSES/ directory. ### Removed - Removed `--ignore-debian`. - Removed `--spdx-mandatory`, `--copyright-mandatory`, `--ignore-missing` arguments from `reuse lint`. - Remove `reuse license`. - GPL-3.0 and GPL-3.0+ (and all other similar GPL licenses) are no longer detected as SPDX identifiers. Use GPL-3.0-only and GPL-3.0-or-later instead. ### Fixed - Scanning a Git directory is a lot faster now. - Scanning binary files is a lot faster now. ## 0.3.4 - 2019-04-15 This release should be a short-lived one. A new (slightly backwards-incompatible) version is in the works. ### Added - Copyrights can now start with `©` in addition to `Copyright`. The former is now recommended, but they are functionally similar. ### Changed - The source code of reuse is now formatted with black. - The repository has been moved from to . ## 0.3.3 - 2018-07-15 ### Fixed - Any files with the suffix `.spdx` are no longer considered licenses. ## 0.3.2 - 2018-07-15 ### Fixed - The documentation now builds under Python 3.7. ## 0.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 ### Changed - The output of `reuse compile` is now deterministic. The files, copyright lines and SPDX expressions are sorted alphabetically. ### Fixed - When a GPL license could not be found, the correct `-only` or `-or-later` extension is now used in the warning message, rather than a bare `GPL-3.0`. - If you have a license listed as `SPDX-Valid-License: GPL-3.0-or-later`, this 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 ### Added - Internationalisation support added. Initial support for: - English. - Dutch. - Esperanto. - Spanish. ### Fixed - The license list of SPDX 3.0 has deprecated `GPL-3.0` and `GPL-3.0+` et al in favour of `GPL-3.0-only` and `GPL-3.0-or-later`. The program has been amended to accommodate sufficiently for those licenses. ### Changed - `Project.reuse_info_of` now extracts, combines and returns information both from the file itself and from debian/copyright. - `ReuseInfo` now holds sets instead of lists. - As a result of this, `ReuseInfo` will not hold duplicates of copyright lines or SPDX expressions. - click removed as dependency. Good old argparse from the library is used instead. ## 0.1.1 - 2017-12-14 ### Changed - The `reuse --help` text has been tidied up a little bit. ### Fixed - Release date in change log fixed. - The PyPI homepage now gets reStructuredText instead of Markdown. ## 0.1.0 - 2017-12-14 ### Added - Successfully parse old-style C and HTML comments now. - Added `reuse compile`, which creates an SPDX bill of materials. - Added `--ignore-missing` to `reuse lint`. - Allow to specify multiple paths to `reuse lint`. - `chardet` added as dependency. - `pygit2` added as soft dependency. reuse remains usable without it, but the performance with `pygit2` is significantly better. Because `pygit2` has a non-Python dependency (`libgit2`), it must be installed independently by the user. In the future, when reuse is packaged natively, this will not be an issue. ### Changed - Updated to version 2.0 of the REUSE recommendations. The most important change is that `License-Filename` is no longer used. Instead, the filename is deducted from `SPDX-License-Identifier`. This change is **NOT** backwards compatible. - The conditions for linting have changed. A file is now non-compliant when: - The license associated with the file could not be found. - There is no SPDX expression associated with the file. - There is no copyright notice associated with the file. - Only read the first 4 KiB (by default) from code files rather than the entire file when searching for SPDX tags. This speeds up the tool a bit. - `Project.reuse_info_of` no longer raises an exception. Instead, it returns an empty `ReuseInfo` object when no reuse information is found. - Logging is a lot prettier now. Only output entries from the `reuse` module. ### Fixed - `reuse --ignore-debian compile` now works as expected. - The tool no longer breaks when reading a file that has a non-UTF-8 encoding. Instead, `chardet` is used to detect the encoding before reading the file. If a file still has errors during decoding, those errors are silently ignored and replaced. ## 0.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 ### Fixed - Fixed the link to PyPI in the README. ## 0.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 empty beyond "created the program". The program can do roughly the following: - Detect the license of a given file through one of three methods (in order of precedence): - Information embedded in the .license file. - Information embedded in its header. - Information from the global debian/copyright file. - Find and report all files in a project tree of which the license could not be found. - Ignore files ignored by Git. - Do some logging into STDERR. reuse-tool-0.14.0/CODE_OF_CONDUCT.md000066400000000000000000000004651416231101000164630ustar00rootroot00000000000000 All activity surrounding this project is covered by the Code of Conduct of the Free Software Foundation Europe, which can be found at . reuse-tool-0.14.0/CONTRIBUTING.md000066400000000000000000000017751416231101000161220ustar00rootroot00000000000000 # Contribution Guidelines ## Table of Contents * [Release a new version](#release-a-new-version) ## Release a new version * Verify changelog * Create branch release-0.XX * `bumpversion --new-version 0.XX.0 minor` * Alter changelog * Do some final tweaks/bugfixes (and alter changelog) * `make update-resources` (and alter changelog again) * Once everything is good, `git tag -s v0.XX.0` * `make test-release` * Test here possibly * `git tag -d latest` * `git tag latest` * `git push --force --tags origin` * `git push --force --tags upstream` * `make release` (use one of the documented keys of maintainers) * `git checkout master` * `git merge release-0.XX` * `git push upstream master` * Update readthedocs (if not happened automatically) * Update API worker: https://git.fsfe.org/reuse/api-worker#user-content-server * Make sure package is updated in distros (contact maintainers) reuse-tool-0.14.0/Dockerfile000066400000000000000000000013001416231101000156430ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # Create a base image that has dependencies installed. FROM alpine:3.13 AS base RUN apk --no-cache add git mercurial python3 # Build reuse into a virtualenv FROM base AS build WORKDIR /reuse-tool ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY . /reuse-tool/ RUN pip3 install -r requirements.txt RUN pip3 install . # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-0.14.0/Dockerfile-debian000066400000000000000000000015051416231101000170720ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # Like normal Dockerfile, but based on python:slim (Debian) to ease compliance # Create a base image that has dependencies installed. FROM python:slim AS base RUN apt-get update \ && apt-get install -y git mercurial \ && rm -rf /var/lib/apt/lists/* # Build reuse into a virtualenv FROM base AS build WORKDIR /reuse-tool ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY . /reuse-tool/ RUN pip3 install -r requirements.txt RUN pip3 install . # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-0.14.0/Dockerfile-extra000066400000000000000000000014211416231101000167700ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # Like normal Dockerfile, but install additional packages on top # Create a base image that has dependencies installed. FROM alpine:3.13 AS base RUN apk --no-cache add git mercurial python3 openssh-client # Build reuse into a virtualenv FROM base AS build WORKDIR /reuse-tool ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY . /reuse-tool/ RUN pip3 install -r requirements.txt RUN pip3 install . # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-0.14.0/LICENSES/000077500000000000000000000000001416231101000150645ustar00rootroot00000000000000reuse-tool-0.14.0/LICENSES/Apache-2.0.txt000066400000000000000000000261361416231101000173130ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. reuse-tool-0.14.0/LICENSES/CC-BY-SA-4.0.txt000066400000000000000000000472431416231101000172340ustar00rootroot00000000000000Attribution-ShareAlike 4.0 International ======================================================================= Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= Creative Commons Attribution-ShareAlike 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. Additional offer from the Licensor -- Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter's License You apply. c. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. b. ShareAlike. In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 1. The Adapter's License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. reuse-tool-0.14.0/LICENSES/CC0-1.0.txt000066400000000000000000000156101416231101000164710ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. reuse-tool-0.14.0/LICENSES/GPL-3.0-or-later.txt000066400000000000000000001045151416231101000202760ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . reuse-tool-0.14.0/MANIFEST.in000066400000000000000000000010161416231101000154130ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later include AUTHORS.rst include README.md include CHANGELOG.md include Makefile include tox.ini include requirements.txt include .reuse/dep5 recursive-include LICENSES * recursive-include docs * prune docs/_build recursive-include src * recursive-include tests * recursive-include po * exclude po/reuse.pot recursive-exclude po *.mo recursive-exclude * __pycache__ recursive-exclude * *.py[co] reuse-tool-0.14.0/Makefile000066400000000000000000000072731416231101000153300ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later .DEFAULT_GOAL := help .PHONY: help help: ## show this help message @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: clean clean: clean-build clean-pyc clean-test clean-docs ## remove all build, test, coverage and Python artifacts .PHONY: clean-build clean-build: ## remove build artifacts rm -fr build/ rm -fr dist/ rm -fr .cache/ rm -fr .eggs/ rm -fr pip-wheel-metadata/ find ./po -name '*.mo' -exec rm -f {} + find ./po -name '*.pot' -exec rm -f {} + find . -name '*.egg-info' -exec rm -fr {} + find . -name '*.egg' -exec rm -fr {} + .PHONY: clean-pyc clean-pyc: ## remove Python file artifacts find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + find . -name '__pycache__' -exec rm -fr {} + .PHONY: clean-test clean-test: ## remove test and coverage artifacts rm -fr .tox/ rm -f .coverage rm -fr htmlcov/ rm -fr .pytest_cache/ .PHONY: clean-docs clean-docs: ## remove docs build artifacts -$(MAKE) -C docs clean rm -fr docs/api/ rm -f docs/*.md .PHONY: lint lint: ## check with pylint pylint src/reuse tests/*.py .PHONY: blackcheck blackcheck: ## check with black black --check . isort --check src/ tests/ *.py .PHONY: black black: ## format with black isort src/ tests/ *.py black . .PHONY: reuse reuse: dist ## check with self reuse lint tar -xf dist/reuse*.tar.gz -C dist/ # This prevents the linter from using the project root as root. git init dist/reuse*/ cd dist/reuse*/; reuse lint .PHONY: test test: ## run tests quickly py.test .PHONY: coverage coverage: ## check code coverage quickly py.test --cov-report term-missing --cov=src/reuse .PHONY: docs docs: ## generate Sphinx HTML documentation, including API docs $(MAKE) -C docs html .PHONY: tox tox: ## run all tests against multiple versions of Python tox .PHONY: dist dist: clean-build clean-pyc clean-docs ## builds source and wheel package python setup.py sdist python setup.py bdist_wheel ls -l dist .PHONY: create-pot create-pot: ## generate .pot file xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot --files-from=po/POTFILES.in xgettext --add-comments --output=po/argparse.pot /usr/lib*/python3*/argparse.py msgcat --output=po/reuse.pot po/reuse.pot po/argparse.pot .PHONY: update-po-files update-po-files: create-pot ## update .po files find ./po -name "*.po" -exec msgmerge --width=79 --output={} {} po/reuse.pot \; .PHONY: test-release test-release: dist ## package and upload to testpypi twine upload --sign -r testpypi dist/* .PHONY: release release: dist ## package and upload a release twine upload --sign -r pypi dist/* .PHONY: install-requirements install-requirements: ## install requirements pip install -r requirements.txt .PHONY: install-dev-requirements install-dev-requirements: install-requirements ## install dev requirements pip install -r requirements-dev.txt .PHONY: uninstall uninstall: ## uninstall reuse -pip uninstall -y reuse .PHONY: install install: uninstall install-requirements ## install reuse python setup.py install .PHONY: update-resources update-resources: ## update spdx data files curl https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json \ > src/reuse/resources/licenses.json curl https://raw.githubusercontent.com/spdx/license-list-data/master/json/exceptions.json \ > src/reuse/resources/exceptions.json .PHONY: develop develop: uninstall install-dev-requirements ## install source directory pre-commit install python setup.py develop reuse-tool-0.14.0/README.md000066400000000000000000000220561416231101000151430ustar00rootroot00000000000000 # reuse [![The latest version of reuse can be found on PyPI.](https://img.shields.io/pypi/v/reuse.svg)](https://pypi.python.org/pypi/reuse) [![Information on what versions of Python reuse supports can be found on PyPI.](https://img.shields.io/pypi/pyversions/reuse.svg)](https://pypi.python.org/pypi/reuse) [![REUSE status](https://api.reuse.software/badge/github.com/fsfe/reuse-tool)](https://api.reuse.software/info/github.com/fsfe/reuse-tool) [![readme style standard](https://img.shields.io/badge/readme_style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme) [![Packaging status](https://repology.org/badge/tiny-repos/reuse.svg?header=in%20distro%20repos)](https://repology.org/project/reuse/versions) > reuse is a tool for compliance with the [REUSE](https://reuse.software/) > recommendations. - Documentation: and - Source code: - PyPI: - REUSE: 3.0 - Python: 3.6+ ## Background Copyright and licensing is difficult, especially when reusing software from different projects that are released under various different licenses. [REUSE](https://reuse.software) was started by the [Free Software Foundation Europe](https://fsfe.org) (FSFE) to provide a set of recommendations to make licensing your Free Software projects easier. Not only do these recommendations make it easier for you to declare the licenses under which your works are released, but they also make it easier for a computer to understand how your project is licensed. As a short summary, the recommendations are threefold: 1. Choose and provide licenses 2. Add copyright and licensing information to each file 3. Confirm REUSE compliance You are recommended to read [our tutorial](https://reuse.software/tutorial) for a step-by-step guide through these three steps. The [FAQ](https://reuse.software/faq) covers basic questions about licensing, copyright, and more complex use cases. Advanced users and integrators will find the [full specification](https://reuse.software/spec) helpful. This tool exists to facilitate the developer in complying with the above recommendations. There are [other tools](https://reuse.software/comparison) that have a lot more features and functionality surrounding the analysis and inspection of copyright and licenses in software projects. The REUSE helper tool, on the other hand, is solely designed to be a simple tool to assist in compliance with the REUSE recommendations. ## Example demo In this screencast, we are going to follow the [tutorial](https://reuse.software/tutorial), making the [REUSE example repository](https://github.com/fsfe/reuse-example/) compliant. ![Demo of some basic REUSE tool commands](https://download.fsfe.org/videos/reuse/screencasts/reuse-tool.gif) ## Install ### Installation via package managers There are packages available for easy install on some operating systems. You are welcome to help us package this tool for more distributions! - Arch Linux: [reuse](https://archlinux.org/packages/community/any/reuse/) - Debian: [reuse](https://packages.debian.org/search?keywords=reuse&exact=1) - GNU Guix: [reuse](https://guix.gnu.org/packages/reuse-0.13.0/) - Fedora: [reuse](https://apps.fedoraproject.org/packages/reuse) - NixOS: [reuse](https://search.nixos.org/packages?channel=21.05&from=0&size=50&sort=relevance&type=packages&query=reuse) - openSUSE: [reuse](https://software.opensuse.org/package/reuse) - VoidLinux: [reuse](https://voidlinux.org/packages/?arch=x86_64&q=reuse) An automatically generated list can be found at [repology.org](https://repology.org/project/reuse/versions), without any guarantee for completeness. ### Installation via pip To install reuse, you need to have the following pieces of software on your computer: - Python 3.6+ - pip You then only need to run the following command: ```bash pip3 install --user reuse ``` After this, make sure that `~/.local/bin` is in your `$PATH`. On Windows, the required path for your environment may look like `%USERPROFILE%\AppData\Roaming\Python\Python39\Scripts`, depending on the Python version you have installed. To update reuse, run this command: ```bash pip3 install --user --upgrade reuse ``` For full functionality, the following pieces of software are recommended: - Git - Mercurial 4.3+ ### Installation from source You can also install this tool from the source code, but we recommend the methods above for easier and more stable updates. Please make sure the requirements for the installation via pip are present on your machine. ```bash python3 setup.py install ``` ## Usage First, read the [REUSE tutorial](https://reuse.software/tutorial/). In a nutshell: 1. Put your licenses in the `LICENSES/` directory. 2. Add a comment header to each file that says `SPDX-License-Identifier: GPL-3.0-or-later`, and `SPDX-FileCopyrightText: $YEAR $NAME`. You can be flexible with the format, just make sure that the line starts with `SPDX-FileCopyrightText:`. 3. Verify your work using this tool. Example of header: ``` # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: CC-BY-SA-4.0 ``` To check against the recommendations, use `reuse lint`: ``` ~/Projects/reuse-tool $ reuse lint [...] Congratulations! Your project is compliant with version 3.0 of the REUSE Specification :-) ``` This tool can do various more things, detailed in the documentation. Here a short summary: - `addheader` --- 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. - `spdx` --- Generate an SPDX Document of all files in the project. - `supported-licenses` --- Prints all licenses supported by REUSE. ### Run in Docker The `fsfe/reuse` Docker image is available on [Docker Hub](https://hub.docker.com/r/fsfe/reuse). With it, you can easily include REUSE in CI/CD processes. This way, you can check for REUSE compliance for each build. In our [resources for developers](https://reuse.software/dev/) you can learn how to integrate the REUSE tool in Drone, Travis, GitHub, or GitLab CI. You can run the helper tool simply by providing the command you want to run (e.g., `lint`, `spdx`). The image's working directory is `/data` by default. So if you want to lint a project that is in your current working directory, you can mount it on the container's `/data` directory, and tell the tool to lint. That looks a little like this: ```bash docker run --rm --volume $(pwd):/data fsfe/reuse lint ``` You can also provide additional arguments, like so: ```bash docker run --rm --volume $(pwd):/data fsfe/reuse --include-submodules spdx -o out.spdx ``` There are a number of tags available: - `latest` is the most recent stable release. - `dev` follows the `master` branch of this repository. Up-to-date, but potentially unstable. - `latest-extra` has a few extra packages installed, currently `openssh-client`. - `latest-debian` is based on `python:slim`. It is larger, but may be better suited for license compliance. ### Run as pre-commit hook You can automatically run `reuse lint` on every commit as a pre-commit hook for Git. This uses [pre-commit](https://pre-commit.com/). Once you [have it installed](https://pre-commit.com/#install), add this to the `.pre-commit-config.yaml` in your repository: ```yaml repos: - repo: https://github.com/fsfe/reuse-tool rev: latest hooks: - id: reuse ``` 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. ## Maintainers - Carmen Bianca Bakker - - Max Mehl - ## Contribute Any pull requests or suggestions are welcome at or via e-mail to one of the maintainers. General inquiries can be sent to . Interaction within this project is covered by the [FSFE's Code of Conduct](https://fsfe.org/about/codeofconduct). Starting local development is very simple, just execute the following commands: ```bash git clone git@github.com:fsfe/reuse-tool.git cd reuse-tool/ python3 -mvenv venv source venv/bin/activate make develop ``` You need to run `make develop` at least once to set up the virtualenv. Next, run `make help` to see the available interactions. ## License This work is licensed under multiple licences. Because keeping this section up-to-date is challenging, here is a brief summary as of April 2020: - All original source code is licensed under GPL-3.0-or-later. - All documentation is licensed under CC-BY-SA-4.0. - Some configuration and data files are licensed under CC0-1.0. - Some code borrowed from [spdx/tool-python](https://github.com/spdx/tools-python) is licensed under Apache-2.0. For more accurate information, check the individual files. reuse-tool-0.14.0/docs/000077500000000000000000000000001416231101000146075ustar00rootroot00000000000000reuse-tool-0.14.0/docs/Makefile000066400000000000000000000012621416231101000162500ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = reuse SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) reuse-tool-0.14.0/docs/_static/000077500000000000000000000000001416231101000162355ustar00rootroot00000000000000reuse-tool-0.14.0/docs/_static/.gitkeep000066400000000000000000000000001416231101000176540ustar00rootroot00000000000000reuse-tool-0.14.0/docs/authors.rst000066400000000000000000000002441416231101000170260ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC-BY-SA-4.0 .. include:: ../AUTHORS.rst reuse-tool-0.14.0/docs/conf.py000066400000000000000000000141731416231101000161140ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # reuse documentation build configuration file, created by # sphinx-quickstart on Wed Nov 1 14:41:46 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # import os import sys from shutil import copyfile from pkg_resources import DistributionNotFound, get_distribution sys.path.insert(0, os.path.abspath("../src/")) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "recommonmark", "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.coverage", "sphinx.ext.viewcode", "sphinx_autodoc_typehints", "sphinxcontrib.apidoc", ] apidoc_module_dir = "../src/reuse" # apidoc_output_dir = "api" # apidoc_excluded_paths = [] apidoc_separate_modules = True # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = [".rst", ".txt", ".md"] # The master toctree document. master_doc = "index" # General information about the project. project = "reuse" copyright = "2017-2019, Free Software Foundation Europe. CC-BY-SA-4.0" author = "Free Software Foundation Europe" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. try: # The full version, including alpha/beta/rc tags. release = get_distribution("reuse").version except DistributionNotFound: release = "0.14.0" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars html_sidebars = { "**": [ "relations.html", # needs 'show_related': True theme option to display "searchbox.html", ] } # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = "reusedoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( master_doc, "reuse.tex", "reuse Documentation", "Free Software Foundation Europe", "manual", ) ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "reuse", "reuse Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "reuse", "reuse Documentation", author, "reuse", "One line description of project.", "Miscellaneous", ) ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {"https://docs.python.org/3/": None} def copy_markdown(_): """Copy the markdown files from the root of the project into the docs/ directory. """ copyfile("../README.md", "readme.md") copyfile("../CHANGELOG.md", "history.md") def setup(app): app.connect("builder-inited", copy_markdown) reuse-tool-0.14.0/docs/index.rst000066400000000000000000000011361416231101000164510ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC-BY-SA-4.0 .. reuse documentation master file, created by sphinx-quickstart on Wed Nov 1 14:41:46 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to reuse's documentation! ================================= .. toctree:: :maxdepth: 2 readme usage authors history API Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` reuse-tool-0.14.0/docs/usage.rst000066400000000000000000000231211416231101000164440ustar00rootroot00000000000000===== Usage ===== The :doc:`overview ` documents some basic usage on how to use this tool. It is highly recommended to read the overview first, and you might not even need to read this chapter. This chapter covers details that might not be immediately obvious when using the tool. This chapter does not cover *everything*, assuming that the user is helped enough by ``reuse --help`` and ``reuse --help``. Implementation details ====================== This section covers implementation details that are true for the entire tool. When searching for copyright and licensing tags inside of files, the tool does not strictly limit itself to the header comment as prescribed by the specification. It searches the first 4 kibibytes of the file. This makes sure that the tool can parse any type of plain-text file, even if the comment style is not recognised. If a file is found to have an unparseable tag, that file is not parsed at all. This is `a bug `_. The tool does not verify the correctness of copyright notices. If it finds any line containing '©', 'Copyright', or 'SPDX-FileCopyrightText:', then the tag and everything following it is considered a valid copyright notice, even if the copyright notice is not compliant with the specification. When running the tool, the root of the project is automatically found if the working directory is inside a VCS repository. Otherwise, it treats the working directory as the root of the project. You can override the root of the project with the ``--root`` optional argument. Git submodules are automatically ignored unless ``--include-submodules`` is passed as optional argument. Symbolically links and files that are zero-sized are automatically ignored. addheader ========= ``addheader`` makes it possible to semi-automatically add copyright and licensing information into the header of a file. This is useful especially in scenarios where you want to add a copyright holder or license to a lot of files without having to manually edit the header of each file. .. warning:: You should be cautious with using ``addheader`` in automated processes. While nothing is stopping you from using it in your release script, you should make sure that the information it adds is actually reflective of reality. This is best verified manually. The basic usage is ``reuse addheader --copyright="Jane Doe" --license=MIT my_file.py``. This will add the following header to the file (assuming that the current year is 2019): .. code-block:: python # SPDX-FileCopyrightText: 2019 Jane Doe # # SPDX-License-Identifier: MIT You can use as many ``--copyright`` and ``--license`` arguments, so long as there is at least one such argument. The REUSE header is placed at the very top of the file. If a different REUSE header already existed---at the top or elsewhere---its tags are copied, and the header is replaced in-place. With the argument ``--copyright-style`` it is posible to change the default ``SPDX-FileCopyrightText`` to one of the following style: .. code-block:: spdx: SPDX-FileCopyrightText: spdx-symbol: SPDX-FileCopyrightText: © string: Copyright string-c: Copyright (C) string-symbol: Copyright © symbol: © Shebangs are always preserved at the top of the file. Comment styles -------------- The tool normally tries to auto-detect the comment style to use from the file extension of a file, and use that comment style. If the tool is unable to detect the comment style, or if it detects the wrong style, you can override the style using ``--style``. The supported styles are: - AppleScript - ASPX - BibTex - C - CSS - Haskell - HTML - Jinja - JSX - ML - Python - TeX If your comment style is not supported or a file extension is not correctly detected, please `open an issue `_. Normally, the tool uses a single-line comment style when it is available (e.g., `//` is used instead of `/* */` for C comment styles). If no single-line comment style is available, a multi-line style is used. You can force a certain comment style using `--single-line` or `--multi-line`. Templates --------- When the tool adds a header to a file, it normally first lists all copyright statements alphabetically, adds a single empty line, and then lists all SPDX License Expressions alphabetically. That is all that the header contains. It is possible to change this behaviour, and use a custom type of header that contains extra text. This is done through Jinja2 templates. The default template is: .. code-block:: jinja {% for copyright_line in copyright_lines %} {{ copyright_line }} {% endfor %} {% for expression in spdx_expressions %} SPDX-License-Identifier: {{ expression }} {% endfor %} Templates are automatically commented by the tool, depending on the detected or specified comment style. You can create your own Jinja2 templates and place them in ``.reuse/templates/``. If you create the template ``mytemplate.jinja2``, you can use it with ``reuse addheader --copyright="Jane Doe" --template=mytemplate foo.py``. Inside of the template, you have access to the following variables: - ``copyright_lines`` --- a list of copyright notices (string). - ``spdx_expressions`` --- a list of SPDX License Expressions (string). In the future, more variables will be added. In some cases, you might want to do custom comment formatting. In those cases, you can pre-format your header as a comment. When doing so, suffix your template with ``.commented.jinja2``. An example of a custom template with manual commenting is: .. code-block:: jinja /* {% for copyright_line in copyright_lines %} * {{ copyright_line }} {% endfor %} {% if copyright_lines and spdx_expressions %} * {% endif %} {% for expression in spdx_expressions %} * SPDX-License-Identifier: {{ expression }} {% endfor %} {% if "GPL-3.0-or-later" in spdx_expressions %} * * 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. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . {% endif %} */ lint ==== ``lint`` is the main component of the tool. Summarily, it verifies whether the project is compliant with `the REUSE Specification `_. Its main goal is to find all files that do not have copyright and licensing information in their headers, but it also checks a few other things. The STDOUT output of ``reuse lint`` is valid Markdown. Occasionally some logging will be printed to STDERR, which is not valid Markdown. You may prevent STDOUT output by using the `--quiet` option. This can be useful if you are only interested in the exit code. This is some example output of ``reuse lint``: .. code-block:: text # BAD LICENSES 'bad-license' found in: * LICENSES/bad-license.txt # UNUSED LICENSES The following licenses are not used: * bad-license # MISSING COPYRIGHT AND LICENSING INFORMATION The following files have no copyright and licensing information: * no-information.txt # SUMMARY * Bad licenses: bad-license * Deprecated licenses: * Licenses without file extension: * Missing licenses: * Unused licenses: bad-license * Used licenses: Apache-2.0, CC-BY-SA-4.0, CC0-1.0, GPL-3.0-or-later * Read errors: 0 * Files with copyright information: 57 / 58 * Files with license information: 57 / 58 Unfortunately, your project is not compliant with version 3.0 of the REUSE Specification :-( 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 +++++++++++++++++++ If a license has an SPDX License Identifier that has been deprecated by SPDX, the license will show up here. 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 ++++++++++++++++ If a license is referred to in a comment header, but the license is not found in the ``LICENSES/`` directory, then that license is missing. Unused licenses +++++++++++++++ Conversely, if a license is found in the ``LICENSES/`` directory but is not referred to in any comment header, then that license is unused. 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 with 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 DEP5 file. If a file is found that does not have copyright and/or license information associated with it, then the project is not compliant. reuse-tool-0.14.0/docs/usage.rst.license000066400000000000000000000003001416231101000200570ustar00rootroot00000000000000SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. SPDX-FileCopyrightText: © 2020 Liferay, Inc. SPDX-License-Identifier: CC-BY-SA-4.0 reuse-tool-0.14.0/po/000077500000000000000000000000001416231101000142755ustar00rootroot00000000000000reuse-tool-0.14.0/po/POTFILES.in000066400000000000000000000005131416231101000160510ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later src/reuse/__init__.py src/reuse/_main.py src/reuse/_util.py src/reuse/download.py src/reuse/header.py src/reuse/init.py src/reuse/lint.py src/reuse/project.py src/reuse/report.py src/reuse/spdx.py reuse-tool-0.14.0/po/de.po000066400000000000000000000671111416231101000152330ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 Max Mehl # SPDX-FileCopyrightText: 2020 Thomas Doczkal # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: 2020-02-10 16:07+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.4\n" "Last-Translator: Carmen Bianca BAKKER \n" "Language: de\n" #: src/reuse/_main.py:30 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 ." #: src/reuse/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Die Arbeit der FSFE unterstützen:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "Debug-Statements aktivieren" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "Git-Submodules nicht überspringen" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "kein Multiprocessing verwenden" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "Stammverzeichnis des Projekts bestimmen" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "zeige die Versionsnummer des Programms und beende" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "Unterkommandos" #: src/reuse/_main.py:99 msgid "add copyright and licensing into the header of files" msgstr "" "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" #: src/reuse/_main.py:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von einer " "oder mehr Dateien.\n" "\n" "Mit der Benutzung von --copyright und --license können Sie bestimmen, welche " "Urheber und Lizenzen Sie in die Kopfzeilen der jeweiligen Dateien " "hinzufügen.\n" "\n" "Der Kommentarstil wird normalerweise automatisch erkannt. Wenn das nicht der " "Fall ist, endet der Vorgang. Benutzen Sie --style um einen Kommentarstil zu " "bestimmen oder zu forcieren.\n" "\n" "Sie können die Vorlage für die Kopfzeilen-Kommentare mit --template ändern. " "Erstellen Sie dazu eine Jinja2-Vorlage in .reuse/templates/mytemplate." "jinja2. Sie können die Vorlage verwenden mithilfe von '--template " "mytemplate'. Mehr Informationen zu dieser Funktion in der Online-" "Dokumentation.\n" "\n" "Wenn eine Binärdatei erkannt wurde, oder wenn --explicit-license verwendet " "wurde, werden die Kopfzeilen in einer .license-Datei gespeichert.\n" "\n" "WICHTIG: Diese Funktion ist momentan EXPERIMENTELL!" #: src/reuse/_main.py:135 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:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/.\n" "\n" "Das LICENSES/-Verzeichnis wird automatisch in dieser Reihenfolge gesucht:\n" "\n" "- Das LICENSES/-Verzeichnis im Wurzelverzeichnis des VCS-Repositorys.\n" "\n" "- Das aktuelle Verzeichnis wenn dessen Name LICENSES ist.\n" "\n" "- Das LICENSES/-Verzeichnis im aktuellen Verzeichnis.\n" "\n" "Wenn das LICENSES/-Verzeichnis nicht gefunden werden kann, wird einfach " "eines erstellt." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "REUSE-Projekt initialisieren" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "alle nicht-konformen Dateien zeigen" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "Komponentenliste im SPDX-Format ausgeben" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' ist keine Datei" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' ist kein Verzeichnis" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "kann '{}' nicht öffnen" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "kann nicht in Verzeichnis '{}' schreiben" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "kann nicht in '{}' schreiben" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "kann '{}' nicht lesen oder schreiben" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "SPDX-Lizenz-Identifikator der Lizenz" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fehler: {spdx_identifier} existiert bereits." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." #: src/reuse/download.py:115 src/reuse/init.py:55 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/download.py:120 msgid "Is your internet connection working?" msgstr "Funktioniert Ihre Internetverbindung?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} erfolgreich heruntergeladen." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "Die folgenden Argumente sind erforderlich: license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" #: src/reuse/header.py:103 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' hat keine erkannte Dateiendung, bitte verwenden Sie --style oder --" "explicit-license" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Fehler: Kann kein Kommentar für '{path}' erstellen" #: src/reuse/header.py:359 #, 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 "" "Fehler: Die generierten Kommentar-Kopfzeilen für '{path}' enthalten fehlende " "Urheberrechtszeilen oder Lizenzausdrücke. Die Vorlage ist wahrscheinlich " "falsch. Keine neuen Kopfzeile geschrieben." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Kopfzeilen von {path} erfolgreich geändert" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "Urheberrechtsinformation, wiederholbar" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "SPDX-Lizenz-Identifikator, wiederholbar" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "Jahr der Urheberrechtsinformation, optional" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "zu benutzender Kommentarstil, optional" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "Name der zu verwendenden Vorlage, optional" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "füge kein Jahr in Angabe hinzu" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "Speichere Kopfzeilen in path.license anstatt path" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "Option --copyright oder --license ist erforderlich" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "Die Optionen --exclude-year und --year schließen sich gegenseitig aus" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "Vorlage {template} konnte nicht gefunden werden" #: src/reuse/header.py:482 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Unter welcher Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" "Identifikator an." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Unter welcher anderen Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" "Identifikator an." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Um keine weiteren Lizenzen hinzuzufügen, drücken Sie ENTER." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Projekt bereits initialisiert" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Initialisiere Projekt für REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Was ist der Name des Projekts?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Was ist die Internetadresse des Projekts?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Was ist der Name der Betreuenden?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Wie lautet die E-Mail-Adresse der Betreuenden?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Alles erledigt! Initialisiere jetzt." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Lade {} herunter" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} existiert bereits" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Konnte {} nicht herunterladen" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Erstelle .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Initialisierung vollständig." #: src/reuse/lint.py:55 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" "Spezifikation :-)" #: src/reuse/lint.py:62 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 :-(" #: src/reuse/lint.py:79 msgid "BAD LICENSES" msgstr "FALSCHE LIZENZEN" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' gefunden in:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "VERALTETE LIZENZEN" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "Die folgenden Lizenzen wurden von SPDX als veraltetet gekennzeichnet:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LIZENZEN OHNE DATEIENDUNG" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "Die folgenden Lizenzen haben keine Dateiendung:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "FEHLENDE LIZENZEN" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "NICHT VERWENDETE LIZENZEN" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "Die folgenden Lizenzen werden nicht benutzt:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "LESEFEHLER" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Unlesbar:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FEHLENDE URHEBERRECHTS- UND LIZENZINFORMATIONEN" #: src/reuse/lint.py:214 msgid "The following files have no copyright and licensing information:" msgstr "" "Die folgenden Dateien haben keine Urheberrechts- und Lizenzinformationen:" #: src/reuse/lint.py:223 msgid "The following files have no copyright information:" msgstr "Die folgenden Dateien haben keine Urheberrechtsinformationen:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "Die folgenden Dateien haben keine Lizenzinformationen:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "ZUSAMMENFASSUNG" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Falsche Lizenzen:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Veraltete Lizenzen:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Lizenzen ohne Dateiendung:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Fehlende Lizenzen:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Unbenutzte Lizenzen:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Verwendete Lizenzen:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Lesefehler: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Dateien mit Urheberrechtsinformationen: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Dateien mit Lizenzinformationen: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "konnte Git nicht finden" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' abgedeckt durch .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " "Überspringe Datei" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 hat Syntaxfehler" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "erkenne Identifikator von '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} hat keine Dateiendung" #: src/reuse/project.py:275 #, 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 "" "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:287 #, 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/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' endet nicht mit .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "Benutzung: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() nicht definiert" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "Argument \"-\" mit Modus %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "Kann '%s' nicht öffnen: %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "Kann Aktionen nicht zusammenführen - zwei Gruppen heißen %r" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' ist ein ungültiges Argument für Positionsangaben" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, python-format 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" #: /usr/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "dest= ist erforderlich für Optionen wie %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Ungültiger Wert für conflict_resolution: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "Sich gegenseitig ausschließende Argumente müssen optional sein" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "Positions-Argumente" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "Optionale Argumente" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "zeige diese Hilfsnachricht und beende" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "mehrere Subparser-Argumente sind nicht möglich" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "unbekannte Argumente: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "nicht erlaubt mit Argument %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "explizites Argument %r ignoriert" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "die folgenden Argumente sind erforderlich: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "eines der Argumente %s ist erforderlich" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "erwartete ein Argument" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "erwartete höchstens ein Argument" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "erwartete mindestens ein Argument" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "erwartete %s Argument" msgstr[1] "erwartete %s Argumente" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "mehrdeutige Option: %(option)s könnte %(matches)s bedeuten" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "unerwarteter Options-String: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r ist nicht aufrufbar" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ungültiger %(type)s Wert: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "Kann '%(filename)s' nicht öffnen: %(error)s" reuse-tool-0.14.0/po/eo.po000066400000000000000000000760011416231101000152440ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018, 2020 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2018 Tirifto # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-20 12:18+0100\n" "PO-Revision-Date: 2019-12-20 12:21+0100\n" "Last-Translator: Carmen Bianca BAKKER \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/reuse/_main.py:30 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/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Subtenu la laboradon de FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "ŝalti sencimigajn ordonojn" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "ne preterpasi Git-submodulojn" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "ne uzi plurprocesorado" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "difini radikon de la projekto" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "montri versionumeron de programo kaj eliri" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "subkomandoj" #: src/reuse/_main.py:99 msgid "add copyright and licensing into the header of files" msgstr "aldoni kopirajtahn kaj permesilajn informojn en la kapojn de dosieroj" #: src/reuse/_main.py:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Aldoni kopirajtahn kaj permesilajn informojn en la kapojn de dosieroj.\n" "\n" "Tra uzi --copyright kaj --license, vi povas specifi kiujn kopirajtajn " "proprulojn kaj permesilojn oni aldonu al la kapojn de la specifitaj " "dosieroj.\n" "\n" "Oni aŭtomate eltrovos la komentstilon de viaj dosieroj. Se oni ne povas " "eltrovi tion, la procezo haltas. Uzu --style por specifi aŭ superskribi la " "uzendan komentstilon.\n" "\n" "\n" "Vi povas ŝanĝi la ŝablonon de la kapo tra uzi --template. Metu Jinja2-" "ŝablonon en .reuse/templates/miaŝablono.jinja2. Vi povas uzi la ŝablonon tra " "specifi '--template miaŝablono'. Legu la reta dokumentado por pli da " "informoj pri ĉi tiu funkcio.\n" "\n" "Se oni detektas duuman dosieron, aŭ se vi specifas --explicit-license, la " "kapon oni metas en .license-dosieron.\n" "\n" "GRAVA: Ĉi tio estas ĉimomente PROVCELA!" #: src/reuse/_main.py:135 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:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon.\n" "\n" "La LICENSES-dosierujon oni aŭtomate trovas tiel, en ordo:\n" "\n" "- La LICENSES/-dosierujo en la radiko de la VCS-deponejo.\n" "\n" "- La aktuala dosierujo se ĝia nomo ests LICENSES.\n" "\n" "- La LICENSES/-dosierujo sub la aktuala dosierujo.\n" "\n" "Se oni ne povas trovi la LICENSES/-dosierujon, oni kreos ĝin." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "pravalorizi REUSE-projekton" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "listigi ĉiujn nekonformajn dosierojn" #: src/reuse/_main.py:172 #, 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 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" "- 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 estas permesiloj en la LICENSES/-dosierujo, kiuj estas neuzataj?\n" "\n" "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" #: src/reuse/_main.py:199 msgid "print the project's bill of materials in SPDX format" msgstr "presi la pecoliston de la projekto en SPDX-formo" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' ne estas dosiero" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' ne estas dosierujo" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "ne povas malfermi '{}'" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "ne povas skribi al dosierujo '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "ne povas skribi al '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "ne povas legi aŭ skribi '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "SPDX Permesila Identigilo de permesilo" #: src/reuse/download.py:85 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:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Eraro: {spdx_identifier} jam ekzistas." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Eraro: Malsukcesis elŝuti permesilon." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ne estas valida SPDX Permesila Identigilo." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Vidu por listo de validaj SPDX Permesilaj " "Identigiloj." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "Ĉu via retkonekto funkcias?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Sukceses elŝutis {spdx_identifier}." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "la sekvaj argumentoj nepras: license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "ne povas uzi --output kun pli ol unu permesilo" #: src/reuse/header.py:101 msgid "generated comment is missing copyright lines or license expressions" msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" #: src/reuse/header.py:280 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' ne havas konatan dosiersufikson, bonvolu uzi --style aŭ --explicit-" "license" #: src/reuse/header.py:339 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Eraro: Ne povis krei komenton por '{path}'" #: src/reuse/header.py:346 #, 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 "" "Eraro: Al generita komentkapo por '{path}' mankas kopirajtlinioj aŭ " "permesilesprimoj. La ŝablono probable malbonas. Ne skribis novan kapon." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:357 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Sukcese ŝanĝis kapon de {path}" #: src/reuse/header.py:370 msgid "copyright statement, repeatable" msgstr "kopirajtlinio, ripetabla" #: src/reuse/header.py:377 msgid "SPDX Identifier, repeatable" msgstr "SPDX Identigilo, ripetabla" #: src/reuse/header.py:384 msgid "year of copyright statement, optional" msgstr "jaro de kopirajtlinio, malnepra" #: src/reuse/header.py:392 msgid "comment style to use, optional" msgstr "uzenda komentstilo, malnepra" #: src/reuse/header.py:399 msgid "name of template to use, optional" msgstr "nomo de uzenda ŝablono, malnepra" #: src/reuse/header.py:404 msgid "do not include year in statement" msgstr "ne inkluzivi jaron en kopirajtlinio" #: src/reuse/header.py:409 msgid "place header in path.license instead of path" msgstr "meti kapon en path.license anstataŭ path" #: src/reuse/header.py:417 msgid "option --copyright or --license is required" msgstr "opcio --copyright aŭ --license necesas" #: src/reuse/header.py:421 msgid "option --exclude-year and --year are mutually exclusive" msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" #: src/reuse/header.py:437 #, python-brace-format msgid "template {template} could not be found" msgstr "ŝablono {template} netroveblas" #: src/reuse/header.py:469 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sub kiu permesilo estas via projekto? Provizu la SPDX Permesilan Identigilon." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Sub kiuj aliaj permesiloj estas via projekto? Provizu la SPDX Permesilan " "Identigilon." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Por ĉesigi aldonadon de permesiloj, premu la enigan klavon." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Projekto jam pravalorizita" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Pravalorizante projekton por REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Kiu estas la nomo de la projekto?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Kiu estas la reta adreso de la projekto?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Kiu estas la nomo de la daŭriganto?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Kiu estas la retpoŝtadreso de la daŭriganto?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Tute farita! Pravalorizante nun." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Elŝutante {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} jam ekzistas" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Ne povis elŝuti {}" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Krante .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Finfaris pravalorizadon." #: src/reuse/lint.py:55 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:62 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:79 msgid "BAD LICENSES" msgstr "MALBONAJ PERMESILOJ" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' trovita en:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "ARĤAIKIGITAJ PERMESILOJ" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "La sekvajn permesilojn arĥaikigis SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "PERMESILOJ SEN DOSIERSUFIKSO" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "La sekvaj permesiloj ne havas dosiersufikson:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "MANKANTAJ PERMESILOJ" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "NEUZATAJ PERMESILOJ" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "La sekvajn permesilojn oni ne uzas:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "LEG-ERAROJ" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Ne povis legi:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANKANTAJ KOPIRAJTAJ KAJ PERMESILAJ INFORMOJ" #: src/reuse/lint.py:214 msgid "The following files have no copyright and licensing information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn kaj permesilajn informojn:" #: src/reuse/lint.py:223 msgid "The following files have no copyright information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn informojn:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "La sekvaj dosieroj ne havas permesilajn informojn:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Malbonaj permesiloj:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Arĥaikigitaj permesiloj:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Permesiloj sen dosiersufikso:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Mankantaj permesiloj:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Neuzataj permesiloj:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Uzataj permesiloj:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Leg-eraroj: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Dosieroj sen permesilinformo: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "ne povis trovi programaron Git" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' sub .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante la " "dosieron" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 havas sintaksajn erarojn" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "precizigante identigilon de '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} ne havas dosiersufikson" #: src/reuse/project.py:275 #, 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 "" "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:287 #, 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}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' ne finiĝas per .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "uzo: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() ne difiniĝas" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nekonata analizilo %(parser_name)r (elektoj: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" kun moduso %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "ne povas malfermi '%s': %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "ne povas kunigi agojn - du grupoj nomiĝas %r" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' estas nevalida argumento por poziciaj" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, python-format 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" #: /usr/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "dest= nepras por elektebloj kiel %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "nevalida valoro de conflict_resolution: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "reciproke ekskluzivaj argumentoj devas esti malnepraj" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "poziciaj argumentoj" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "malnepraj argumentoj" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "montri ĉi tiun helpmesaĝon kaj eliri" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "ne povas havi plurajn subanalizilajn argumentojn" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2276 #, python-format msgid "unrecognized arguments: %s" msgstr "nekonataj argumentoj: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "ne permesita kun argumento: %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "malatentis malimplicitan argumenton %r" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "la sekvaj argumentoj nepras: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "unu el la argumentoj %s nepras" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "anticipis unu argumenton" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "anticipis maksimume unu argumenton" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "anticipis minimume unu argumenton" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2096 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "anticipis %s argumenton" msgstr[1] "anticipis %s argumentojn" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2156 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "dubsenca elekteblo: %(option)s povus egali al %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2219 #, python-format msgid "unexpected option string: %s" msgstr "neanticipita elektebla ĉeno: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2416 #, python-format msgid "%r is not callable" msgstr "%r ne alvokeblas" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2433 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "nevalida %(type)s-valoro: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2444 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2520 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eraro: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "ne povas malfermi '%(filename)s': %(error)s" #, python-format #~ msgid "yielding %s" #~ msgstr "traktante %s" #, python-format #~ msgid "currently walking in %s" #~ msgstr "ĉimomente irante en %s" #, python-format #~ msgid "ignoring %s" #~ msgstr "ignoras %s" #, python-format #~ msgid "searching %s for reuse information" #~ msgstr "serĉanta en %s por reuse-informoj" #, python-format #~ msgid "%s could not be decoded" #~ msgstr "ne povis malkodi %s" #, python-brace-format #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "{path} subas permesilon {identifier}, sed ties dosiero mankas" #, python-format #~ msgid "searching %s for license tags" #~ msgstr "serĉante permesiletikedojn en %s" #, python-brace-format #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "Ne povis determini SPD-identigilo de {path}, do uziĝas {identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "neniu debian/copyright dosiero, aŭ ne povis legi ĝin" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "reuse Kopirajto (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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 reuse. If not, see ." #~ msgstr "" #~ "reuse estas libera programaro: vi povas ĝin pludistribui kaj/aŭ modifi je " #~ "la kondiĉoj de la GNU Ĝenerala Pubika Permesilo, eldonita de la Free " #~ "Software Foundation, laŭ la versio 3 de la permesilo, aŭ (se vi " #~ "preferas) ajna posta versio.\n" #~ "\n" #~ "Ni distribuas reuse esperante, ke ĝi estos utila, tamen SEN IA AJN " #~ "GARANTIO, i.a. sen la implica garantio pri SURMERKATIGEBLO aŭ TAŬGECO POR " #~ "IU KONKRETA CELO. Pliajn detalojn vidu en la GNU Ĝenerala Publika " #~ "Permesilo.\n" #~ "\n" #~ "Ekzemplaro de la GNU Ĝenerala Publika Permesilo devas esti liverita al vi " #~ "kun reuse. Se ne, vidu ." #~ msgid "IMPORTANT:" #~ msgstr "GRAVA:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "Vi ne jam instalis pygit2. reuse malrapidiĝas ege pro ĉi tio. Por akiri " #~ "pli bonan rendimenton, bonvolu instali version de pygit2 de via distribuo." #, python-format #~ msgid "could not read %s" #~ msgstr "ne povis legi dosieron %s" #~ msgid "none\n" #~ msgstr "neniu\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "ne uzi debian/copyright por eltiri reuse-informon" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Listigi ĉiujn nekonformajn dosierojn.\n" #~ "\n" #~ "Dosiero nekonformas kiam:\n" #~ "\n" #~ "- Ĝi havas neniun kopirajtinformon.\n" #~ "\n" #~ "- Ĝi havas neniun permesilon (deklaritan kiel SPDX-esprimo).\n" #~ "\n" #~ "- Ĝia permesilo ne troveblas.\n" #~ "\n" #~ "Ĉi tiu komando presas nur la dosierindikojn, kiuj ne konformas. Ĉiu " #~ "dosiero estas presata sur propra linio.\n" #~ "\n" #~ "Eraraj kaj avertaj mesaĝoj estas presotaj al STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "SPDX-esprimoj nepras por konformiĝo" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "kopirajtafiŝoj nepras por konformiĝo" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "presi la SPDX-esprimon de ĉiu donita dosiero" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versio {}\n" reuse-tool-0.14.0/po/es.po000066400000000000000000001010061416231101000152420ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 pd # SPDX-FileCopyrightText: 2018 flow # SPDX-FileCopyrightText: 2020 Roberto Bauglir # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-09 15:07+0100\n" "PO-Revision-Date: \n" "Last-Translator: Alejandro Criado-Pérez \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/reuse/_main.py:30 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/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Apoya el trabajo de la FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "habilita instrucciones de depuración" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "no omitas los submódulos de Git" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "no utilices multiproceso" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "define el origen del proyecto" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "muestra la versión del programa y sale" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "subcomandos" #: src/reuse/_main.py:99 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:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Incluye el copyright y la licencia en la cabecera de uno o más archivos.\n" "\n" "Utilizando --copyright y --license, puedes especificar qué propietarios del " "copyright y qué licencias añadir a las cabeceras de tales ficheros.\n" "\n" "El estilo del comentario debería ser autodetectado en tus ficheros. Si el " "estilo de un comentario no pudiera ser determinado, el proceso sería " "abortado. Usa --style para especificar, o sobreescribir, el estilo de " "comentario a utilizar.\n" "\n" "Puedes cambiar la plantilla de la cabecera utilizando --template. Coloca una " "plantilla Jinja2 en .reuse/templates/mytemplate.jinja2. Puedes utilizar la " "plantilla especificando '--template mytemplate'. Lee la documentación en " "línea que explica cómo utilizar esta función.\n" "\n" "\n" "Si se detecta un fichero de binarios, o si se especifica --explicit-license, " "la cabecera es incluida en un archivo .license.\n" "\n" "IMPORTANTE: ¡Esto es EXPERIMENTAL!" #: src/reuse/_main.py:135 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:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Descarga una licencia y guárdala en el directorio LICENSES/.\n" "\n" "El directorio LICENSES/ es automáticamente detectado en el siguiente orden:\n" "\n" "- El directorio LICENSES/ en la raíz del repositorio VCS.\n" "\n" "- El directorio actual, si su nombre es LICENSES.\n" "\n" "- El directorio LICENSES/ en el directorio actual.\n" "\n" "Si el directorio LICENSES/ no fuese encontrado, simplemente se creará uno." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "inicia el proyecto REUSE" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" #: src/reuse/_main.py:172 #, 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 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" "- 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" "\n" "Los siguientes criterios son específicamente chequeados:\n" "\n" "- ¿Hay alguna licencia mala (no reconocida, no compatible 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" "\n" "- ¿Existe alguna licencia, de las incluidas en el directorio LICENSES/, que " "no esté en uso en el proyecto?\n" "\n" "- ¿Tienen todos los ficheros información válida sobre copyright y " "licencia?" #: src/reuse/_main.py:199 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la lista de materiales del proyecto en formato SPDX" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' no es un fichero" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' no es un directorio" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "no se puede abrir '{}'" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "no se pude escribir en el directorio '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "no se puede escribir en '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "no se puede leer o escribir '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' no es una expresión SPDX válida; abortando" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Identificador SPDX de la licencia" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Error: {spdx_identifier} ya existe." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Error: Fallo al descargar la licencia." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' no es un Identificador SPDX de Licencia válido." #: src/reuse/download.py:115 src/reuse/init.py:55 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/download.py:120 msgid "Is your internet connection working?" msgstr "¿Está funcionando tu conexión a Internet?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} descargado con éxito." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "se requieren los siguientes parámetros: license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "no se puede utilizar --output con más de una licencia" #: src/reuse/header.py:103 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" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' carece de una extensión de fichero conocida: por favor, utiliza --" "style o --explicit-license" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Error: No se pudo crear un comentario para '{path}'" #: src/reuse/header.py:359 #, 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 "" "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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Cabecera de {path} correctamente cambiada" #: src/reuse/header.py:383 #, fuzzy msgid "copyright statement, repeatable" msgstr "declaración de copyright; repetible" #: src/reuse/header.py:390 #, fuzzy msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX; repetible" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "año de la declaración de copyright; opcional" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "nombre de la plantilla a utilizar; opcional" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "no incluir el año en la declaración" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "coloca la cabecera en path.license, en lugar de path" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "una de estas opciones es necesaria: --copyright o --license" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "las opciones -exclude-year y --year son mutuamente excluyentes" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "no pudo encontrarse la plantilla {template}" #: src/reuse/header.py:482 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "¿Bajo qué licencia se encuentra tu proyecto? Aporta el Identificador SPDX de " "Licencia." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "¿Bajo qué otras licencias se encuentra tu proyecto? Proporciona el " "Identificador SPDX de Licencia." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para terminar de añadir licencias pulsa RETORNO." #: src/reuse/init.py:85 #, fuzzy msgid "Project already initialized" msgstr "Proyecto ya iniciado" #: src/reuse/init.py:89 #, fuzzy msgid "Initializing project for REUSE." msgstr "Iniciando proyecto para REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "¿Cuál es el nombre del proyecto?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "¿Cuál es la dirección de Internet del proyecto?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "¿Cuál es el nombre del mantenedor?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "¿Cuál es la dirección de correo electrónico del mantenedor?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "¡Ya hemos terminado! Iniciando." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Descargando {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} ya existe" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "No se pudo descargar {}" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Creando .reuse/dep5" #: src/reuse/init.py:162 #, fuzzy msgid "Initialization complete." msgstr "Inicio completado." #: src/reuse/lint.py:55 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "¡Enhorabuena! Tu proyecto es compatible con la versión {} de la " "Especificación REUSE :-)" #: src/reuse/lint.py:62 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Desafortunadamente, tu proyecto no es compatible con la versión {} de la " "Especificación REUSE :-(" #: src/reuse/lint.py:79 msgid "BAD LICENSES" msgstr "LICENCIAS MALAS" #: src/reuse/lint.py:83 src/reuse/lint.py:148 #, fuzzy msgid "'{}' found in:" msgstr "'{}' encontrado en:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "LICENCIAS OBSOLETAS" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "Las siguientes licencias han quedado obsoletas según SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCIAS SIN EXTENSIÓN DE FICHERO" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "Las siguientes licencias no tienen extensión de fichero:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "LICENCIAS NO ENCONTRADAS" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "LICENCIAS NO UTILIZADAS" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "Las siguientes licencias no son utilizadas:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "ERRORES DE LECTURA" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "No se pudo leer:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FALTA INFORMACIÓN SOBRE COPYRIGHT Y LICENCIA" #: src/reuse/lint.py:214 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:223 msgid "The following files have no copyright information:" msgstr "Los siguientes ficheros carecen de información de copyright:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "Los siguientes ficheros carecen de información de licencia:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RESUMEN" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Licencias malas:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Licencias obsoletas:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licencias sin extensión de fichero:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Licencias no encontradas:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Licencias no utilizadas:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Licencias utilizadas:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Errores de lectura: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Ficheros con información sobre copyright: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Ficheros con información de licencia: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "no se pudo encontrar Git" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' cubierto por .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{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" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 presenta errores de sintaxis" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinando el identificador de '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} no tiene extensión de fichero" #: src/reuse/project.py:275 #, 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." #: src/reuse/project.py:287 #, python-brace-format 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}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' no acaba en .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "uso: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 #, fuzzy msgid ".__call__() not defined" msgstr ".__call__() no está definido" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" "analizador sintáctico desconocido: %(parser_name)r (alternativas: " "%(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "parámetro \"-\" con modo %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "no se puede abrir '%s': %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "no se pueden fusionar las acciones: dos grupos se llaman %r" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 #, fuzzy msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento no válido para posicionales" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, fuzzy, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "la cadena de la opción %(option)r es inválida: debe comenzar con un carácter " "%(prefix_chars)r" #: /usr/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "se requiere dest= para opciones como %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor no válido de conflict_resolution: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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" #: /usr/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "los parámetros mutuamente excluyentes deben ser opcionales" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "parámetros posicionales" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "parámetros opcionales" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "no puede contener múltiples parámetros del subanalizador sintáctico" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "parámetros no reconocidos: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "no permitido con el parámetro %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "parámetro explícito ignorado: %r" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "los siguientes parámetros son obligatorios: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "se requiere uno de los parámetros %s" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "se espera un parámetro" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "se espera un parámetro, como máximo" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "se espera un parámetro, como mínimo" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, 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" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría coincidir con %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "cadena de opción inesperada: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r no se puede invocar" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor no válido de %(type)s: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opción inválida: %(value)r (opciones: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no se puede abrir '%(filename)s': %(error)s" #~ msgid "yielding %s" #~ msgstr "apuntando a %s" #~ msgid "currently walking in %s" #~ msgstr "actualmente recorriendo %s" #~ msgid "ignoring %s" #~ msgstr "ignorando %s" #~ msgid "searching %s for reuse information" #~ msgstr "buscando información de reuse en %s" #~ msgid "%s could not be decoded" #~ msgstr "%s no se pudo decodificar" #~ msgid "%s covered by debian/copyright" #~ msgstr "%s cubierto por debian/copyright" #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "" #~ "{path} con licencia {identifier}, pero no se encontró el archivo con la " #~ "licencia" #~ msgid "searching %s for license tags" #~ msgstr "buscando etiquetas de licencia en %s" #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "" #~ "No se pudo resolver el identificador SPDX de {path}, resolviendo a " #~ "{identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "no existe o no se pudo leer el archivo debian/copyright" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "Copyright (C) 2017-2018 de reuse Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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 reuse. If not, see ." #~ msgstr "" #~ "reuse es software libre: puedes redistribuirlo y/o modificarlo bajo los " #~ "términos de la Licencia Pública General GNU (GNU GPL) tal y como está " #~ "publicada por la Free Software Foundation, tanto la versión 3 de la " #~ "Licencia, o (a tu elección) cualquier versión posterior.\n" #~ "\n" #~ "reuse se distribuye con la esperanza de ser útil, pero SIN NINGUNA " #~ "GARANTIA; ni siquiera la garantia implícita de COMERCIABILIDAD o " #~ "ADECUACIÓN PARA UN PROPÓSITO PARTICULAR. Consulta la Licencia Pública " #~ "General GNU para más detalles.\n" #~ "\n" #~ "Deberías haber recibido una copia de la Licencia Pública General GNU con " #~ "reuse. Si no es así, consulta ." #~ msgid "IMPORTANT:" #~ msgstr "IMPORTANTE:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "No tienes instalado pygit2 por lo que reuse funcionará significativamente " #~ "más lento. Por favor, instala la versión de pygit2 de tu distribución " #~ "para un mejor rendimiento." #~ msgid "could not read %s" #~ msgstr "no se pudo leer %s" #~ msgid "none\n" #~ msgstr "nada\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "no use debian/copyright para extraer información de reuse" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Lista todos los ficheros no compatibles.\n" #~ "\n" #~ "Un fichero es no compatible si:\n" #~ "\n" #~ "- no tiene información de copyright.\n" #~ "\n" #~ "- no tiene licencia (declarada como una expresión SPDX).\n" #~ "\n" #~ "- su licencia no se encuentra.\n" #~ "\n" #~ "Esto imprime únicamente las rutas de los ficheros no compatibles, cada " #~ "fichero en una línea separada.\n" #~ "\n" #~ "Los mensajes de error y aviso se muestran en STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "Las expresiones SPDX son de obligatorio cumplimiento" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "las notas de copyright son de obligatorio cumplimiento" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "imprime las expresiones SPDX de cada fichero proporcionado" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versión {}\n" reuse-tool-0.14.0/po/fr.po000066400000000000000000000604171416231101000152540ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 OliBug # SPDX-FileCopyrightText: 2020 Vincent Lequertier # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-15 20:23+0100\n" "PO-Revision-Date: 2020-01-20 14:33+0100\n" "Last-Translator: Carmen Bianca BAKKER \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 2.2.4\n" #: src/reuse/_main.py:30 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:36 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:39 msgid "Support the FSFE's work:" msgstr "Soutenir le travail de la FSFE :" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "activer les instructions de débogage" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "ne pas omettre les sous-modules Git" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "pas de multiprocessing" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "définition de la racine (root) du projet" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "voir la version du programme et quitter" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "sous-commandes" #: src/reuse/_main.py:99 msgid "add copyright and licensing into the header of files" msgstr "" "ajout des informations de droits d'auteur et de licence dans les en-têtes " "(header) des fichiers" #: src/reuse/_main.py:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or override the " "comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place a " "Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the template " "by specifying '--template mytemplate'. Read the online documentation on how to " "use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the header " "is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Ajout des informations de droits d'auteur et de licence dans les en-têtes d'un ou " "plusieurs fichiers.\n" "\n" "En sélectionnant --copyright et --license, vous pouvez spécifier quels titulaires " "de droits et licences sont ajoutés aux en-têtes des fichiers listés.\n" "\n" "Les styles de commentaire doivent être détectés automatiquement pour vos " "fichiers. Si un style de commentaire ne peut pas être détecté, le processus est " "interrompu. Utilisez --style pour spécifier ou passer outre le style de " "commentaire utilisé.\n" "\n" "Vous pouvez modifier le modèle des commentaires d'en-tête en utilisant l'option --" "template. Placez un modèle Jinja2 dans le répertoire .reuse/templates/mytemplate." "jinja2. Vous pouvez utiliser le modèle en précisant '--template mytemplate'. " "Consultez la documentation en ligne pour plus d'informations sur l'utilisation de " "cette fonctionnalité.\n" "\n" "IMPORTANT: cette fonctionnalité est EXPÉRIMENTALE pour le moment !" #: src/reuse/_main.py:135 msgid "download a license and place it in the LICENSES/ directory" msgstr "télécharger une licence et la placer dans le répertoire LICENSES/" #: src/reuse/_main.py:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Téléchargez une licence et placez-la dans le répertoire LICENSES/.\n" "\n" "Les répertoires LICENSES/ se trouvent automatiquement dans l'ordre suivant :\n" "\n" "- Le répertoire LICENSES/ à la racine du répertoire VCS.\n" "\n" "- Le répertoire actuel, si son nom est LICENSES.\n" "\n" "- Le répertoire LICENSES/ dans le répertoire courant.\n" "\n" "Si le répertoire LICENSES/ n'est pas trouvé, il sera simplement créé." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "initialiser le projet REUSE" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "lister tous les fichiers non-conformes" #: src/reuse/_main.py:172 #, 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 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" "- Do all files have valid copyright and licensing information?" msgstr "" "Vérifiez 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" "- 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 d'informations de droits d'auteur et de licence " "valides ?" #: src/reuse/_main.py:199 msgid "print the project's bill of materials in SPDX format" msgstr "imprimer la nomenclature du projet au format SPDX" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' n'est pas un fichier" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' n'est pas un répertoire" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "'{}' ne peut être ouvert" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "écriture impossible dans le répertoire '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "écriture impossible dans '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "lecture ou écriture impossible pour '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' n'est pas une expression SPDX valide, abandon" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Identification de la licence SPDX" #: src/reuse/download.py:85 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:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erreur : {spdx_identifier} existe déjà." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Erreur : échec du téléchargement de licence." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' n'est pas un identifiant de licence SPDX valide." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License Identifiers." msgstr "" "Consultez pour une liste des identifiants de licence " "SPDX valides." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "Votre connexion internet fonctionne-t-elle ?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Téléchargement de {spdx_identifier} terminé." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "les arguments suivants sont nécessaires : license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "--output ne peut pas être utilisé avec plus d'une licence" #: src/reuse/header.py:103 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "les commentaires générés ne contiennent pas de ligne ou d'expression de droits " "d'auteur ou de licence" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' n'est pas une extension de fichier reconnue, merci d'utiliser --style ou " "--explicit-license" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" #: src/reuse/header.py:359 #, 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 "" "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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "En-tête de {path} modifié avec succès" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "déclaration de droits d'auteur, répétable" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "Identifiant SPDX, répétable" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "année de déclaration de droits d'auteur, optionnel" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "style de commentaire à utiliser, optionnel" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "nom de modèle à utiliser, optionnel" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "ne pas inclure d'année dans la déclaration" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "placez l'en-tête dans path.license au lieu de path" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "une des options --copyright ou --license est nécessaire" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "les options --exclude-year et --year sont mutuellement exclusives" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "le modèle {template} est introuvable" #: src/reuse/header.py:482 #, 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/init.py:25 msgid "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sous quelle licence est enregistrè votre projet ? Merci de fournir un identifiant " "de licence SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License Identifier." msgstr "" "Sous quelle autre licence est enregistré votre projet ? Merci de fournir un " "identifiant de licence SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Pour finir l'ajout de licences, presser ENTRÉE." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Le projet est déjà initialisé" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Initialisation du projet pour REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Quel est le nom du projet ?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Quelle est l'adresse internet du projet ?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Quel est le nom de la personne chargée de la maintenance ?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Quelle est l'adresse mail de la personne chargée de la maintenance ?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Tout est prêt ! Maintenant, on initialise." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Télécharge {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} existe déjà" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "{} n'a pas pu être téléchargé" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Création de .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Initialisation terminée." #: src/reuse/lint.py:55 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Félicitations ! Votre projet est conforme à la version {} de la spécification " "REUSE :-)" #: src/reuse/lint.py:62 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/lint.py:79 msgid "BAD LICENSES" msgstr "MAUVAISES LICENCES" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' trouvé dans :" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "LICENCES OBSOLÈTES" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCES SANS EXTENSION DE FICHIER" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "Les licences suivantes n'ont pas d'extension de fichier :" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "LICENCES MANQUANTES" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "LICENCES INUTILISÉES" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "Les licences suivantes ne sont pas utilisées :" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "ERREURS DE LECTURE" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Illisibles :" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" #: src/reuse/lint.py:214 msgid "The following files have no copyright and licensing information:" msgstr "" "Les fichiers suivants ne contiennent pas d'information de droits d'auteurs et de " "licence :" #: src/reuse/lint.py:223 msgid "The following files have no copyright information:" msgstr "" "Les fichiers suivants ne contiennent pas d'information de droits d'auteurs :" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "Les fichiers suivants ne contiennent pas d'information de licence :" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RÉSUMÉ" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Mauvaises licences :" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Licences obsolètes :" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licences sans extension de fichier :" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Licences manquantes :" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Licences inutilisées :" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Licences utilisées :" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Erreurs de lecture : {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Fichiers contenant des informations de droits d'auteur : {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Fichiers contenant des informations de licence : {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "Git ne peut pas être trouvé" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' est couvert par .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' contient une expression SPDX qui ne peut pas être analysée, le fichier " "est ignoré" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 contient des erreurs de syntaxe" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "résolution de l'identifiant de '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} n'a pas d'extension de fichier" #: src/reuse/project.py:275 #, 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 "" "Impossible de résoudre l'identifiant de licence SPDX de {path}, utilisation de " "{identifier}. Merci de vérifier que la licence est dans la liste trouvable " "à ou qu'elle débute par 'LicenseRef-', et qu'elle " "contient une extension de fichier." #: src/reuse/project.py:287 #, python-brace-format msgid "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant de {path} comme de {other_path}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' ne se termine pas en .spdx" #: /usr/lib64/python3.7/argparse.py:297 msgid "usage: " msgstr "usage : " #: /usr/lib64/python3.7/argparse.py:845 msgid ".__call__() not defined" msgstr ".__call__() est indéfini" #: /usr/lib64/python3.7/argparse.py:1148 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analyseur %(parser_name)r inconnu (choix : %(choices)s)" #: /usr/lib64/python3.7/argparse.py:1202 #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" avec le mode %r" #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "impossible d'ouvrir '%s' : %s" #: /usr/lib64/python3.7/argparse.py:1414 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" #: /usr/lib64/python3.7/argparse.py:1452 msgid "'required' is an invalid argument for positionals" msgstr "'required' est un argument invalide pour les positionnels" #: /usr/lib64/python3.7/argparse.py:1474 #, 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/lib64/python3.7/argparse.py:1494 #, python-format msgid "dest= is required for options like %r" msgstr "dest= est nécessaire pour les options comme %r" #: /usr/lib64/python3.7/argparse.py:1511 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valeur de résolution de conflit invalide : %r" #: /usr/lib64/python3.7/argparse.py:1529 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "chane d'options contradictoire : %s" msgstr[1] "chaînes d'options contradictoires : %s" #: /usr/lib64/python3.7/argparse.py:1595 msgid "mutually exclusive arguments must be optional" msgstr "les arguments mutuellement exclusifs doivent être optionnels" #: /usr/lib64/python3.7/argparse.py:1658 msgid "positional arguments" msgstr "arguments positionnels" #: /usr/lib64/python3.7/argparse.py:1659 msgid "optional arguments" msgstr "arguments optionnels" #: /usr/lib64/python3.7/argparse.py:1674 msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" #: /usr/lib64/python3.7/argparse.py:1705 msgid "cannot have multiple subparser arguments" msgstr "impossible de considérer des arguments de sous-analyse multiples" #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #, python-format msgid "unrecognized arguments: %s" msgstr "arguments non reconnus : %s" #: /usr/lib64/python3.7/argparse.py:1854 #, python-format msgid "not allowed with argument %s" msgstr "non autorisé avec l'argument %s" #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #, python-format msgid "ignored explicit argument %r" msgstr "l'argument explicite %r est ignoré" #: /usr/lib64/python3.7/argparse.py:2021 #, python-format msgid "the following arguments are required: %s" msgstr "les arguments suivants sont nécessaires : %s" #: /usr/lib64/python3.7/argparse.py:2036 #, python-format msgid "one of the arguments %s is required" msgstr "un des arguments %s est nécessaire" #: /usr/lib64/python3.7/argparse.py:2079 msgid "expected one argument" msgstr "un argument est attendu" #: /usr/lib64/python3.7/argparse.py:2080 msgid "expected at most one argument" msgstr "au plus un argument est attendu" #: /usr/lib64/python3.7/argparse.py:2081 msgid "expected at least one argument" msgstr "au moins un argument est attendu" #: /usr/lib64/python3.7/argparse.py:2083 #, 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" #: /usr/lib64/python3.7/argparse.py:2143 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambigüe : %(option)s ne correspond pas à %(matches)s" #: /usr/lib64/python3.7/argparse.py:2206 #, python-format msgid "unexpected option string: %s" msgstr "option inattendue : %s" #: /usr/lib64/python3.7/argparse.py:2403 #, python-format msgid "%r is not callable" msgstr "%r ne peut être appelé" #: /usr/lib64/python3.7/argparse.py:2420 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s invalide : %(value)r" #: /usr/lib64/python3.7/argparse.py:2431 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" #: /usr/lib64/python3.7/argparse.py:2507 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" #, python-format #~ msgid "can't open '%(filename)s': %(error)s" #~ msgstr "'%(filename)s' ne peut pas être ouvert : %(error)s" reuse-tool-0.14.0/po/gl.po000066400000000000000000000664521416231101000152540ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 pd # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: 2020-01-17 22:07+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.4\n" "Last-Translator: \n" "Language: gl\n" #: src/reuse/_main.py:30 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." #: src/reuse/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Apoie o traballo da FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "habilitar sentencias de depuración" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "non salte os submódulos de Git" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "non empregue multiprocesamento" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "definir a raíz do proxecto" #: src/reuse/_main.py:88 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:92 msgid "subcommands" msgstr "subcomandos" #: src/reuse/_main.py:99 msgid "add copyright and licensing into the header of files" msgstr "engadir copyright e licenza na cabeceira dos arquivos" #: src/reuse/_main.py:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Engadir copyright e información da licenza na cabeceira de un ou varios " "arquivos\n" "\n" "Pódese especificar mediante --license e --copyright a licenza e os donos do " "copyright a engadir nas cabeceiras dos arquivos indicados.\n" "\n" "O estilo dos comentarios dos arquivos debería detectarse automáticamente, de " "non se detectar o proceso abórtase. Pódese usar --style para definir ou " "forzar o estilo de comentario a usar.\n" "\n" "É posible cambiar o modelo do comentario de cabeceira usando --template. Por " "exemplo, gardando o modelo Jinja2 na carpeta .reuse/templates/mytemplate." "jinja2 pode usar este modelo indicando '--template mytemplate'. Consulte a " "documentación en liña para máis información sobre esta característica.\n" "\n" "Se o arquivo é binario ou se especifica --explicit-license, a cabeceira " "gárdase nun arquivo .license.\n" "\n" "IMPORTANTE: Actualmente isto é EXPERIMENTAL!" #: src/reuse/_main.py:135 msgid "download a license and place it in the LICENSES/ directory" msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" #: src/reuse/_main.py:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Descargar unha licenza e gardala na carpeta LICENSES/.\n" "\n" "A carpeta LICENSES/ procurase neste orde:\n" "\n" "- a carpeta LICENSES/ na raíz do repositorio VCS.\n" "\n" "- a carpeta actual se o seu nome é LICENSES.\n" "\n" "- a carpeta LICENSES/ no directorio actual.\n" "\n" "Se non se atopa a carpeta LICENSES/ créase unha." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "iniciar un proxecto REUSE" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "listar todos os arquivos que non cumplen os criterios" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiales do proxecto en formato SPDX" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' non é un arquivo" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' non é un directorio" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "non se pode abrir '{}'" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "non se pode escribir no directorio '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "non se pode escribir en '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "non se pode ler ou escribir en '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non é unha expresión SPDX válida, cancelando" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Identificador de Licenza SPDX da licenza" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "descargar todas as licenzas detectadas mais non atopadas no proxecto" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} xa existe." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Erro: Fallo descargando a licenza." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non é un Identificador de Licenza SPDX válido." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consulte unha lista de Identificadores de Licenza SPDX válidos en ." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "Está a funcionar a súa conexión a internet?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Descargouse correctamente o {spdx_identifier}." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "requirense os seguintes argumentos: licenza" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "non se pode usar --output con máis dunha licenza" #: src/reuse/header.py:103 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/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' non ten unha extensión de arquivo recoñecida, precisa usar --style " "ou --explicit-license" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erro: Non se pode crear un comentario para '{path}'" #: src/reuse/header.py:359 #, 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 "" "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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "A cabeceira de {path} cambiada con éxito" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "declaración de copyright, repetibel" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX, repetibel" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "ano da declaración de copyright, opcional" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "estilo de comentario a usar, opcional" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "nome do modelo a usar, opcional" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "non incluir ano na declaración" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "colocar a cabeceira en carpeta.licenza no canto de carpeta" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "precisase a opción --copyright ou --license" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "as opcións --exclude-year e --year non se poden usar á vez" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "no se atopa o modelo {template}" #: src/reuse/header.py:482 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Baixo que licenza está o seu proxecto? indique o Identificador de Licenza " "SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Baixo que outra licenza está o seu proxecto? indique o Identificador de " "Licenza SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para rematar de engadir licenzas, prema ENTER." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "O proxecto xa está iniciado" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Iniciando o proxecto para REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Cal é o nome do proxecto?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Cal é o enderezo en internet do proxecto?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Cal é o nome do mantenedor?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Cal é o correo electrónico do mantenedor?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Rematou todo! iniciando arestora." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Descargando {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} xa existe" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Non se pode descargar {}" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Creando .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Inicialización completada." #: src/reuse/lint.py:55 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Congratulacións! O seu proxecto cumple coa versión {} da especificación " "REUSE :-)" #: src/reuse/lint.py:62 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Desgraciadamente o seu proxecto non cumple coa versión {} da especificación " "REUSE :-(" #: src/reuse/lint.py:79 msgid "BAD LICENSES" msgstr "LICENZAS DEFECTUOSAS" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' atopado en:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "LICENZAS OBSOLETAS" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenzas son obsoletas para SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZAS SEN EXTENSIÓN DE ARQUIVO" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "As seguintes licenzas non teñen extesión de arquivo:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "LICENZAS NON ATOPADAS" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "LICENZAS SEN USO" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "As seguintes licenzas non se usan:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "ERROS DE LECTURA" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Non se pode ler:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "NON SE ATOPA INFORMACIÓN DE LICENZA OU COPYRIGHT" #: src/reuse/lint.py:214 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:223 msgid "The following files have no copyright information:" msgstr "Os seguintes arquivos non teñen información de copyright:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "Os seguintes arquivos non teñen información de licenza:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Licenzas defectuosas:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Licenzas obsoletas:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licenzas sen extensión de arquivo:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Licenzas non atopadas:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Licenzas non usadas:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Licenzas usadas:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Erros de lectura: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Arquivos con información de copyright: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Arquivos con información de licenza: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "non se pode atopar o Git" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' cuberto por .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " "arquivo" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 ten erros de sintaxe" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "resolvendo o identificador de '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ten extensión de arquivo" #: src/reuse/project.py:275 #, 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 "" "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:287 #, 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}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' non remata en .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "uso: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() non definido" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analizador descoñecido %(parser_name)r (alternativas: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" con modo %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "non se pode abrir '%s': %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, 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" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' non é un argumento valido para os posicionais" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, python-format 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/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "requírese dest= para opcións do tipo %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor non válido para conflict_resolution: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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" #: /usr/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "os argumentos mutuamente exclusivos deben ser opcionais" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "argumentos posicionais" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "mostrar esta mensaxe de axuda e sair" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "non pode haber múltiples argumentos para o subanalizador" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos non recoñecidos: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "non se permite co argumento %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "argumento explicito %r ignorado" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "precísanse os seguintes argumentos: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "precísase un dos argumentos %s" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "espérase un argumento" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "espérase un argumento como máximo" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "espérase un argumento como mínimo" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "espérase %s argumento" msgstr[1] "espéranse %s argumentos" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s pode encaixar con %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "opción de cadea non esperada: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r non se pode chamar" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor non válido %(type)s: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alternativa non válida: %(value)r (elixir entre %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "non se pode abrir '%(filename)s': %(error)s" reuse-tool-0.14.0/po/it.po000066400000000000000000000667241416231101000152700ustar00rootroot00000000000000# SPDX-FileCopyrightText: Luca Bonissi # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: \n" "Last-Translator: Carmen Bianca BAKKER \n" "Language-Team: \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" #: src/reuse/_main.py:30 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." #: src/reuse/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Sostieni il lavoro della FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "abilita le istruzioni di debug" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "non omettere i sottomoduli Git" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "non utilizzare il multiprocessing" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "impostare la directory principale del progetto" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "mostra la versione del programma ed esce" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "sottocomandi" #: src/reuse/_main.py:99 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:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or override " "the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online documentation " "on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Aggiunge le informazioni sul copyright e sulla licenza nell'intestazione di " "uno o più file.\n" "\n" "Usando --copyright e --license, puoi specificare i titolari del copyright e " "le licenze da aggiungere all'intestazione dei file specificati.\n" "\n" "Lo stile dei commenti dovrebbe essere rilevato automaticamente per i tuoi " "file. Se lo stile non può essere rilevato, il programma si interrompe. Usa --" "style per specificare o forzare lo stile dei commenti da usare.\n" "\n" "Puoi cambiare il modello dell'intestazione utilizzando --template. Metti un " "modello Jinja2 in .reuse/templates/miomodello.jinja2. Puoi usare il modello " "specificando '--template miomodello'. Leggi la documentazione in linea su " "come usare questa funzione.\n" "\n" "Se viene rilevato un file binario, o se --explicit-licence viene specificato, " "l'intestazione verrà inserita nel file .license.\n" "\n" "IMPORTANTE: Questo è ancora SPERIMENTALE!" #: src/reuse/_main.py:135 msgid "download a license and place it in the LICENSES/ directory" msgstr "scarica una licenza e salvala nella directory LICENSES/" #: src/reuse/_main.py:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Scarica una licenza e salvala nella directory LICENSES/.\n" "\n" "La directory LICENSES/ viene automaticamente ricercata nel seguente ordine:\n" "\n" "- La directory LICENSES/ sotto la directory principale del repository VCS.\n" "\n" "- La directory corrente se il suo nome è LICENSES.\n" "\n" "- La directory LICENSES/ sotto la directory corrente.\n" "\n" "Se la directory LICENSES/ non viene trovata, verrà semplicemente creata." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "inizializza il progetto REUSE" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "lista dei file non conformi" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' non è un file" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' non è una directory" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "non è possibile aprire '{}'" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "non è possibile scrivere nella directory '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "non è possibile scrivere su '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "non è possibile leggere o scrivere '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non è una espressione valida SPDX, interruzione" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Identificativo di Licenza SPDX" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "scarica tutte le licenze mancanti ma usate nel progetto" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Errore: {spdx_identifier} esiste già." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Errore: Fallito lo scaricamento della licenza." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non è un valido Identificativo di Licenza SPDX." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License Identifiers." msgstr "" "Consulta per la lista degli Identificativi di " "Licenza SPDX validi." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "La tua connessione Internet funziona?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Scaricamento completato di {spdx_identifier}." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "sono richiesti i seguenti parametri: license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "non puoi usare --output con più di una licenza" #: src/reuse/header.py:103 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "nel commento generato mancano le linee sul copyright o le espressioni di " "licenza" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' non ha una estensione conosciuta, usa --style o --explicit-license" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Errore: Non è possibile creare il commento per '{path}'" #: src/reuse/header.py:359 #, 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 "" "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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Instestazione di {path} aggiornata" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "dichiarazione del copyright, ripetibile" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "Identificativo SPDX, ripetibile" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "anno della dichiaraione del copyright, opzionale" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "stile dei commenti da usare, opzionale" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "nome del template da usare, opzionale" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "non include l'anno nella dichiarazione" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "inserisci l'intestazione in path.license invece di path" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "è necessario specificare il parametro --copyright o --license" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "il modello {template} non è stato trovato" #: src/reuse/header.py:482 #, 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" #: src/reuse/init.py:25 msgid "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sotto quale licenza viene rilasciato il tuo progetto? Indica l'Identificativo " "di Licenza SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License Identifier." msgstr "" "Quali altre licenze utilizza il tuo progetto? Indica l'Identificativo di " "Licenza SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Per terminare l'aggiunta di licenze, premi INVIO." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Progetto già inizializzato" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Inizializzazione del progetto per REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Qual è il nome del progetto?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Qual è l'indirizzo Internet del progetto?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Qual è il nome del responsabile del progetto?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Qual è l'indirizzo e-mail del responsabile del progetto?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Tutto OK! Sto inizializzando." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "Scaricamento {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} esiste già" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Non è stato possibile scaricare {}" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "Creazione di .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Inizializzazione completa." #: src/reuse/lint.py:55 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Congratulazioni! Il tuo progetto è conforme con la versione {} della " "Specifica REUSE :-)" #: src/reuse/lint.py:62 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " "Specifica REUSE :-(" #: src/reuse/lint.py:79 msgid "BAD LICENSES" msgstr "LICENZE NON VALIDA" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' trovato in:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "LICENZE OBSOLETE" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "Le seguenti licenze sono obsolete secondo SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZE SENZA ESTENSIONE DEL FILE" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "Le seguenti licenze non hanno l'estensione del file:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "LICENZE MANCANTI" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "LICENZE NON UTILIZZATE" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "Le seguenti licenze non sono utilizzate:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "ERRORI DI LETTURA" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Non è possibile leggere:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANCANO LE INFORMAZIONI SU COPYRIGHT E LICENZA" #: src/reuse/lint.py:214 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:223 msgid "The following files have no copyright information:" msgstr "I seguenti file non hanno informazioni sul copyright:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "I seguenti file non hanno informazioni sulla licenza:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RAPPORTO" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Licenze non valide:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Licenze obsolete:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licenze senza estensione del file:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Licenze mancanti:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Licenze non utilizzate:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Licenze usate:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Errori di lettura: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "File con informazioni sul copyright: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "File con informazioni sulla licenza: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "non è stato possibile trovare Git" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' verificato da .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{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." #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 presenta errori di sintassi" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinazione dell'identificativo di '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ha l'estensione del file" #: src/reuse/project.py:275 #, 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 "" "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:287 #, 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}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' non ha estensione .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "uso: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() non definita" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parsificatore sconosciuto: %(parser_name)r (alternative: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "parametro \"-\" con modo %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "non è possibile aprire '%s': %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "non è possibile unire le azioni - due gruppi hanno lo stesso nome %r" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' non è un parametro posizionale valido" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 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" #: /usr/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "dest= è richiesto per opzioni come %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valore per conflict_resolution non valido: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "i parametri mutualmente esclusivi devono essere opzionali" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "parametri posizionali" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "parametri opzionali" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "mostra questo messaggio ed esci" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "non è possibile avere più di un parametro con sotto-parsificatore" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "parametro sconosciuto: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "non permesso con parametro %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "parametro esplicito ignorato %r" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "i seguenti parametri sono obbligatori: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "uno dei parametri %s è richiesto" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "richiesto un parametro" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "al massimo un parametro aspettato" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "richiesto almeno un parametro" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "richiesto il parametro %s" msgstr[1] "richiesti i parametri %s" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opzione ambigua: %(option)s può essere %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "nome opzione inaspettato: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r non è richiamabile" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valore %(type)s non valido: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "scelta non valida: %(value)r (opzioni valide: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "non è possibile aprire '%(filename)s': %(error)s" reuse-tool-0.14.0/po/nl.po000066400000000000000000000775411416231101000152640ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018, 2020 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2017, 2020 André Ockers # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-20 12:18+0100\n" "PO-Revision-Date: 2020-01-11 20:35+0100\n" "Last-Translator: Carmen Bianca BAKKER \n" "Language-Team: Esperanto <>\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/reuse/_main.py:30 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." #: src/reuse/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "Ondersteun het werk van de FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "zet debug statements aan" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "sla Git-submodules niet over" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "gebruik geen multiprocessing" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "bepaal de root van het project" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "versienummer van het programma laten zien en verlaten" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "subcommando's" #: src/reuse/_main.py:99 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:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Voeg auteursrechts- en licentie-informatie toe aan de headers van een of " "meer bestanden.\n" "\n" "Met --copyright en --license kun je de auteursrechthouders en licenties " "specificeren die toegevoegd moeten worden aan de headers van de bestanden.\n" "\n" "De commentstijl wordt automatisch gedetecteerd voor uw bestanden. Als een " "commentstijl niet gedetecteerd kan worden, stopt het proces. Gebruik --style " "om een commentstijl te bepalen.\n" "\n" "U kunt het sjabloon van de header veranderen met --template. Zet een Jinja2-" "sjabloon in .reuse/templates/mijnsjabloon.jinja2. U kunt het sjabloon " "gebruiken door '--template mijnsjabloon' te specificeren. Lees de online " "documentatie voor meer informatie over deze functionaliteit.\n" "\n" "Als een binary bestand gedetecteerd is, of als --explicit-license gebruikt " "wordt, dan wordt de header in een .license bestand geplaatst.\n" "\n" "BELANGRIJK: Dit is momenteel EXPERIMENTEEL!" #: src/reuse/_main.py:135 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:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Download een licentie en plaats het in de LICENSES/-map.\n" "\n" "De LICENSES/-map is automatisch gevonden in de volgende volgorde:\n" "\n" "- De LICENSES/-map in de root van de VCS-map.\n" "\n" "- De huidige map als de naam van de huidige map LICENSES/ is.\n" "\n" "- De LICENSES/-map in de huidige map.\n" "\n" "Als de LICENSES/-map niet gevonden kan worden, dan wordt er een gemaakt." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "initialiseer REUSE-project" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "lijst maken van alle bestanden die tekortschieten" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "print de materiaallijst van het project in SPDX-formaat" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' is geen bestand" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' is geen map" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "kan '{}' niet openen" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "kan niet schrijven naar map '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "kan niet schrijven naar '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "kan '{}' niet lezen of schrijven" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "SPDX Licentie Identificatie of licentie" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "" "download alle ontbrekende licenties die in het project zijn gedetecteerd" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fout: {spdx_identifier} bestaat al." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Fout: downloaden van licentie mislukt." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' is geen geldige SPDX Licentie Identificatie." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Zie voor een lijst met geldige SPDX Licentie " "Identificaties." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "Werkt uw internetverbinding?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} met succes gedowload." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "de volgende argumenten zijn verplicht: licentie" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "kan --output niet met meer dan een licentie gebruiken" #: src/reuse/header.py:101 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" #: src/reuse/header.py:280 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' heeft geen erkende bestandsextensie; gebruik alstublieft --style of " "--explicit-license" #: src/reuse/header.py:339 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Fout: Kon geen commentaar voor '{path}' creëren" #: src/reuse/header.py:346 #, 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 "" "Fout: de gegenereerde commentaarheader voor '{path}' mist auteursrechtregels " "of licentie-uitdrukkingen. Het sjabloon is waarschijnlijk niet correct. " "Schreef geen nieuwe header." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:357 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Succesvolle verandering van de header van {path}" #: src/reuse/header.py:370 msgid "copyright statement, repeatable" msgstr "auteursrechtverklaring (herhaalbaar)" #: src/reuse/header.py:377 msgid "SPDX Identifier, repeatable" msgstr "SPDX Identificatie (herhaalbaar)" #: src/reuse/header.py:384 msgid "year of copyright statement, optional" msgstr "jaar van auteursrechtverklaring (optie)" #: src/reuse/header.py:392 msgid "comment style to use, optional" msgstr "te gebruiken commentaarstijl (optie)" #: src/reuse/header.py:399 msgid "name of template to use, optional" msgstr "naam van het te gebruiken sjabloon (optie)" #: src/reuse/header.py:404 msgid "do not include year in statement" msgstr "voeg geen jaar toe aan verklaring" #: src/reuse/header.py:409 msgid "place header in path.license instead of path" msgstr "plaats header in path.license in plaats van path" #: src/reuse/header.py:417 msgid "option --copyright or --license is required" msgstr "de optie --copyright of --license is vereist" #: src/reuse/header.py:421 msgid "option --exclude-year and --year are mutually exclusive" msgstr "de opties --exclude-year en --year sluiten elkaar uit" #: src/reuse/header.py:437 #, python-brace-format msgid "template {template} could not be found" msgstr "sjabloon {template} kon niet worden gevonden" #: src/reuse/header.py:469 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Onder welke licentie valt uw project? Voeg de SPDX Licientie Identificatie " "toe." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Onder welke andere licentie valt uw project? Voeg de SPDX Licientie " "Identificatie toe." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Typ RETURN om te stoppen met het toevoegen van licenties." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Project al geïnitialiseerd" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Project voor REUSE initialiseren." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Wat is de naam van het project?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Wat is het internetadres van het project?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Wat is de naam van de beheerder?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Wat is het emailadres van de beheerder?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Klaar! Nu aan het initialiseren." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "{} aan het downloaden" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} bestaat al" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Kon {} niet downloaden" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr ".reuse/dep5 aan het creëren" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Initialisatie voltooid." #: src/reuse/lint.py:55 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:62 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:79 msgid "BAD LICENSES" msgstr "SLECHTE LICENTIES" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' gevonden in:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "VEROUDERDE LICENTIES" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "De volgende licenties zijn verouderd door SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENTIES ZONDER BESTANDSEXTENSIE" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "De volgende licenties hebben geen bestandsextensie:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "ONTBREKENDE LICENTIES" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "ONGEBRUIKTE LICENTIES" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "De volgende licenties zijn niet gebruikt:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "LEES FOUTEN" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Kon niet lezen:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "AUTEURSRECHT- EN LICENTIE-INFORMATIE ONTBREEKT" #: src/reuse/lint.py:214 msgid "The following files have no copyright and licensing information:" msgstr "" "De volgende bestanden bevatten geen auteursrecht- en licentie-informatie:" #: src/reuse/lint.py:223 msgid "The following files have no copyright information:" msgstr "De volgende bestanden hebben geen auteursrechtinformatie:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "De volgende bestanden bevatten geen licentie-informatie:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "SAMENVATTING" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Slechte licenties:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Verouderde licenties:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licenties zonder bestandsextensie:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Ontbrekende licenties:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Ongebruikte licenties:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Gebruikte licenties:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Lees fouten: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Bestanden met licentie-informatie: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "kon Git niet vinden" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' valt onder .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " "bestand over" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 kent syntaxfouten" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "identificatie van '{path}' bepalen" #: src/reuse/project.py:265 #, 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:275 #, 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 "" "Kon de SPDX Licentie Identificatie van {path} niet bepalen, bepalen " "{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:287 #, 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}" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' eindigt niet met .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "gebruik: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() is niet gedefinieerd" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "onbekende parser %(parser_name)r (keuzes: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" met mode %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "kan '%s' niet openen: %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kan acties niet samenvoegen - twee groepen delen de naam %r" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' is een ongeldig argument voor positionele argumenten" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, python-format 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/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "dest= is benodigd voor opties zoals %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ongeldige conflictresolutiewaarde: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "tegenstrijdige optiestring: %s" msgstr[1] "tegenstrijdige optiestrings: %s" #: /usr/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "argumenten die elkaar uitsluiten moeten optioneel zijn" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "positionele argumenten" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "optionele argumenten" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "dit helpbericht laten zien en verlaten" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "kan niet meerdere subparser-argumenten hebben" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2276 #, python-format msgid "unrecognized arguments: %s" msgstr "niet erkende argumenten: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "niet toegestaan met argument %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "expliciet argument %r genegeerd" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "de volgende argumenten zijn verplicht: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "één van de argumenten %s is benodigd" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "verwachtte één argument" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "verwachtte maximaal één argument" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "verwachtte minimaal één argument" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2096 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "verwachtte %s argument" msgstr[1] "verwachtte %s argumenten" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2156 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" "dubbelzinnige optie: %(option)s zou ook gelijk kunnen zijn aan %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2219 #, python-format msgid "unexpected option string: %s" msgstr "onverwachtte optiestring: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2416 #, python-format msgid "%r is not callable" msgstr "%r is niet callable" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2433 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ongeldige %(type)s waarde: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2444 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2520 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "kan '%(filename)s' niet openen: %(error)s" #~ msgid "yielding %s" #~ msgstr "%s aan het verwerken" #~ msgid "currently walking in %s" #~ msgstr "aan het lopen door %s" #~ msgid "ignoring %s" #~ msgstr "%s negeren" #~ msgid "searching %s for reuse information" #~ msgstr "%s aan het doorzoeken voor reuse informatie" #~ msgid "%s could not be decoded" #~ msgstr "%s kon niet gedecodeerd worden" #~ msgid "%s covered by debian/copyright" #~ msgstr "debian/copyright omvat %s" #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "" #~ "{path} valt onder {identifier}, maar het licentiebestand kon niet " #~ "gevonden worden" #~ msgid "searching %s for license tags" #~ msgstr "%s aan het doorzoeken voor licentie-tags" #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "Kon SPDX-identifier van {path} niet oplossen, gebruik {identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "geen debian/copyright bestand, of kon het niet lezen" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "reuse Auteursrecht (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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 reuse. If not, see ." #~ msgstr "" #~ "reuse is vrije software: u mag het herdistribueren en/of wijzigen onder " #~ "de voorwaarden van de GNU Algemene Publieke Licentie zoals gepubliceerd " #~ "door de Free Software Foundation, onder versie 3 van de Licentie of (naar " #~ "uw keuze) elke latere versie.\n" #~ "\n" #~ "reuse is gedistribueerd in de hoop dat het nuttig zal zijn maar ZONDER " #~ "ENIGE GARANTIE; zelfs zonder de impliciete garanties die GEBRUIKELIJK " #~ "ZIJN IN DE HANDEL of voor BRUIKBAARHEID VOOR EEN SPECIFIEK DOEL. Zie de " #~ "GNU Algemene Publieke Licentie voor meer details.\n" #~ "\n" #~ "U hoort een kopie van de GNU Algemene Publieke Licentie te hebben " #~ "ontvangen samen met reuse. Als dat niet het geval is, zie ." #~ msgid "IMPORTANT:" #~ msgstr "BELANGRIJK:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "U heeft pygit2 niet geïnstalleerd. reuse zal hierdoor significant " #~ "langzamer draaien. Voor betere prestatie, installeer alstublieft uw " #~ "distributie's versie van pygit2." #~ msgid "could not read %s" #~ msgstr "kon %s niet lezen" #~ msgid "none\n" #~ msgstr "geen\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "debian/copyright niet gebruiken om reuse informatie te extraheren" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Lijst maken van niet-voldoenende bestanden.\n" #~ "\n" #~ "Een bestand voldoet niet als:\n" #~ "\n" #~ "- Het geen auteursrechtinformatie heeft.\n" #~ "\n" #~ "- Het geen licentie heeft (gegeven als SPDX-uitdrukking).\n" #~ "\n" #~ "- Zijn licentie niet gevonden kan worden.\n" #~ "\n" #~ "Dit print enkel de paden van de bestanden die niet voldoen. Elk bestand " #~ "heeft zijn eigen regel.\n" #~ "\n" #~ "Fout- en waarschuwingsmeldingen worden geprint naar STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "SPDX-uitdrukkingen zijn verplicht voor voldoening" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "auteursrechtnotities zijn verplicht voor voldoening" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "de SPDX-uitdrukkingen van elke gegeven file printen" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versie {}\n" reuse-tool-0.14.0/po/pt.po000066400000000000000000000671571416231101000153000ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 José Vieira # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: 2020-01-20 14:55+0100\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Last-Translator: Carmen Bianca BAKKER \n" "Language-Team: \n" "X-Generator: Poedit 2.2.4\n" #: src/reuse/_main.py:30 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:36 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:39 msgid "Support the FSFE's work:" msgstr "Apoiar o trabalho da FSFE:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "activar expressões de depuração" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "não ignorar sub-módulos do Git" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "não usar multi-processamento" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "definir a raíz do projecto" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "mostrar o número de versão do programa e sair" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "sub-comandos" #: src/reuse/_main.py:99 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:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Adicionar direitos de autor e licenciamento ao cabeçalho de um ou mais " "ficheiros.\n" "\n" "Usando --copyright e --license, pode-se especificar que detentores de " "direitos de autor e que licenças adicionar aos cabeçalhos dos ficheiros em " "causa.\n" "\n" "O estilo dos comentários deve ser detectado automaticamente nos ficheiros. " "Se não for detectado nenhum estilo de comentários, o processo é abortado. " "Usar --style para especificar ou sobre-escrever o estilo de comentários a " "usar.\n" "\n" "É possível mudar o modelo de comentários de cabeçalho usando --template. " "Colocarum modelo Jinja2 na pasta .reuse/templates/mytemplate.jinja2. Este " "modelo pode ser usado indicando '--template mytemplate'. Consultar a " "documentação em linha para informação adicional sobre esta funcionalidade.\n" "\n" "Se for detectado um ficheiro binário ou se for especificado --explicit-" "license, o cabeçalho é colocado num ficheiro .license\n" "\n" "IMPORTANTE: Presentemente esta funcionalidade é EXPERIMENTAL!" #: src/reuse/_main.py:135 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:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Descarregar uma licença e guardá-la na pasta LICENSES/.\n" "\n" "A pasta LICENSES/ é procurada automaticamente por esta ordem:\n" "\n" "- Pasta LICENSES/ na raíz do repositório VCS.\n" "\n" "- Pasta actual se o nome for LICENSES.\n" "\n" "- Pasta LICENSES/ na pasta actual.\n" "\n" "Se não for encontrada, a pasta LICENSES/ será criada." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "iniciar um projecto REUSE" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "listar todos os ficheiros não conformes" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiais do projecto em formato SPDX" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' não é um ficheiro" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' não é uma pasta" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "não é possível abrir '{}'" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "não é possível escrever no directório '{}'" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "não é possível escrever em '{}'" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "não é possível ler ou escrever em '{}'" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' não é uma expressão SPDX válida; a abortar" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Identificador de Licença SPDX da licença" #: src/reuse/download.py:85 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:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} já existe." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Erro: Falha ao descarregar a licença." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' não é um Identificador de Licença SPDX válido." #: src/reuse/download.py:115 src/reuse/init.py:55 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/download.py:120 msgid "Is your internet connection working?" msgstr "A ligação à Internet está a funcionar?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} transferido com êxito." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "são requeridos os seguintes argumentos: licença" #: src/reuse/download.py:138 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/header.py:103 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" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" "explicit-license" #: src/reuse/header.py:352 #, 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/header.py:359 #, 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 "" "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/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "O cabeçalho de {path} foi alterado com êxito" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "declaração de direitos de autor (repetível)" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX (repetível)" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "ano da declaração de direitos de autor (opcional)" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "estilo de comentário a usar (opcional)" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "nome do modelo a usar (opcional)" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "não incluir o ano na declaração" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "colocar o cabeçalho em path.license em vez de em path" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "é requerida uma das opções --copyright ou --license" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "as opções --exclude-year e --year são mutuamente exclusivas" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "o modelo {template} não foi encontrado" #: src/reuse/header.py:482 #, 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/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sob que licença está o projecto? Indicar o Identificador de Licença SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Sob que outra licença está o projecto? Indicar o Identificador de Licença " "SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para parar a agregação de licenças, premir INTRODUZIR/ENTER." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Projecto já iniciado" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "A iniciar o projecto para REUSE." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Qual é o nome do projecto?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Qual é o endereço do projecto na internet?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Qual é o nome do responsável (maintainer)?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Qual é o endereço electrónico do responsável?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Pronto! A iniciar." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "A descarregar {}" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} já existe" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "Não foi possível descarregar {}" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr "A criar .reuse/dep5" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "Iniciação completada." #: src/reuse/lint.py:55 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:62 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Infelizmente, o projecto não está conforme com a versão {} da especificação " "REUSE :-(" #: src/reuse/lint.py:79 msgid "BAD LICENSES" msgstr "LICENÇAS IRREGULARES" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' encontrado em:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "LICENÇAS DESCONTINUADAS" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" #: src/reuse/lint.py:123 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:143 msgid "MISSING LICENSES" msgstr "LICENÇAS EM FALTA" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "LICENÇAS NÃO USADAS" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "As seguintes licenças não estão a ser usadas:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "ERROS DE LEITURA" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Não foi possível ler:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" #: src/reuse/lint.py:214 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:223 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:229 msgid "The following files have no licensing information:" msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Licenças irregulares:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Licenças descontinuadas:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Licenças sem extensão de ficheiro:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Licenças em falta:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Licenças não usadas:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Licenças usadas:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Erros de leitura: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Ficheiros com informação de licenciamento: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "não foi encontrado o Git" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' abrangido por .reuse/dep5" #: src/reuse/project.py:145 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " "ficheiro ignorado" #: src/reuse/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 tem erros de sintaxe" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "a determinar o identificador de '{path}'" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} não tem extensão de ficheiro" #: src/reuse/project.py:275 #, 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 "" "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:287 #, 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/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' não termina em .spdx" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "uso: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() não definido" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analisador desconhecido %(parser_name)r (alternativas: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com modo %r" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "não é possível abrir '%s': %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, 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" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' não é um argumento válido para posicionais" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, python-format 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/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "é requerido dest= para opções do tipo %r" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor de conflict_resolution inválido: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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" #: /usr/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos têm que ser opcionais" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "argumentos posicionais" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "mostrar esta mensagem de ajuda e sair" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "não pode haver argumentos múltiplos de sub-análise (subparser)" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "não permitido com o argumento %s" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "são requeridos os seguintes argumentos: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "é requerido um dos argumentos %s" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "é esperado um argumento" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "é esperado um argumento, no máximo" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "é esperado um argumento, no mínimo" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "é esperado %s argumento" msgstr[1] "são esperados %s argumentos" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s pode ser igual a %(matches)s" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "linha de opções não esperada: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r não é invocável" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor %(type)s inválido: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alternativa inválida: %(value)r (escolher de %(choices)s)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" reuse-tool-0.14.0/po/tr.po000066400000000000000000000655641416231101000153020ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 T. E. Kalayci # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-09 13:51+0100\n" "PO-Revision-Date: 2020-01-12 18:28+0100\n" "Last-Translator: T. E. Kalayci \n" "Language-Team: \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/reuse/_main.py:30 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." #: src/reuse/_main.py:36 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:39 msgid "Support the FSFE's work:" msgstr "FSFE'nin çalışmalarını destekleyin:" #: src/reuse/_main.py:43 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:66 msgid "enable debug statements" msgstr "hata ayıklama cümlelerini etkinleştirir" #: src/reuse/_main.py:71 msgid "do not skip over Git submodules" msgstr "Git alt modüllerini atlamaz" #: src/reuse/_main.py:76 msgid "do not use multiprocessing" msgstr "çoklu işlem kullanmaz" #: src/reuse/_main.py:83 msgid "define root of project" msgstr "projenin kökünü tanımlar" #: src/reuse/_main.py:88 msgid "show program's version number and exit" msgstr "programın sürüm numarasını gösterip çıkar" #: src/reuse/_main.py:92 msgid "subcommands" msgstr "alt komutlar" #: src/reuse/_main.py:99 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:102 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" "The comment style should be auto-detected for your files. If a comment style " "could not be detected, the process aborts. Use --style to specify or " "override the comment style to use.\n" "\n" "You can change the template of the header comment by using --template. Place " "a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " "template by specifying '--template mytemplate'. Read the online " "documentation on how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is specified, the " "header is placed in a .license file.\n" "\n" "IMPORTANT: This is currently EXPERIMENTAL!" msgstr "" "Bir veya daha fazla dosya başlığına telif hakkı ve lisans bilgisini ekle.\n" "\n" "ilgili dosyaların başlığına hangi telif hakkı sahiplerinin ve lisansların " "ekleneceğini --copyright ve --license değişkenlerini kullanarak " "belirtebilirsiniz.\n" "\n" "Yorum biçimi dosyalarınız için otomatik olarak belirlenecektir. Eğer bir " "yorum biçimi belirlenemezse, süreç iptal edilecektir. Kullanılacak yorum " "biçimini belirtmek için --style değişkenini kullanın.\n" "\n" "Başlık yorumu şablonunu --template değişkenini kullanarak " "değiştirebilirsiniz. Bir Jinja2 şablonunu .reuse/templates/mytemplate.jinja2 " "içerisine koyun. Şablonu '--template mytemplate' şeklinde kullanabilirsiniz. " "Bu özelliği nasıl kullanabileceğinizi çevrimiçi belgelerden " "öğrenebilirsiniz.\n" "\n" "Eğer ikili bir dosya tespit edilirse veya eğer --explicit-license " "tanımlıysa, başlık .license dosyasına koyulacaktır.\n" "\n" "ÖNEMLİ: Bu şu anda DENEYSELDİR!" #: src/reuse/_main.py:135 msgid "download a license and place it in the LICENSES/ directory" msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" #: src/reuse/_main.py:138 msgid "" "Download a license and place it in the LICENSES/ directory.\n" "\n" "The LICENSES/ directory is automatically found in the following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply created." msgstr "" "Bir lisans indirir ve LICENSES/ dizinine yerleştirir.\n" "\n" "LICENSES/ dizini şu sırayla otomatik olarak aranır:\n" "\n" "- VCS deposunun kökündeki LICENSES/ dizini\n" "\n" "- Eğer ismi LICENSES ise mevcut dizin\n" "\n" "- Mevcut dizindeki LICENSES/ dizini\n" "\n" "Eğer LICENSES/ dizini bulunamazsa, yeni bir tane oluşturulur." #: src/reuse/_main.py:161 msgid "initialize REUSE project" msgstr "REUSE projesini ilkler" #: src/reuse/_main.py:169 msgid "list all non-compliant files" msgstr "bütün uyumsuz dosyaları listeler" #: src/reuse/_main.py:172 #, 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 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" "- 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:199 msgid "print the project's bill of materials in SPDX format" msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" #: src/reuse/_util.py:216 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" #: src/reuse/_util.py:289 msgid "'{}' is not a file" msgstr "'{}' bir dosya değil" #: src/reuse/_util.py:293 msgid "'{}' is not a directory" msgstr "'{}' bir dizin değil" #: src/reuse/_util.py:296 msgid "can't open '{}'" msgstr "'{}' açılamıyor" #: src/reuse/_util.py:300 msgid "can't write to directory '{}'" msgstr "'{}' dizinine yazılamıyor" #: src/reuse/_util.py:306 msgid "can't write to '{}'" msgstr "'{}' yazılamıyor" #: src/reuse/_util.py:308 msgid "can't read or write '{}'" msgstr "'{}' okunamıyor veya yazılamıyor" #: src/reuse/_util.py:317 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" #: src/reuse/download.py:80 msgid "SPDX License Identifier of license" msgstr "Lisansın SPDX Lisans Kimliği" #: src/reuse/download.py:85 msgid "download all missing licenses detected in the project" msgstr "projede tespit edilen bütün eksik lisansları indir" #: src/reuse/download.py:97 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Hata: {spdx_identifier} halihazırda mevcut." #: src/reuse/download.py:104 msgid "Error: Failed to download license." msgstr "Hata: lisans indirme başarısız oldu." #: src/reuse/download.py:108 src/reuse/init.py:48 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." #: src/reuse/download.py:115 src/reuse/init.py:55 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Geçerli SPDX Lisans Kimlikleri listesi için " "adresine bakın." #: src/reuse/download.py:120 msgid "Is your internet connection working?" msgstr "İnternet bağlantınız çalışıyor mu?" #: src/reuse/download.py:125 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} başarılı bir şekilde indirildi." #: src/reuse/download.py:136 msgid "the following arguments are required: license" msgstr "şu değişkenler gerekiyor: license" #: src/reuse/download.py:138 msgid "cannot use --output with more than one license" msgstr "--output birden fazla lisansla birlikte kullanılamıyor" #: src/reuse/header.py:103 msgid "generated comment is missing copyright lines or license expressions" msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" #: src/reuse/header.py:293 #, python-brace-format msgid "" "'{path}' does not have a recognised file extension, please use --style or --" "explicit-license" msgstr "" "'{path}' tanınan bir dosya uzantısına sahip değil, lütfen --style veya --" "explicit-license değişkenlerini kullanın" #: src/reuse/header.py:352 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Hata: '{path}' için yorum oluşturulamıyor" #: src/reuse/header.py:359 #, 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 "" "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ı." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:370 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "{path} başlığı başarılı bir şekilde değiştirildi" #: src/reuse/header.py:383 msgid "copyright statement, repeatable" msgstr "telif hakkı ifadesi, tekrarlanabilir" #: src/reuse/header.py:390 msgid "SPDX Identifier, repeatable" msgstr "SPDX Kimliği, tekrarlanabilir" #: src/reuse/header.py:397 msgid "year of copyright statement, optional" msgstr "telif hakkı ifadesi, isteğe bağlı" #: src/reuse/header.py:405 msgid "comment style to use, optional" msgstr "kullanılacak yorum biçimi, isteğe bağlı" #: src/reuse/header.py:412 msgid "name of template to use, optional" msgstr "kullanılacak şablon ismi, isteğe bağlı" #: src/reuse/header.py:417 msgid "do not include year in statement" msgstr "ifadede yıl içerme" #: src/reuse/header.py:422 msgid "place header in path.license instead of path" msgstr "başlığı path yerine path.license içerisine koy" #: src/reuse/header.py:430 msgid "option --copyright or --license is required" msgstr "--copyright veya --license seçenekleri gereklidir" #: src/reuse/header.py:434 msgid "option --exclude-year and --year are mutually exclusive" msgstr "--exclude-year ve --year seçeneklerinden biri olmalıdır" #: src/reuse/header.py:450 #, python-brace-format msgid "template {template} could not be found" msgstr "{template} şablonu bulunamıyor" #: src/reuse/header.py:482 #, 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "Projeniz hangi lisansa sahip? SPDX Lisans Kimliğini belirtin." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "Projeniz başka hangi lisanslara sahip? SPDX Lisans Kimliğini belirtin." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Lisans eklemeyi durdurmak için ENTER tuşuna basın." #: src/reuse/init.py:85 msgid "Project already initialized" msgstr "Proje zaten ilklenmiş" #: src/reuse/init.py:89 msgid "Initializing project for REUSE." msgstr "Proje REUSE için ilkleniyor." #: src/reuse/init.py:94 msgid "What is the name of the project?" msgstr "Projenin ismi nedir?" #: src/reuse/init.py:100 msgid "What is the internet address of the project?" msgstr "Projenin İnternet adresi nedir?" #: src/reuse/init.py:106 msgid "What is the name of the maintainer?" msgstr "Bakımcının adı nedir?" #: src/reuse/init.py:112 msgid "What is the e-mail address of the maintainer?" msgstr "Bakımcının e-posta adresi nedir?" #: src/reuse/init.py:118 msgid "All done! Initializing now." msgstr "Tümü bitti! Şimdi ilkleniyor." #: src/reuse/init.py:126 msgid "Downloading {}" msgstr "{} indiriliyor" #: src/reuse/init.py:131 msgid "{} already exists" msgstr "{} zaten mevcut" #: src/reuse/init.py:134 msgid "Could not download {}" msgstr "{} indirilemiyor" #: src/reuse/init.py:139 msgid "Creating .reuse/dep5" msgstr ".reuse/dep5 oluşturuluyor" #: src/reuse/init.py:162 msgid "Initialization complete." msgstr "İlkleme tamamlandı." #: src/reuse/lint.py:55 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:62 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:79 msgid "BAD LICENSES" msgstr "KÖTÜ LİSANSLAR" #: src/reuse/lint.py:83 src/reuse/lint.py:148 msgid "'{}' found in:" msgstr "'{}' şurada mevcut:" #: src/reuse/lint.py:101 msgid "DEPRECATED LICENSES" msgstr "MODASI GEÇMİŞ LİSANSLAR" #: src/reuse/lint.py:103 msgid "The following licenses are deprecated by SPDX:" msgstr "Şu lisanslar artık SPDX tarafından kullanılmıyor:" #: src/reuse/lint.py:121 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "DOSYA UZANTISI OLMAYAN LİSANSLAR" #: src/reuse/lint.py:123 msgid "The following licenses have no file extension:" msgstr "Şu lisansların dosya uzantısı yok:" #: src/reuse/lint.py:143 msgid "MISSING LICENSES" msgstr "EKSİK LİSANSLAR" #: src/reuse/lint.py:166 msgid "UNUSED LICENSES" msgstr "KULLANILMAYAN LİSANSLAR" #: src/reuse/lint.py:168 msgid "The following licenses are not used:" msgstr "Şu lisanslar kullanılmıyor:" #: src/reuse/lint.py:184 msgid "READ ERRORS" msgstr "OKUMA HATALARI" #: src/reuse/lint.py:186 msgid "Could not read:" msgstr "Okunamıyor:" #: src/reuse/lint.py:209 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "EKSİK TELİF HAKKI VE LİSANS BİLGİSİ" #: src/reuse/lint.py:214 msgid "The following files have no copyright and licensing information:" msgstr "Şu dosyalarda telif hakkı ve lisans bilgisi yok:" #: src/reuse/lint.py:223 msgid "The following files have no copyright information:" msgstr "Şu dosyalarda telif hakkı bilgisi yok:" #: src/reuse/lint.py:229 msgid "The following files have no licensing information:" msgstr "Şu dosyalarda lisans bilgisi yok:" #: src/reuse/lint.py:243 msgid "SUMMARY" msgstr "ÖZET" #: src/reuse/lint.py:249 msgid "Bad licenses:" msgstr "Kötü lisanslar:" #: src/reuse/lint.py:258 msgid "Deprecated licenses:" msgstr "Modası geçmiş lisanslar:" #: src/reuse/lint.py:267 msgid "Licenses without file extension:" msgstr "Dosya uzantısı olmayan lisanslar:" #: src/reuse/lint.py:276 msgid "Missing licenses:" msgstr "Eksik lisanslar:" #: src/reuse/lint.py:285 msgid "Unused licenses:" msgstr "Kullanılmayan lisanslar:" #: src/reuse/lint.py:294 msgid "Used licenses:" msgstr "Kullanılan lisanslar:" #: src/reuse/lint.py:303 #, python-brace-format msgid "Read errors: {count}" msgstr "Okuma hataları: {count}" #: src/reuse/lint.py:308 #, python-brace-format msgid "Files with copyright information: {count} / {total}" msgstr "Telif hakkı içeren dosyalar: {count}/{total}" #: src/reuse/lint.py:317 #, python-brace-format msgid "Files with license information: {count} / {total}" msgstr "Lisans bilgisi içeren dosyalar: {count} / {total}" #: src/reuse/project.py:59 msgid "could not find Git" msgstr "Git bulunamadı" #: src/reuse/project.py:133 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' .reuse/dep5 ile kapsanıyor" #: src/reuse/project.py:145 #, 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/project.py:231 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 sözdizim hataları içeriyor" #: src/reuse/project.py:257 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "'{path}' kimliği belirleniyor" #: src/reuse/project.py:265 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} dosya uzantısına sahip değil" #: src/reuse/project.py:275 #, 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 "" "{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:287 #, 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ği" #: src/reuse/report.py:206 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" #: src/reuse/report.py:213 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" #: src/reuse/spdx.py:32 #, python-brace-format msgid "'{path}' does not end with .spdx" msgstr "'{path}' .spdx ile bitmiyor" #: /usr/lib64/python3.5/argparse.py:291 /usr/lib64/python3.6/argparse.py:295 #: /usr/lib64/python3.7/argparse.py:297 /usr/lib64/python3.8/argparse.py:295 msgid "usage: " msgstr "kullanım: " #: /usr/lib64/python3.5/argparse.py:822 /usr/lib64/python3.6/argparse.py:830 #: /usr/lib64/python3.7/argparse.py:845 /usr/lib64/python3.8/argparse.py:846 msgid ".__call__() not defined" msgstr ".__call__() tanımlı değil" #: /usr/lib64/python3.5/argparse.py:1119 /usr/lib64/python3.6/argparse.py:1127 #: /usr/lib64/python3.7/argparse.py:1148 /usr/lib64/python3.8/argparse.py:1149 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "bilinmeyen ayrıştıcı %(parser_name)r (choices: %(choices)s)" #: /usr/lib64/python3.5/argparse.py:1173 /usr/lib64/python3.6/argparse.py:1181 #: /usr/lib64/python3.7/argparse.py:1202 /usr/lib64/python3.8/argparse.py:1209 #, python-format msgid "argument \"-\" with mode %r" msgstr "%r kipine sahip \"-\" argümanı" #: /usr/lib64/python3.5/argparse.py:1181 /usr/lib64/python3.6/argparse.py:1189 #: /usr/lib64/python3.7/argparse.py:1210 #, python-format msgid "can't open '%s': %s" msgstr "'%s' açılamıyor: %s" #: /usr/lib64/python3.5/argparse.py:1385 /usr/lib64/python3.6/argparse.py:1393 #: /usr/lib64/python3.7/argparse.py:1414 /usr/lib64/python3.8/argparse.py:1427 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "eylemler birleştirilemiyor - iki grup %r olarak adlandırılmış" #: /usr/lib64/python3.5/argparse.py:1423 /usr/lib64/python3.6/argparse.py:1431 #: /usr/lib64/python3.7/argparse.py:1452 /usr/lib64/python3.8/argparse.py:1465 msgid "'required' is an invalid argument for positionals" msgstr "'required' konumsal parametre için hatalı bir değişkendir" #: /usr/lib64/python3.5/argparse.py:1445 /usr/lib64/python3.6/argparse.py:1453 #: /usr/lib64/python3.7/argparse.py:1474 /usr/lib64/python3.8/argparse.py:1487 #, 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ı" #: /usr/lib64/python3.5/argparse.py:1465 /usr/lib64/python3.6/argparse.py:1473 #: /usr/lib64/python3.7/argparse.py:1494 /usr/lib64/python3.8/argparse.py:1507 #, python-format msgid "dest= is required for options like %r" msgstr "%r gibi seçenekler için dest= gerekli" #: /usr/lib64/python3.5/argparse.py:1482 /usr/lib64/python3.6/argparse.py:1490 #: /usr/lib64/python3.7/argparse.py:1511 /usr/lib64/python3.8/argparse.py:1524 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "hatalı conflict_resolution değeri: %r" #: /usr/lib64/python3.5/argparse.py:1500 /usr/lib64/python3.6/argparse.py:1508 #: /usr/lib64/python3.7/argparse.py:1529 /usr/lib64/python3.8/argparse.py:1542 #, 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/lib64/python3.5/argparse.py:1566 /usr/lib64/python3.6/argparse.py:1574 #: /usr/lib64/python3.7/argparse.py:1595 /usr/lib64/python3.8/argparse.py:1608 msgid "mutually exclusive arguments must be optional" msgstr "ayrık seçenekler isteğe bağlı olmalı" #: /usr/lib64/python3.5/argparse.py:1629 /usr/lib64/python3.6/argparse.py:1637 #: /usr/lib64/python3.7/argparse.py:1658 /usr/lib64/python3.8/argparse.py:1671 msgid "positional arguments" msgstr "konumsal değişkenler" #: /usr/lib64/python3.5/argparse.py:1630 /usr/lib64/python3.6/argparse.py:1638 #: /usr/lib64/python3.7/argparse.py:1659 /usr/lib64/python3.8/argparse.py:1672 msgid "optional arguments" msgstr "isteğe bağlı değişkenler" #: /usr/lib64/python3.5/argparse.py:1645 /usr/lib64/python3.6/argparse.py:1653 #: /usr/lib64/python3.7/argparse.py:1674 /usr/lib64/python3.8/argparse.py:1687 msgid "show this help message and exit" msgstr "bu yardım mesajını gösterip çık" #: /usr/lib64/python3.5/argparse.py:1676 /usr/lib64/python3.6/argparse.py:1684 #: /usr/lib64/python3.7/argparse.py:1705 /usr/lib64/python3.8/argparse.py:1718 msgid "cannot have multiple subparser arguments" msgstr "birden fazla altayrıştırıcı değişkeni içeremez" #: /usr/lib64/python3.5/argparse.py:1728 /usr/lib64/python3.6/argparse.py:1736 #: /usr/lib64/python3.7/argparse.py:1757 /usr/lib64/python3.7/argparse.py:2263 #: /usr/lib64/python3.8/argparse.py:1770 /usr/lib64/python3.8/argparse.py:2277 #, python-format msgid "unrecognized arguments: %s" msgstr "tanımlanamayan değişkenler: %s" #: /usr/lib64/python3.5/argparse.py:1825 /usr/lib64/python3.6/argparse.py:1833 #: /usr/lib64/python3.7/argparse.py:1854 /usr/lib64/python3.8/argparse.py:1867 #, python-format msgid "not allowed with argument %s" msgstr "%s değişkeniyle izin yok" #: /usr/lib64/python3.5/argparse.py:1871 /usr/lib64/python3.5/argparse.py:1885 #: /usr/lib64/python3.6/argparse.py:1879 /usr/lib64/python3.6/argparse.py:1893 #: /usr/lib64/python3.7/argparse.py:1900 /usr/lib64/python3.7/argparse.py:1914 #: /usr/lib64/python3.8/argparse.py:1913 /usr/lib64/python3.8/argparse.py:1927 #, python-format msgid "ignored explicit argument %r" msgstr "açık %r değişkeni yok sayıldı" #: /usr/lib64/python3.5/argparse.py:1992 /usr/lib64/python3.6/argparse.py:2000 #: /usr/lib64/python3.7/argparse.py:2021 /usr/lib64/python3.8/argparse.py:2034 #, python-format msgid "the following arguments are required: %s" msgstr "şu değişkenler gereklidir: %s" #: /usr/lib64/python3.5/argparse.py:2007 /usr/lib64/python3.6/argparse.py:2015 #: /usr/lib64/python3.7/argparse.py:2036 /usr/lib64/python3.8/argparse.py:2049 #, python-format msgid "one of the arguments %s is required" msgstr "%s değişkenlerinden biri gereklidir" #: /usr/lib64/python3.5/argparse.py:2050 /usr/lib64/python3.6/argparse.py:2058 #: /usr/lib64/python3.7/argparse.py:2079 /usr/lib64/python3.8/argparse.py:2092 msgid "expected one argument" msgstr "bir değişken bekleniyor" #: /usr/lib64/python3.5/argparse.py:2051 /usr/lib64/python3.6/argparse.py:2059 #: /usr/lib64/python3.7/argparse.py:2080 /usr/lib64/python3.8/argparse.py:2093 msgid "expected at most one argument" msgstr "en fazla bir değişken bekleniyor" #: /usr/lib64/python3.5/argparse.py:2052 /usr/lib64/python3.6/argparse.py:2060 #: /usr/lib64/python3.7/argparse.py:2081 /usr/lib64/python3.8/argparse.py:2094 msgid "expected at least one argument" msgstr "en azından bir değişken bekleniyor" #: /usr/lib64/python3.5/argparse.py:2054 /usr/lib64/python3.6/argparse.py:2062 #: /usr/lib64/python3.7/argparse.py:2083 /usr/lib64/python3.8/argparse.py:2098 #, 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" #: /usr/lib64/python3.5/argparse.py:2114 /usr/lib64/python3.6/argparse.py:2122 #: /usr/lib64/python3.7/argparse.py:2143 /usr/lib64/python3.8/argparse.py:2157 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "belirsiz seçenek: %(option)s, %(matches)s ile eşleşebilir" #: /usr/lib64/python3.5/argparse.py:2177 /usr/lib64/python3.6/argparse.py:2185 #: /usr/lib64/python3.7/argparse.py:2206 /usr/lib64/python3.8/argparse.py:2220 #, python-format msgid "unexpected option string: %s" msgstr "beklenmedik seçenek karakter dizisi: %s" #: /usr/lib64/python3.5/argparse.py:2281 /usr/lib64/python3.6/argparse.py:2289 #: /usr/lib64/python3.7/argparse.py:2403 /usr/lib64/python3.8/argparse.py:2417 #, python-format msgid "%r is not callable" msgstr "%r çağrılabilir değil" #: /usr/lib64/python3.5/argparse.py:2298 /usr/lib64/python3.6/argparse.py:2306 #: /usr/lib64/python3.7/argparse.py:2420 /usr/lib64/python3.8/argparse.py:2434 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "hatalı %(type)s değeri: %(value)r" #: /usr/lib64/python3.5/argparse.py:2309 /usr/lib64/python3.6/argparse.py:2317 #: /usr/lib64/python3.7/argparse.py:2431 /usr/lib64/python3.8/argparse.py:2445 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "hatalı tercih: %(value)r (%(choices)s seçilmelidir)" #: /usr/lib64/python3.5/argparse.py:2385 /usr/lib64/python3.6/argparse.py:2393 #: /usr/lib64/python3.7/argparse.py:2507 /usr/lib64/python3.8/argparse.py:2521 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" #: /usr/lib64/python3.8/argparse.py:1218 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' açılamıyor: %(error)s" reuse-tool-0.14.0/pyproject.toml000066400000000000000000000006361416231101000166000ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later [tool.black] line-length = 79 exclude = ''' /( \.git | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist )\ ''' [tool.isort] multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true line_length = 79 reuse-tool-0.14.0/requirements-dev.txt000066400000000000000000000006551416231101000177250ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later -r requirements.txt recommonmark==0.7.1 sphinx==4.2.0 sphinx-autodoc-typehints==1.12.0 sphinx-rtd-theme==1.0.0 sphinxcontrib-apidoc==0.3.0 black==20.8b1 isort==5.9.3 pylint==2.6.0 pytest==6.2.5 pytest-cov==3.0.0 tox==3.24.4 bump2version==1.0.1 pre-commit==2.15.0 twine==3.4.2 wheel==0.37.0 reuse-tool-0.14.0/requirements.txt000066400000000000000000000004451416231101000171460ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later binaryornot==0.4.4 boolean.py==3.8 Jinja2==2.11.3 license-expression==21.6.14 python-debian==0.1.38 requests==2.26.0 setuptools==58.3.0 setuptools-scm==6.3.2 reuse-tool-0.14.0/setup.py000066400000000000000000000115111416231101000153700ustar00rootroot00000000000000#!/usr/bin/env python3 # # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later import glob import platform import shutil import subprocess from distutils import cmd from pathlib import Path from warnings import warn from setuptools import setup from setuptools.command.build_py import build_py requirements = [ # For parsing .reuse/dep5. "python-debian" if platform.system() != "Windows" else "python-debian != 0.1.39", # For downloading from spdx/spdx-license-list-data. Could maybe use # standard library instead? "requests", # For parsing SPDX License Expressions. "license-expression", # Indirect requirement of license-expression, but we require it because we # import its exceptions. "boolean.py", # For templates of headers. "Jinja2", # Exactly what it says. "binaryornot", # For pkg_resources "setuptools", ] test_requirements = ["pytest"] setup_requirements = ["setuptools_scm"] fallback_version = "0.14.0" def readme_md(): """Return contents of README.md""" return open("README.md").read() def changelog_md(): """Return contents of CHANGELOG.md""" return open("CHANGELOG.md").read() class BuildTrans(cmd.Command): """Command for compiling the .mo files.""" user_options = [] def initialize_options(self): self.po_files = None self.msgfmt = None self.build_lib = None self.outputs = [] def finalize_options(self): self.set_undefined_options("build", ("build_lib", "build_lib")) self.po_files = glob.glob("po/*.po") for msgfmt in ["msgfmt", "msgfmt.py", "msgfmt3.py"]: self.msgfmt = shutil.which(msgfmt) if self.msgfmt: break def run(self): if self.msgfmt: for po_file in self.po_files: self.announce(f"compiling {po_file}") lang_dir = str( Path(self.build_lib) / "reuse/locale" / Path(po_file).stem / "LC_MESSAGES" ) destination = str(Path(lang_dir) / "reuse.mo") compile_func = lambda msgfmt, in_file, out: subprocess.run( [msgfmt, in_file, "-o", out] ) self.mkpath(lang_dir) self.make_file( po_file, destination, compile_func, (self.msgfmt, po_file, destination), ) self.outputs.append(destination) else: warn("msgfmt is not installed. Translations will not be included.") def get_outputs(self): return self.outputs class Build(build_py): """Redefined build.""" def run(self): self.run_command("build_trans") super().run() def get_outputs(self): build_trans = self.get_finalized_command("build_trans") return super().get_outputs() + build_trans.get_outputs() if __name__ == "__main__": setup( name="reuse", use_scm_version={"fallback_version": fallback_version}, version=fallback_version, url="https://reuse.software/", project_urls={ "Documentation": "https://reuse.readthedocs.io/", "Source": "https://github.com/fsfe/reuse-tool", }, license="GPL-3.0-or-later AND Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0", author="Carmen Bianca Bakker", author_email="carmenbianca@fsfe.org", description="reuse is a tool for compliance with the REUSE " "recommendations.", long_description=readme_md() + "\n\n" + changelog_md(), long_description_content_type="text/markdown", package_dir={"": "src"}, packages=["reuse"], include_package_data=True, entry_points={"console_scripts": ["reuse = reuse._main:main"]}, install_requires=requirements, tests_require=test_requirements, setup_requires=setup_requirements, python_requires=">=3.6", classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: " "GNU General Public License v3 or later (GPLv3+)", "License :: OSI Approved :: Apache Software License", "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], cmdclass={"build_py": Build, "build_trans": BuildTrans}, ) reuse-tool-0.14.0/src/000077500000000000000000000000001416231101000144465ustar00rootroot00000000000000reuse-tool-0.14.0/src/reuse/000077500000000000000000000000001416231101000155715ustar00rootroot00000000000000reuse-tool-0.14.0/src/reuse/__init__.py000066400000000000000000000040351416231101000177040ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2021 Alliander N.V. # # SPDX-License-Identifier: GPL-3.0-or-later """reuse is a tool for compliance with the REUSE recommendations.""" import gettext import logging import os import re from typing import NamedTuple, Set from boolean.boolean import Expression from pkg_resources import DistributionNotFound, get_distribution try: __version__ = get_distribution(__name__).version except DistributionNotFound: # package is not installed __version__ = "0.14.0" __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" __license__ = "GPL-3.0-or-later" __REUSE_version__ = "3.0" _LOGGER = logging.getLogger(__name__) _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) _IGNORE_DIR_PATTERNS = [ re.compile(r"^\.git$"), re.compile(r"^\.hg$"), re.compile(r"^LICENSES$"), re.compile(r"^\.reuse$"), ] _IGNORE_FILE_PATTERNS = [ re.compile(r"^LICENSE"), re.compile(r"^COPYING"), # ".git" as file happens in submodules re.compile(r"^\.git$"), re.compile(r"^\.gitkeep$"), re.compile(r"^\.hgtags$"), re.compile(r".*\.license$"), re.compile(r".*\.spdx$"), # 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(\..+)?$"), ] #: Simple structure for holding SPDX information. #: #: The two iterables MUST be sets. SpdxInfo = NamedTuple( "SpdxInfo", [("spdx_expressions", Set[Expression]), ("copyright_lines", Set[str])], ) class ReuseException(Exception): """Base exception.""" class IdentifierNotFound(ReuseException): """Could not find SPDX identifier for license file.""" reuse-tool-0.14.0/src/reuse/__main__.py000066400000000000000000000003501416231101000176610ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Entry module for reuse.""" if __name__ == "__main__": from ._main import main main() reuse-tool-0.14.0/src/reuse/_comment.py000066400000000000000000000515151416231101000177530ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Kirill Elagin # SPDX-FileCopyrightText: 2020 Dmitry Bogatov # SPDX-FileCopyrightText: 2021 Alliander N.V. # SPDX-FileCopyrightText: 2021 Alvar Penning # SPDX-FileCopyrightText: 2021 Robin Vobruba # SPDX-FileCopyrightText: 2021 Matija Šuklje # # SPDX-License-Identifier: GPL-3.0-or-later """Module for parsing and creating comments. Just enough to deal with comment headers, in any case. """ import logging import operator from textwrap import dedent from typing import List _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 CommentStyle: """Base class for comment style.""" SINGLE_LINE = "" INDENT_AFTER_SINGLE = "" # (start, middle, end) # e.g., ("/*", "*", "*/") MULTI_LINE = ("", "", "") INDENT_BEFORE_MIDDLE = "" INDENT_AFTER_MIDDLE = "" INDENT_BEFORE_END = "" @classmethod def can_handle_single(cls) -> bool: """Whether the :class:`CommentStyle` can handle single-line comments.""" return bool(cls.SINGLE_LINE) @classmethod def can_handle_multi(cls) -> bool: """Whether the :class:`CommentStyle` can handle multi-line comments.""" return all((cls.MULTI_LINE[0], cls.MULTI_LINE[2])) @classmethod def create_comment(cls, text: str, force_multi: bool = False) -> str: """Comment all lines in *text*. Single-line comments are preferred over multi-line comments, unless *force_multi* is provided. :raises CommentCreateError: if *text* could not be commented. """ text = text.strip("\n") if force_multi or not cls.can_handle_single(): return cls._create_comment_multi(text) return cls._create_comment_single(text) @classmethod def _create_comment_single(cls, text: str) -> str: """Comment all lines in *text*, using single-line comments. :raises CommentCreateError: if *text* could not be commented. """ if not cls.can_handle_single(): raise CommentCreateError( f"{cls} cannot create single-line comments" ) text = text.strip("\n") result = [] for line in text.splitlines(): line_result = cls.SINGLE_LINE if line: line_result += cls.INDENT_AFTER_SINGLE + line result.append(line_result) return "\n".join(result) @classmethod def _create_comment_multi(cls, text: str) -> str: """Comment all lines in *text*, using multi-line comments. :raises CommentCreateError: if *text* could not be commented. """ if not cls.can_handle_multi(): raise CommentCreateError( f"{cls} cannot create multi-line comments" ) text = text.strip("\n") result = [] result.append(cls.MULTI_LINE[0]) for line in text.splitlines(): if cls.MULTI_LINE[2] in text: raise CommentCreateError( f"'{line}' contains a premature comment delimiter" ) line_result = "" if cls.MULTI_LINE[1]: line_result += cls.INDENT_BEFORE_MIDDLE + cls.MULTI_LINE[1] if line: line_result += cls.INDENT_AFTER_MIDDLE + line result.append(line_result) result.append(cls.INDENT_BEFORE_END + cls.MULTI_LINE[2]) return "\n".join(result) @classmethod def parse_comment(cls, text: str) -> str: """Uncomment all lines in *text*. :raises CommentParseError: if *text* could not be parsed. """ text = text.strip("\n") try: return cls._parse_comment_single(text) except CommentParseError: return cls._parse_comment_multi(text) @classmethod def _parse_comment_single(cls, text: str) -> str: """Uncomment all lines in *text*, assuming they are commented by single-line comments. :raises CommentParseError: if *text* could not be parsed. """ if not cls.can_handle_single(): raise CommentParseError(f"{cls} cannot parse single-line comments") text = text.strip("\n") result = [] for line in text.splitlines(): if not line.startswith(cls.SINGLE_LINE): raise CommentParseError( f"'{line}' does not start with a comment marker" ) line = line.lstrip(cls.SINGLE_LINE) result.append(line) result = "\n".join(result) return dedent(result) @classmethod def _parse_comment_multi(cls, text: str) -> str: """Uncomment all lines in *text*, assuming they are commented by multi-line comments. :raises CommentParseError: if *text* could not be parsed. """ if not cls.can_handle_multi(): raise CommentParseError(f"{cls} cannot parse multi-line comments") text = text.strip("\n") result = [] try: first, *lines, last = text.splitlines() last_is_first = False except ValueError: first = text lines = [] last = None # Set this later. last_is_first = True if not first.startswith(cls.MULTI_LINE[0]): raise CommentParseError( f"'{first}' does not start with a comment marker" ) first = first.lstrip(cls.MULTI_LINE[0]) first = first.strip() for line in lines: if cls.MULTI_LINE[1]: possible_line = line.lstrip(cls.INDENT_BEFORE_MIDDLE) prefix = cls.MULTI_LINE[1] if possible_line.startswith(prefix): line = possible_line.lstrip(prefix) else: _LOGGER.debug( "'%s' does not contain a middle comment marker", line ) result.append(line) if last_is_first: last = first first = "" if not last.endswith(cls.MULTI_LINE[2]): raise CommentParseError( f"'{last}' does not end with a comment delimiter" ) last = last.rstrip(cls.MULTI_LINE[2]) last = last.rstrip(cls.INDENT_BEFORE_END) last = last.strip() if cls.MULTI_LINE[1] and last.startswith(cls.MULTI_LINE[1]): last = last.lstrip(cls.MULTI_LINE[1]) last = last.lstrip() result = "\n".join(result) result = dedent(result) if result: result = "\n".join((first, result, last)) else: result = "\n".join((first, last)) result = result.strip("\n") return result @classmethod def comment_at_first_character(cls, text: str) -> str: """Return the comment block that starts at the first character of *text*. This is chiefly handy to get the header comment of a file, assuming that the header comment starts at the first character in the file. :raises CommentParseError: if *text* does not start with a parseable comment block. """ if not any((cls.can_handle_single(), cls.can_handle_multi())): raise CommentParseError(f"{cls} cannot parse comments") lines = text.splitlines() if cls.can_handle_single() and text.startswith(cls.SINGLE_LINE): end = 0 for i, line in enumerate(lines): if not line.startswith(cls.SINGLE_LINE): break end = i return "\n".join(lines[0 : end + 1]) if cls.can_handle_multi() and text.startswith(cls.MULTI_LINE[0]): end = 0 for i, line in enumerate(lines): end = i if line.endswith(cls.MULTI_LINE[2]): break else: raise CommentParseError("Comment block never delimits") return "\n".join(lines[0 : end + 1]) raise CommentParseError( "Could not find a parseable comment block at the first character" ) class AppleScriptCommentStyle(CommentStyle): """AppleScript comment style.""" _shorthand = "applescript" SINGLE_LINE = "--" INDENT_AFTER_SINGLE = " " MULTI_LINE = ("(*", "", "*)") class AspxCommentStyle(CommentStyle): """ASPX comment style.""" _shorthand = "aspx" MULTI_LINE = ("<%--", "", "--%>") class BatchFileCommentStyle(CommentStyle): """Windows batch file comment style.""" _shorthand = "bat" SINGLE_LINE = "REM" INDENT_AFTER_SINGLE = " " class BibTexCommentStyle(CommentStyle): """BibTex comment style.""" _shorthand = "bibtex" MULTI_LINE = ("@Comment{", "", "}") class CCommentStyle(CommentStyle): """C comment style.""" _shorthand = "c" SINGLE_LINE = "//" INDENT_AFTER_SINGLE = " " MULTI_LINE = ("/*", "*", "*/") INDENT_BEFORE_MIDDLE = " " INDENT_AFTER_MIDDLE = " " INDENT_BEFORE_END = " " class CssCommentStyle(CommentStyle): """CSS comment style.""" _shorthand = "css" MULTI_LINE = ("/*", "*", "*/") INDENT_BEFORE_MIDDLE = " " INDENT_AFTER_MIDDLE = " " INDENT_BEFORE_END = " " class EmptyCommentStyle(CommentStyle): """Hacky comment style for files that have no comments.""" @classmethod def create_comment(cls, text: str, force_multi: bool = False) -> str: return text.strip("\n") @classmethod def parse_comment(cls, text: str) -> str: return text.strip("\n") @classmethod def comment_at_first_character(cls, text: str) -> str: return text class FortranCommentStyle(CommentStyle): """Fortran comment style.""" _shorthand = "f" SINGLE_LINE = "c" INDENT_AFTER_SINGLE = " " class FtlCommentStyle(CommentStyle): """FreeMarker Template Language comment style.""" _shorthand = "ftl" MULTI_LINE = ("<#--", "", "-->") class HandlebarsCommentStyle(CommentStyle): """Handlebars comment style.""" _shorthand = "handlebars" MULTI_LINE = ("{{!--", "", "--}}") class HaskellCommentStyle(CommentStyle): """Haskell comment style.""" _shorthand = "haskell" SINGLE_LINE = "--" INDENT_AFTER_SINGLE = " " class HtmlCommentStyle(CommentStyle): """HTML comment style.""" _shorthand = "html" MULTI_LINE = ("") class JinjaCommentStyle(CommentStyle): """Jinja2 comment style.""" _shorthand = "jinja" MULTI_LINE = ("{#", "", "#}") class JsxCommentStyle(CommentStyle): """JSX comment style.""" _shorthand = "jsx" MULTI_LINE = ("{/*", "", "*/}") class LispCommentStyle(CommentStyle): """Lisp comment style.""" _shorthand = "lisp" SINGLE_LINE = ";" INDENT_AFTER_SINGLE = " " class M4CommentStyle(CommentStyle): """M4 (autoconf) comment style.""" _shorthand = "m4" SINGLE_LINE = "dnl" INDENT_AFTER_SINGLE = " " class MlCommentStyle(CommentStyle): """ML comment style.""" _shorthand = "ml" MULTI_LINE = ("(*", "*", "*)") INDENT_BEFORE_MIDDLE = " " INDENT_AFTER_MIDDLE = " " INDENT_BEFORE_END = " " class PlantUmlCommentStyle(CommentStyle): """PlantUML comment style.""" _shorthand = "plantuml" SINGLE_LINE = "'" INDENT_AFTER_SINGLE = " " MULTI_LINE = ("/'", "'", "'/") INDENT_BEFORE_MIDDLE = " " INDENT_AFTER_MIDDLE = " " INDENT_BEFORE_END = " " class PythonCommentStyle(CommentStyle): """Python comment style.""" _shorthand = "python" SINGLE_LINE = "#" INDENT_AFTER_SINGLE = " " class ReStructedTextCommentStyle(CommentStyle): """reStructuredText comment style.""" _shorthand = "rst" SINGLE_LINE = ".." INDENT_AFTER_SINGLE = " " class TexCommentStyle(CommentStyle): """TeX comment style.""" _shorthand = "tex" SINGLE_LINE = "%" INDENT_AFTER_SINGLE = " " class UncommentableCommentStyle(EmptyCommentStyle): """A pseudo comment style to indicate that this file is uncommentable. This results in an external .license file as for binaries or --explicit-license. """ #: A map of (common) file extensions against comment types. EXTENSION_COMMENT_STYLE_MAP = { ".adb": HaskellCommentStyle, ".adoc": CCommentStyle, ".ads": HaskellCommentStyle, ".ahk": LispCommentStyle, ".ahkl": LispCommentStyle, ".applescript": AppleScriptCommentStyle, ".asax": AspxCommentStyle, ".asc": CCommentStyle, ".asciidoc": CCommentStyle, ".ashx": AspxCommentStyle, ".asmx": AspxCommentStyle, ".aspx": AspxCommentStyle, ".aux": TexCommentStyle, ".awk": PythonCommentStyle, ".axd": AspxCommentStyle, ".bash": PythonCommentStyle, ".bat": BatchFileCommentStyle, ".bb": PythonCommentStyle, ".bbappend": PythonCommentStyle, ".bbclass": PythonCommentStyle, ".bib": BibTexCommentStyle, ".c": CCommentStyle, ".cc": CCommentStyle, ".cl": LispCommentStyle, ".clj": LispCommentStyle, ".cljc": LispCommentStyle, ".cljs": LispCommentStyle, ".cmake": PythonCommentStyle, # TODO: Bracket comments not supported. ".coffee": PythonCommentStyle, ".cpp": CCommentStyle, ".cs": CCommentStyle, ".csl": HtmlCommentStyle, # Bibliography (XML based) ".css": CssCommentStyle, ".csv": UncommentableCommentStyle, ".d": CCommentStyle, ".dart": CCommentStyle, ".di": CCommentStyle, ".doc": UncommentableCommentStyle, ".docx": UncommentableCommentStyle, ".dotx": UncommentableCommentStyle, ".dts": CCommentStyle, ".dtsi": CCommentStyle, ".el": LispCommentStyle, ".erl": TexCommentStyle, ".ex": PythonCommentStyle, ".exs": PythonCommentStyle, ".f": FortranCommentStyle, ".f03": FortranCommentStyle, ".f90": FortranCommentStyle, ".f95": FortranCommentStyle, ".fish": PythonCommentStyle, ".fodp": UncommentableCommentStyle, ".fods": UncommentableCommentStyle, ".fodt": UncommentableCommentStyle, ".for": FortranCommentStyle, ".fs": CCommentStyle, ".ftl": FtlCommentStyle, ".gemspec": PythonCommentStyle, ".go": CCommentStyle, ".gradle": CCommentStyle, ".graphql": PythonCommentStyle, ".groovy": CCommentStyle, ".h": CCommentStyle, ".hh": CCommentStyle, ".hbs": HandlebarsCommentStyle, ".hpp": CCommentStyle, ".hrl": TexCommentStyle, ".hs": HaskellCommentStyle, ".html": HtmlCommentStyle, ".hx": CCommentStyle, ".hxsl": CCommentStyle, ".ini": LispCommentStyle, ".ino": CCommentStyle, ".ipynb": UncommentableCommentStyle, ".iuml": PlantUmlCommentStyle, ".java": CCommentStyle, ".jinja": JinjaCommentStyle, ".jinja2": JinjaCommentStyle, ".js": CCommentStyle, ".json": UncommentableCommentStyle, ".jsx": JsxCommentStyle, ".jy": PythonCommentStyle, ".ksh": PythonCommentStyle, ".kt": CCommentStyle, ".l": LispCommentStyle, ".latex": TexCommentStyle, ".license": EmptyCommentStyle, ".lisp": LispCommentStyle, ".lsp": LispCommentStyle, ".lua": HaskellCommentStyle, ".m4": M4CommentStyle, ".markdown": HtmlCommentStyle, ".md": HtmlCommentStyle, ".mjs": CCommentStyle, ".mk": PythonCommentStyle, ".ml": MlCommentStyle, ".mli": MlCommentStyle, ".nim.cfg": PythonCommentStyle, # Nim-lang build config parameters/settings ".nim": PythonCommentStyle, ".nimble": PythonCommentStyle, # Nim-lang build config ".nimrod": PythonCommentStyle, ".nix": PythonCommentStyle, ".odb": UncommentableCommentStyle, ".odf": UncommentableCommentStyle, ".odg": UncommentableCommentStyle, ".odm": UncommentableCommentStyle, ".odp": UncommentableCommentStyle, ".ods": UncommentableCommentStyle, ".odt": UncommentableCommentStyle, ".org": PythonCommentStyle, ".otp": UncommentableCommentStyle, ".ots": UncommentableCommentStyle, ".ott": UncommentableCommentStyle, ".pdf": UncommentableCommentStyle, ".php": CCommentStyle, ".php3": CCommentStyle, ".php4": CCommentStyle, ".php5": CCommentStyle, ".pl": PythonCommentStyle, ".plantuml": PlantUmlCommentStyle, ".po": PythonCommentStyle, ".pod": PythonCommentStyle, ".pot": PythonCommentStyle, ".ppt": UncommentableCommentStyle, ".pptx": UncommentableCommentStyle, ".proto": CCommentStyle, ".ps1": PythonCommentStyle, # TODO: Multiline comments ".psm1": PythonCommentStyle, # TODO: Multiline comments ".pu": PlantUmlCommentStyle, ".puml": PlantUmlCommentStyle, ".pxd": PythonCommentStyle, ".py": PythonCommentStyle, ".pyi": PythonCommentStyle, ".pyw": PythonCommentStyle, ".pyx": PythonCommentStyle, ".qbs": CCommentStyle, ".qml": CCommentStyle, ".R": PythonCommentStyle, ".rake": PythonCommentStyle, ".rb": PythonCommentStyle, ".rbw": PythonCommentStyle, ".rbx": PythonCommentStyle, ".rkt": LispCommentStyle, ".Rmd": HtmlCommentStyle, ".rs": CCommentStyle, ".rss": HtmlCommentStyle, ".rst": ReStructedTextCommentStyle, ".sass": CssCommentStyle, ".sc": CCommentStyle, # SuperCollider source file ".scad": CCommentStyle, ".scala": PythonCommentStyle, ".scm": LispCommentStyle, ".scpt": AppleScriptCommentStyle, ".scptd": AppleScriptCommentStyle, ".scss": CssCommentStyle, ".scsyndef": UncommentableCommentStyle, # SuperCollider synth definition (binary) ".sh": PythonCommentStyle, ".sml": MlCommentStyle, ".soy": CCommentStyle, ".sql": HaskellCommentStyle, ".sty": TexCommentStyle, ".svg": UncommentableCommentStyle, ".swift": CCommentStyle, ".tex": TexCommentStyle, ".thy": MlCommentStyle, ".toc": TexCommentStyle, ".toml": PythonCommentStyle, ".ts": CCommentStyle, ".tsx": JsxCommentStyle, ".ttl": PythonCommentStyle, # Turtle/RDF ".v": CCommentStyle, # V-Lang source code ".vala": CCommentStyle, ".vsh": CCommentStyle, # V-Lang script ".vue": HtmlCommentStyle, ".xls": UncommentableCommentStyle, ".xlsx": UncommentableCommentStyle, ".xml": HtmlCommentStyle, ".xsd": HtmlCommentStyle, ".xsh": PythonCommentStyle, ".xsl": HtmlCommentStyle, ".yaml": PythonCommentStyle, ".yml": PythonCommentStyle, ".zsh": PythonCommentStyle, } EXTENSION_COMMENT_STYLE_MAP_LOWERCASE = { k.lower(): v for k, v in EXTENSION_COMMENT_STYLE_MAP.items() } FILENAME_COMMENT_STYLE_MAP = { ".bashrc": PythonCommentStyle, ".coveragerc": PythonCommentStyle, ".dockerignore": PythonCommentStyle, ".editorconfig": PythonCommentStyle, ".eslintignore": PythonCommentStyle, ".eslintrc": UncommentableCommentStyle, ".gitattributes": PythonCommentStyle, ".gitignore": PythonCommentStyle, ".gitmodules": PythonCommentStyle, ".mailmap": PythonCommentStyle, ".mdlrc": PythonCommentStyle, # Markdown-linter config ".npmignore": PythonCommentStyle, ".pylintrc": PythonCommentStyle, ".Renviron": PythonCommentStyle, ".Rprofile": PythonCommentStyle, ".yarnrc": PythonCommentStyle, "archive.sctxar": UncommentableCommentStyle, # SuperCollider global archive "CMakeLists.txt": PythonCommentStyle, "configure.ac": M4CommentStyle, "Containerfile": PythonCommentStyle, "Dockerfile": PythonCommentStyle, "Doxyfile": PythonCommentStyle, "Gemfile": PythonCommentStyle, "go.mod": CCommentStyle, "go.sum": UncommentableCommentStyle, "gradle-wrapper.properties": PythonCommentStyle, "gradlew": PythonCommentStyle, "Jenkinsfile": CCommentStyle, "Makefile.am": PythonCommentStyle, "Makefile": PythonCommentStyle, "MANIFEST.in": PythonCommentStyle, "manifest": PythonCommentStyle, # used by cdist "meson.build": PythonCommentStyle, "meson_options.txt": PythonCommentStyle, "Rakefile": PythonCommentStyle, "requirements.txt": PythonCommentStyle, "ROOT": MlCommentStyle, "setup.cfg": PythonCommentStyle, "sonar-project.properties": PythonCommentStyle, "yarn.lock": UncommentableCommentStyle, } FILENAME_COMMENT_STYLE_MAP_LOWERCASE = { k.lower(): v for k, v in FILENAME_COMMENT_STYLE_MAP.items() } def _all_style_classes() -> List[CommentStyle]: """Return a list of all defined style classes, excluding the base class.""" result = [] for key, value in globals().items(): if key.endswith("CommentStyle") and key != "CommentStyle": result.append(value) return sorted(result, key=operator.attrgetter("__name__")) # pylint: disable=invalid-name,protected-access _result = _all_style_classes() _result.remove(EmptyCommentStyle) _result.remove(UncommentableCommentStyle) #: A map of human-friendly names against style classes. NAME_STYLE_MAP = {style._shorthand: style for style in _result} reuse-tool-0.14.0/src/reuse/_format.py000066400000000000000000000023501416231101000175720ustar00rootroot00000000000000# 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 WIDTH = 78 INDENT = 2 def fill_paragraph(text, width=WIDTH, indent_width=0): """Wrap a single paragraph.""" return indent( fill(text.strip(), width=width - indent_width), indent_width * " " ) def fill_all(text, width=WIDTH, indent_width=0): """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): """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 reuse-tool-0.14.0/src/reuse/_licenses.py000066400000000000000000000037241416231101000201150ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2014 Ahmed H. Ismail # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: GPL-3.0-or-later # # load_license_list was copied and altered from its original location # at . """A list with all SPDX licenses.""" import json import os _BASE_DIR = os.path.dirname(__file__) _RESOURCES_DIR = os.path.join(_BASE_DIR, "resources") _LICENSES = os.path.join(_RESOURCES_DIR, "licenses.json") _EXCEPTIONS = os.path.join(_RESOURCES_DIR, "exceptions.json") def _load_license_list(file_name): """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 """ licenses_map = {} with open(file_name, "r") as lics: licenses = json.load(lics) version = licenses["licenseListVersion"].split(".") for lic in licenses["licenses"]: identifier = lic["licenseId"] licenses_map[identifier] = lic return version, licenses_map def _load_exception_list(file_name): """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 """ exceptions_map = {} with open(file_name, "r") as excs: exceptions = json.load(excs) version = exceptions["licenseListVersion"].split(".") for exc in exceptions["exceptions"]: identifier = exc["licenseExceptionId"] exceptions_map[identifier] = exc return version, exceptions_map _, LICENSE_MAP = _load_license_list(_LICENSES) _, EXCEPTION_MAP = _load_exception_list(_EXCEPTIONS) ALL_MAP = {**LICENSE_MAP, **EXCEPTION_MAP} ALL_NON_DEPRECATED_MAP = { identifier: contents.copy() for identifier, contents in ALL_MAP.items() if not contents["isDeprecatedLicenseId"] } reuse-tool-0.14.0/src/reuse/_main.py000066400000000000000000000205541416231101000172340ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Entry functions for reuse.""" import argparse import logging import sys from gettext import gettext as _ from typing import List from . import ( __REUSE_version__, __version__, download, header, init, lint, spdx, supported_licenses, ) from ._format import INDENT, fill_all, fill_paragraph from ._util import PathType, setup_logging from .project import Project, create_project _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( "--include-submodules", action="store_true", help=_("do not skip over Git submodules"), ) 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"), ) 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, "addheader", header.add_arguments, header.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" "The comment style should be auto-detected for your files. If" " a comment style could not be detected and --skip-unrecognised" " is not specified, the process aborts. Use --style to specify" " or override the comment style to use.\n" "\n" "A single-line comment style is used when it is available. If" " no single-line comment style is available, a multi-line" " comment style is used. You can force a certain comment style" " using --single-line or --multi-line.\n" "\n" "You can change the template of the header comment by using" " --template. Place a Jinja2 template in" " .reuse/templates/mytemplate.jinja2. You can use the template" " by specifying" " '--template mytemplate'. Read the online documentation on" " how to use this feature.\n" "\n" "If a binary file is detected, or if --explicit-license is" " specified, the header is placed in a .license file.\n" # TODO: Remove this "\n" "IMPORTANT: This is currently EXPERIMENTAL!" ) ), ) 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.\n" "\n" "The LICENSES/ directory is automatically found in the" " following order:\n" "\n" "- The LICENSES/ directory in the root of the VCS" " repository.\n" "\n" "- The current directory if its name is LICENSES.\n" "\n" "- The LICENSES/ directory in the current directory.\n" "\n" "If the LICENSES/ directory cannot be found, one is simply" " created." ) ), ) add_command( subparsers, "init", init.add_arguments, init.run, help=_("initialize REUSE project"), ) 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 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" "- Do all files have valid copyright and licensing" " information?" ).format(reuse_version=__REUSE_version__) ), ) add_command( subparsers, "spdx", spdx.add_arguments, spdx.run, help=_("print the project's bill of materials in SPDX format"), ) add_command( subparsers, "supported-licenses", supported_licenses.add_arguments, supported_licenses.run, help=_("list all supported SPDX licenses"), aliases=["supported-licences"], ) return parser def add_command( # pylint: disable=too-many-arguments subparsers, name: str, add_arguments_func, run_func, formatter_class=None, description: str = None, help: str = None, aliases: list = 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: List[str] = None, out=sys.stdout) -> int: """Main entry function.""" if args is None: args = 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 ) if parsed_args.version: out.write(f"reuse {__version__}\n") return 0 if parsed_args.root: project = Project(parsed_args.root) else: project = create_project() project.include_submodules = parsed_args.include_submodules return parsed_args.func(parsed_args, project, out) if __name__ == "__main__": main() reuse-tool-0.14.0/src/reuse/_util.py000066400000000000000000000261651416231101000172710ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2020 Tuomas Siipola # # SPDX-License-Identifier: GPL-3.0-or-later """Misc. utilities for reuse.""" # pylint: disable=ungrouped-imports import logging import os import re import shutil import subprocess import sys from argparse import ArgumentTypeError from difflib import SequenceMatcher from gettext import gettext as _ from hashlib import sha1 from os import PathLike from pathlib import Path from typing import BinaryIO, List, Optional from boolean.boolean import Expression, ParseError from debian.copyright import Copyright from license_expression import ExpressionError, Licensing from . import SpdxInfo from ._comment import _all_style_classes from ._licenses import ALL_NON_DEPRECATED_MAP GIT_EXE = shutil.which("git") HG_EXE = shutil.which("hg") _LOGGER = logging.getLogger(__name__) _LICENSING = Licensing() _END_PATTERN = "{}$".format( "".join( { "(?:{})*".format(re.escape(style.MULTI_LINE[2])) for style in _all_style_classes() if style.MULTI_LINE[2] } ) ) _IDENTIFIER_PATTERN = re.compile( r"SPDX" "-License-Identifier:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE ) _COPYRIGHT_PATTERNS = [ re.compile(r"(SPDX" "-FileCopyrightText:[ \t]+.*?)" + _END_PATTERN), re.compile(r"(Copyright .*?)" + _END_PATTERN), re.compile(r"(© .*?)" + _END_PATTERN), ] _COPYRIGHT_STYLES = { "spdx": "SPDX-FileCopyrightText:", "spdx-symbol": "SPDX-FileCopyrightText: ©", "string": "Copyright", "string-c": "Copyright (C)", "string-symbol": "Copyright ©", "symbol": "©", } # 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. You can only call this function once. """ # library_logger is the root logger for reuse. We configure logging solely # for reuse, not for any other libraries. library_logger = logging.getLogger("reuse") if not library_logger.hasHandlers(): library_logger.setLevel(level) handler = logging.StreamHandler() formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) library_logger.addHandler(handler) def execute_command( command: List[str], logger: logging.Logger, cwd: PathLike = None, **kwargs ) -> subprocess.CompletedProcess: """Run the given command with subprocess.run. Forward kwargs. Silence output into a pipe unless kwargs override it. """ logger.debug("running '%s'", " ".join(command)) stdout = kwargs.get("stdout", subprocess.PIPE) stderr = kwargs.get("stderr", subprocess.PIPE) return subprocess.run( map(str, command), stdout=stdout, stderr=stderr, check=False, cwd=str(cwd), **kwargs, ) def find_licenses_directory(root: PathLike) -> Optional[Path]: """Find the licenses directory from CWD or *root*. In the following order: - LICENSES/ in *root*. - Current directory if its name is "LICENSES" - LICENSES/ in CWD. The returned LICENSES/ directory NEED NOT EXIST. It may still need to be created. """ cwd = Path.cwd() licenses_path = cwd / "LICENSES" if root: licenses_path = root / "LICENSES" elif cwd.name == "LICENSES": licenses_path = cwd return licenses_path def decoded_text_from_binary(binary_file: BinaryIO, size: 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. """ rawdata = binary_file.read(size) result = rawdata.decode("utf-8", errors="replace") return result.replace("\r\n", "\n") def _determine_license_path(path: PathLike) -> Path: """Given a path FILE, return FILE.license if it exists, otherwise return FILE. """ license_path = Path(f"{path}.license") if not license_path.exists(): license_path = Path(path) return license_path def _determine_license_suffix_path(path: PathLike) -> Path: """Given a path FILE or FILE.license, return FILE.license.""" path = Path(path) if path.suffix == ".license": return path return Path(f"{path}.license") def _copyright_from_dep5(path: PathLike, copyright: Copyright) -> SpdxInfo: """Find the reuse information of *path* in the dep5 Copyright object.""" result = copyright.find_files_paragraph(Path(path).as_posix()) if result is None: return SpdxInfo(set(), set()) return SpdxInfo( set(map(_LICENSING.parse, [result.license.synopsis])), set(map(str.strip, result.copyright.splitlines())), ) def extract_spdx_info(text: str) -> SpdxInfo: """Extract SPDX information from comments in a string. :raises ExpressionError: if an SPDX expression could not be parsed :raises ParseError: if an SPDX expression could not be parsed """ expression_matches = set(map(str.strip, _IDENTIFIER_PATTERN.findall(text))) expressions = set() copyright_matches = set() for expression in expression_matches: 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.groups()[0]) break return SpdxInfo(expressions, copyright_matches) def contains_spdx_info(text: str) -> bool: """The text contains SPDX info.""" try: return any(extract_spdx_info(text)) except (ExpressionError, ParseError): return False def make_copyright_line( statement: str, year: str = None, copyright_style: 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}'") copyright_prefix = _COPYRIGHT_STYLES.get(copyright_style) if copyright_prefix is None: raise RuntimeError( "Unexpected copyright syle: Need 'spdx', '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"{copyright_prefix} {year} {statement}" return f"{copyright_prefix} {statement}" def _checksum(path: PathLike) -> str: path = Path(path) file_sha1 = sha1() with path.open("rb") as fp: for chunk in iter(lambda: fp.read(128 * file_sha1.block_size), b""): file_sha1.update(chunk) return file_sha1.hexdigest() class PathType: # pylint: disable=too-few-public-methods """Factory for creating Paths""" def __init__(self, mode="r", force_file=False, force_directory=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): 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): # pylint: disable=no-self-use 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): 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 = [] 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=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("* {}\n".format(suggestion)) out.write("\n") out.write( _( "See for a list of valid " "SPDX License Identifiers." ) ) 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-tool-0.14.0/src/reuse/download.py000066400000000000000000000116321416231101000177550ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for downloading license files from spdx/license-data-list.""" import errno import logging import sys from gettext import gettext as _ from os import PathLike from pathlib import Path from urllib.parse import urljoin import requests from ._licenses import ALL_NON_DEPRECATED_MAP from ._util import ( PathType, find_licenses_directory, print_incorrect_spdx_identifier, ) from .project import Project from .report import ProjectReport _LOGGER = logging.getLogger(__name__) # All raw text files are available as files underneath this path. _SPDX_REPOSITORY_BASE_URL = ( "https://raw.githubusercontent.com/spdx/license-list-data/master/text/" ) def download_license(spdx_identifier: str) -> str: """Download the license text from the SPDX repository. :param spdx_identifier: SPDX identifier of the license. :raises requests.RequestException: if the license could not be downloaded. :return: The license text. """ # This is fairly naive, but I can't see anything wrong with it. url = urljoin( _SPDX_REPOSITORY_BASE_URL, "".join((spdx_identifier, ".txt")) ) # TODO: Cache result? response = requests.get(url) if response.status_code == 200: return response.text raise requests.RequestException("Status code was not 200") def _path_to_license_file(spdx_identifier: str, root: PathLike) -> Path: licenses_path = find_licenses_directory(root=root) return licenses_path / "".join((spdx_identifier, ".txt")) def put_license_in_file(spdx_identifier: str, destination: PathLike) -> None: """Download a license and put it in the destination file. This function exists solely for convenience. :param spdx_identifier: SPDX License Identifier of the license. :param destination: Where to put the license. :raises requests.RequestException: if the license could not be downloaded. :raises FileExistsError: if the license file already exists. """ header = "" destination = Path(destination) destination.parent.mkdir(exist_ok=True) if destination.exists(): raise FileExistsError(errno.EEXIST, "File exists", str(destination)) text = download_license(spdx_identifier) with destination.open("w") as fp: fp.write(header) fp.write(text) def add_arguments(parser) -> 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") ) def run(args, project: Project, out=sys.stdout) -> int: """Download license and place it in the LICENSES/ directory.""" def _already_exists(path: PathLike): out.write( _("Error: {spdx_identifier} already exists.").format( spdx_identifier=path ) ) out.write("\n") def _could_not_download(identifier: str): 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: PathLike): out.write( _("Successfully downloaded {spdx_identifier}.").format( spdx_identifier=destination ) ) out.write("\n") 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")) else: licenses = args.license return_code = 0 for lic in licenses: if args.file: destination = args.file else: destination = _path_to_license_file(lic, project.root) try: put_license_in_file(lic, destination=destination) except requests.RequestException: _could_not_download(lic) return_code = 1 except FileExistsError as err: _already_exists(err.filename) return_code = 1 else: _successfully_downloaded(destination) return return_code reuse-tool-0.14.0/src/reuse/header.py000066400000000000000000000462061416231101000174030ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Stefan Bakker # SPDX-FileCopyrightText: 2019 Kirill Elagin # SPDX-FileCopyrightText: 2020 Dmitry Bogatov # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2021 Alvar Penning # SPDX-FileCopyrightText: 2021 Alliander N.V. # SPDX-FileCopyrightText: 2021 Robin Vobruba # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for manipulating the comment headers of files.""" # pylint: disable=too-many-arguments import datetime import logging import os import re import sys from argparse import ArgumentParser from gettext import gettext as _ from os import PathLike from pathlib import Path from typing import Iterable, List, NamedTuple, Optional, Sequence from binaryornot.check import is_binary from boolean.boolean import ParseError from jinja2 import Environment, FileSystemLoader, PackageLoader, Template from jinja2.exceptions import TemplateNotFound from license_expression import ExpressionError from . import SpdxInfo from ._comment import ( EXTENSION_COMMENT_STYLE_MAP_LOWERCASE, FILENAME_COMMENT_STYLE_MAP_LOWERCASE, NAME_STYLE_MAP, CommentCreateError, CommentParseError, CommentStyle, EmptyCommentStyle, HtmlCommentStyle, PythonCommentStyle, UncommentableCommentStyle, ) from ._util import ( _COPYRIGHT_STYLES, PathType, _determine_license_path, _determine_license_suffix_path, contains_spdx_info, detect_line_endings, extract_spdx_info, make_copyright_line, spdx_identifier, ) from .project import Project _LOGGER = logging.getLogger(__name__) _ENV = Environment( loader=PackageLoader("reuse", "templates"), trim_blocks=True ) DEFAULT_TEMPLATE = _ENV.get_template("default_template.jinja2") _NEWLINE_PATTERN = re.compile(r"\n", re.MULTILINE) class _TextSections(NamedTuple): # pylint: disable=too-few-public-methods """Used to split up text in three parts.""" before: str middle: str after: str class MissingSpdxInfo(Exception): """Some SPDX information is missing from the result.""" # TODO: Add a template here maybe. def _create_new_header( spdx_info: SpdxInfo, template: Template = None, template_is_commented: bool = False, style: CommentStyle = None, force_multi: bool = False, ) -> str: """Format a new header from scratch. :raises CommentCreateError: if a comment could not be created. :raises MissingSpdxInfo: if the generated comment is missing SPDX information. """ if template is None: template = DEFAULT_TEMPLATE if style is None: style = PythonCommentStyle rendered = template.render( copyright_lines=sorted(spdx_info.copyright_lines), spdx_expressions=sorted(map(str, spdx_info.spdx_expressions)), ) if template_is_commented: result = rendered.strip("\n") else: result = style.create_comment(rendered, force_multi=force_multi).strip( "\n" ) # Verify that the result contains all SpdxInfo. new_spdx_info = extract_spdx_info(result) if ( spdx_info.copyright_lines != new_spdx_info.copyright_lines and spdx_info.spdx_expressions != new_spdx_info.spdx_expressions ): _LOGGER.debug( _( "generated comment is missing copyright lines or license" " expressions" ) ) _LOGGER.debug(result) raise MissingSpdxInfo() return result def create_header( spdx_info: SpdxInfo, header: str = None, template: Template = None, template_is_commented: bool = False, style: CommentStyle = None, force_multi: bool = False, ) -> str: """Create a header containing *spdx_info*. *header* is an optional argument containing a header which should be modified to include *spdx_info*. If *header* is not given, a brand new header is created. *template*, *template_is_commented*, and *style* determine what the header will look like, and whether it will be commented or not. :raises CommentCreateError: if a comment could not be created. :raises MissingSpdxInfo: if the generated comment is missing SPDX information. """ if template is None: template = DEFAULT_TEMPLATE if style is None: style = PythonCommentStyle new_header = "" if header: try: existing_spdx = extract_spdx_info(header) except (ExpressionError, ParseError) as err: raise CommentCreateError( "existing header contains an erroneous SPDX expression" ) from err # TODO: This behaviour does not match the docstring. spdx_info = SpdxInfo( spdx_info.spdx_expressions.union(existing_spdx.spdx_expressions), spdx_info.copyright_lines.union(existing_spdx.copyright_lines), ) new_header += _create_new_header( spdx_info, template=template, template_is_commented=template_is_commented, style=style, force_multi=force_multi, ) return new_header + "\n" def _indices_of_newlines(text: str) -> Sequence[int]: indices = [0] start = 0 while True: match = _NEWLINE_PATTERN.search(text, start) if match: start = match.span()[1] indices.append(start) else: break return indices def _find_first_spdx_comment( text: str, style: CommentStyle = None ) -> _TextSections: """Find the first SPDX comment in the file. Return a tuple with everything preceding the comment, the comment itself, and everything following it. :raises MissingSpdxInfo: if no SPDX info can be found in any comment """ if style is None: style = PythonCommentStyle indices = _indices_of_newlines(text) for index in indices: try: comment = style.comment_at_first_character(text[index:]) except CommentParseError: continue if contains_spdx_info(comment): return _TextSections( text[:index], comment + "\n", text[index + len(comment) + 1 :] ) raise MissingSpdxInfo() def find_and_replace_header( text: str, spdx_info: SpdxInfo, template: Template = None, template_is_commented: bool = False, style: CommentStyle = None, force_multi: bool = False, ) -> str: """Find the first SPDX comment block in *text*. That comment block is replaced by a new comment block containing *spdx_info*. It is formatted as according to *template*. The template is normally uncommented, but if it is already commented, *template_is_commented* should be :const:`True`. If both *style* and *template_is_commented* are provided, *style* is only used to find the header comment. If the comment block already contained some SPDX information, that information is merged into *spdx_info*. If no header exists, one is simply created. *text* is returned with a new header. :raises CommentCreateError: if a comment could not be created. :raises MissingSpdxInfo: if the generated comment is missing SPDX information. """ # pylint: disable=too-many-branches if style is None: style = PythonCommentStyle try: before, header, after = _find_first_spdx_comment(text, style=style) except MissingSpdxInfo: before, header, after = "", "", text # Workaround. EmptyCommentStyle should always be completely replaced. if style is EmptyCommentStyle: after = "" # pylint: disable=logging-format-interpolation _LOGGER.debug(f"before = {repr(before)}") _LOGGER.debug(f"header = {repr(header)}") _LOGGER.debug(f"after = {repr(after)}") # Keep special first-line-of-file lines as the first line in the file, # or say, move our comments after it. for (com_style, prefix) in [ (PythonCommentStyle, "#!"), (HtmlCommentStyle, " Optional[CommentStyle]: """Return value of CommentStyle detected for *path* or None.""" style = FILENAME_COMMENT_STYLE_MAP_LOWERCASE.get(path.name.lower()) if style is None: style = EXTENSION_COMMENT_STYLE_MAP_LOWERCASE.get(path.suffix.lower()) return style def _is_uncommentable(path: Path) -> bool: """Determines if *path* is uncommentable, e.g., the file is a binary or registered as an UncommentableCommentStyle. """ is_uncommentable = _get_comment_style(path) == UncommentableCommentStyle return is_uncommentable or is_binary(str(path)) def _verify_paths_line_handling( paths: List[Path], parser: ArgumentParser, force_single: bool, force_multi: bool, ): """This function aborts the parser when *force_single* or *force_multi* is used, but the file type does not support that type of comment style. """ for path in paths: style = _get_comment_style(path) if style is None: continue if force_single and not style.can_handle_single(): parser.error( _( "'{path}' does not support single-line comments, please" " do not use --single-line" ).format(path=path) ) if force_multi and not style.can_handle_multi(): parser.error( _( "'{path}' does not support multi-line comments, please" " do not use --multi-line" ).format(path=path) ) def _verify_paths_comment_style(paths: List[Path], parser: ArgumentParser): for path in paths: style = _get_comment_style(path) not_uncommentable = not _is_uncommentable(path) # TODO: This check is duplicated. if style is None and not_uncommentable: parser.error( _( "'{path}' does not have a recognised file extension," " please use --style, --explicit-license or" " --skip-unrecognised" ).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 _add_header_to_file( path: PathLike, spdx_info: SpdxInfo, template: Template, template_is_commented: bool, style: Optional[str], force_multi: bool = False, out=sys.stdout, ) -> int: """Helper function.""" # pylint: disable=too-many-arguments result = 0 if style is not None: style = NAME_STYLE_MAP[style] else: style = _get_comment_style(path) if style is None: out.write(_("Skipped unrecognised file {path}").format(path=path)) out.write("\n") return result with path.open("r", encoding="utf-8", newline="") as fp: text = fp.read() # Detect and remember line endings for later conversion. line_ending = detect_line_endings(text) # Normalise line endings. text = text.replace(line_ending, "\n") try: output = find_and_replace_header( text, spdx_info, template=template, template_is_commented=template_is_commented, style=style, force_multi=force_multi, ) except CommentCreateError: out.write( _("Error: Could not create comment for '{path}'").format(path=path) ) out.write("\n") result = 1 except MissingSpdxInfo: out.write( _( "Error: Generated comment header for '{path}' is missing" " copyright lines or license expressions. The template is" " probably incorrect. Did not write new header." ).format(path=path) ) out.write("\n") result = 1 else: with path.open("w", encoding="utf-8", newline=line_ending) as fp: fp.write(output) # TODO: This may need to be rephrased more elegantly. out.write(_("Successfully changed header of {path}").format(path=path)) out.write("\n") return result def add_arguments(parser) -> 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( "--year", "-y", action="store", 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-style", action="store", choices=list(_COPYRIGHT_STYLES.keys()), help=_("copyright style to use, optional"), ) parser.add_argument( "--template", "-t", action="store", type=str, help=_("name of template to use, optional"), ) parser.add_argument( "--exclude-year", action="store_true", help=_("do not include year in statement"), ) parser.add_argument( "--single-line", action="store_true", help=_("force single-line comment style, optional"), ) parser.add_argument( "--multi-line", action="store_true", help=_("force multi-line comment style, optional"), ) parser.add_argument( "--explicit-license", action="store_true", help=_("place header in path.license instead of path"), ) parser.add_argument( "--skip-unrecognised", action="store_true", help=_("skip files with unrecognised comment styles"), ) parser.add_argument("path", action="store", nargs="+", type=PathType("r")) def run(args, project: Project, out=sys.stdout) -> int: """Add headers to files.""" # pylint: disable=too-many-branches if not any((args.copyright, args.license)): args.parser.error(_("option --copyright or --license is required")) if args.exclude_year and args.year: args.parser.error( _("option --exclude-year and --year are mutually exclusive") ) if args.single_line and args.multi_line: args.parser.error( _("option --single-line and --multi-line are mutually exclusive") ) if args.style is not None and args.skip_unrecognised: _LOGGER.warning( _( "--skip-unrecognised has no effect when used together with" " --style" ) ) paths = [_determine_license_path(path) for path in args.path] if not args.explicit_license: _verify_write_access(paths, args.parser) # Verify line handling and comment styles before proceeding if args.style is None and not args.explicit_license: _verify_paths_line_handling( paths, args.parser, force_single=args.single_line, force_multi=args.multi_line, ) if not args.skip_unrecognised: _verify_paths_comment_style(paths, args.parser) template = None commented = False if args.template: try: template = _find_template(project, args.template) except TemplateNotFound: args.parser.error( _("template {template} could not be found").format( template=args.template ) ) if ".commented" in Path(template.name).suffixes: commented = True year = None if not args.exclude_year: if args.year: year = args.year else: year = datetime.date.today().year expressions = set(args.license) if args.license is not None else set() copyright_style = ( args.copyright_style if args.copyright_style is not None else "spdx" ) copyright_lines = ( { make_copyright_line(x, year=year, copyright_style=copyright_style) for x in args.copyright } if args.copyright is not None else set() ) spdx_info = SpdxInfo(expressions, copyright_lines) result = 0 for path in paths: uncommentable = _is_uncommentable(path) if uncommentable or args.explicit_license: new_path = _determine_license_suffix_path(path) if uncommentable: _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, spdx_info, template, commented, args.style, args.multi_line, out, ) return min(result, 1) def _verify_write_access(paths: Iterable[PathLike], parser: ArgumentParser): 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)) ) reuse-tool-0.14.0/src/reuse/init.py000066400000000000000000000076571416231101000171250ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for REUSE-ifying a project.""" import sys from gettext import gettext as _ from inspect import cleandoc from pathlib import Path from typing import List import requests from ._licenses import ALL_NON_DEPRECATED_MAP from ._util import PathType, print_incorrect_spdx_identifier from .download import _path_to_license_file, put_license_in_file from .project import Project from .vcs import find_root def prompt_licenses(out=sys.stdout) -> List[str]: """Prompt the user for a list of licenses.""" first = _( "What license is your project under? " "Provide the SPDX License Identifier." ) multi = _( "What other license is your project under? " "Provide the SPDX License Identifier." ) licenses = [] while True: if not licenses: out.write(first) else: out.write(multi) out.write("\n") out.write(_("To stop adding licenses, hit RETURN.")) out.write("\n") result = input() out.write("\n") if not result: return licenses if result not in ALL_NON_DEPRECATED_MAP: print_incorrect_spdx_identifier(result, out=out) out.write("\n\n") else: licenses.append(result) def add_arguments(parser): """Add arguments to parser.""" parser.add_argument( "path", action="store", nargs="?", type=PathType("r", force_directory=True), ) def run(args, project: Project, out=sys.stdout): """List all non-compliant files.""" # pylint: disable=too-many-statements,unused-argument if args.path: root = args.path else: root = find_root() if root is None: root = Path.cwd() if (root / ".reuse").exists(): out.write(_("Project already initialized")) out.write("\n") return 1 out.write(_("Initializing project for REUSE.")) out.write("\n\n") licenses = prompt_licenses(out=out) out.write(_("What is the name of the project?")) out.write("\n") project_name = input() out.write("\n") out.write(_("What is the internet address of the project?")) out.write("\n") project_url = input() out.write("\n") out.write(_("What is the name of the maintainer?")) out.write("\n") contact_name = input() out.write("\n") out.write(_("What is the e-mail address of the maintainer?")) out.write("\n") contact_address = input() out.write("\n") out.write(_("All done! Initializing now.")) out.write("\n\n") # Creating files past this point! for lic in licenses: destination = _path_to_license_file(lic, root=root) try: out.write(_("Downloading {}").format(lic)) out.write("\n") put_license_in_file(lic, destination=destination) # TODO: exceptions except FileExistsError: out.write(_("{} already exists").format(destination)) out.write("\n") except requests.RequestException: out.write(_("Could not download {}").format(lic)) out.write("\n") out.write("\n") out.write(_("Creating .reuse/dep5")) out.write("\n\n") # pylint: disable=line-too-long dep5_text = cleandoc( f""" Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: {project_name} Upstream-Contact: {contact_name} <{contact_address}> Source: {project_url} # Sample paragraph, commented out: # # Files: src/* # Copyright: $YEAR $NAME <$CONTACT> # License: ... """ ) dep5_text += "\n" (root / ".reuse").mkdir() (root / ".reuse/dep5").write_text(dep5_text) out.write(_("Initialization complete.")) out.write("\n") return 0 reuse-tool-0.14.0/src/reuse/lint.py000066400000000000000000000234011416231101000171110ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """All linting happens here. The linting here is nothing more than reading the reports and printing some conclusions. """ import os import sys from gettext import gettext as _ from typing import Iterable from . import __REUSE_version__ from .project import Project from .report import ProjectReport def _write_element(element, out=sys.stdout): out.write("* ") out.write(str(element)) out.write("\n") def lint(report: ProjectReport, out=sys.stdout) -> bool: """Lint the entire project.""" bad_licenses_result = lint_bad_licenses(report, out) deprecated_result = lint_deprecated_licenses(report, out) extensionless = lint_licenses_without_extension(report, out) missing_licenses_result = lint_missing_licenses(report, out) unused_licenses_result = lint_unused_licenses(report, out) read_errors_result = lint_read_errors(report, out) files_without_cali = lint_files_without_copyright_and_licensing( report, out ) lint_summary(report, out=out) success = not any( any(result) for result in ( bad_licenses_result, deprecated_result, extensionless, missing_licenses_result, unused_licenses_result, read_errors_result, files_without_cali, ) ) out.write("\n") if success: out.write( _( "Congratulations! Your project is compliant with version" " {} of the REUSE Specification :-)" ).format(__REUSE_version__) ) else: out.write( _( "Unfortunately, your project is not compliant with version " "{} of the REUSE Specification :-(" ).format(__REUSE_version__) ) out.write("\n") return success def lint_bad_licenses(report: ProjectReport, out=sys.stdout) -> Iterable[str]: """Lint for bad licenses. Bad licenses are licenses that are not in the SPDX License List or do not start with LicenseRef-. """ bad_files = [] if report.bad_licenses: out.write("# ") out.write(_("BAD LICENSES")) out.write("\n") for lic, files in sorted(report.bad_licenses.items()): out.write("\n") out.write(_("'{}' found in:").format(lic)) out.write("\n") for file_ in sorted(files): bad_files.append(file_) _write_element(file_, out=out) out.write("\n\n") return bad_files def lint_deprecated_licenses( report: ProjectReport, out=sys.stdout ) -> Iterable[str]: """Lint for deprecated licenses.""" deprecated = [] if report.deprecated_licenses: out.write("# ") out.write(_("DEPRECATED LICENSES")) out.write("\n\n") out.write(_("The following licenses are deprecated by SPDX:")) out.write("\n") for lic in sorted(report.deprecated_licenses): deprecated.append(lic) _write_element(lic, out=out) out.write("\n\n") return deprecated def lint_licenses_without_extension( report: ProjectReport, out=sys.stdout ) -> Iterable[str]: """Lint for licenses without extensions.""" extensionless = [] if report.licenses_without_extension: out.write("# ") out.write(_("LICENSES WITHOUT FILE EXTENSION")) out.write("\n\n") out.write(_("The following licenses have no file extension:")) out.write("\n") for __, path in sorted(report.licenses_without_extension.items()): extensionless.append(path) _write_element(path, out=out) out.write("\n\n") return extensionless def lint_missing_licenses( report: ProjectReport, out=sys.stdout ) -> Iterable[str]: """Lint for missing licenses. A license is missing when it is referenced in a file, but cannot be found. """ bad_files = [] if report.missing_licenses: out.write("# ") out.write(_("MISSING LICENSES")) out.write("\n") for lic, files in sorted(report.missing_licenses.items()): out.write("\n") out.write(_("'{}' found in:").format(lic)) out.write("\n") for file_ in sorted(files): bad_files.append(file_) _write_element(file_, out=out) out.write("\n\n") return bad_files def lint_unused_licenses( report: ProjectReport, out=sys.stdout ) -> Iterable[str]: """Lint for unused licenses.""" unused_licenses = [] if report.unused_licenses: out.write("# ") out.write(_("UNUSED LICENSES")) out.write("\n\n") out.write(_("The following licenses are not used:")) out.write("\n") for lic in sorted(report.unused_licenses): unused_licenses.append(lic) _write_element(lic, out=out) out.write("\n\n") return unused_licenses def lint_read_errors(report: ProjectReport, out=sys.stdout) -> Iterable[str]: """Lint for read errors.""" bad_files = [] if report.read_errors: out.write("# ") out.write(_("READ ERRORS")) out.write("\n\n") out.write(_("Could not read:")) out.write("\n") for file_ in report.read_errors: bad_files.append(file_) _write_element(file_, out=out) out.write("\n\n") return bad_files def lint_files_without_copyright_and_licensing( report: ProjectReport, out=sys.stdout ) -> Iterable[str]: """Lint for files that do not have copyright or licensing information.""" # TODO: The below three operations can probably be optimised. both = set(report.files_without_copyright) & set( report.files_without_licenses ) only_copyright = set(report.files_without_copyright) - both only_licensing = set(report.files_without_licenses) - both if any((both, only_copyright, only_licensing)): out.write("# ") out.write(_("MISSING COPYRIGHT AND LICENSING INFORMATION")) out.write("\n\n") if both: out.write( _( "The following files have no copyright and licensing " "information:" ) ) out.write("\n") for file_ in sorted(both): _write_element(file_, out=out) out.write("\n") if only_copyright: out.write(_("The following files have no copyright information:")) out.write("\n") for file_ in sorted(only_copyright): _write_element(file_, out=out) out.write("\n") if only_licensing: out.write(_("The following files have no licensing information:")) out.write("\n") for file_ in sorted(only_licensing): _write_element(file_, out=out) out.write("\n") out.write("\n") return both | only_copyright | only_licensing def lint_summary(report: ProjectReport, out=sys.stdout) -> None: """Print a summary for linting.""" # pylint: disable=too-many-statements out.write("# ") out.write(_("SUMMARY")) out.write("\n\n") file_total = len(report.file_reports) out.write("* ") out.write(_("Bad licenses:")) for i, lic in enumerate(sorted(report.bad_licenses)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Deprecated licenses:")) for i, lic in enumerate(sorted(report.deprecated_licenses)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Licenses without file extension:")) for i, lic in enumerate(sorted(report.licenses_without_extension)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Missing licenses:")) for i, lic in enumerate(sorted(report.missing_licenses)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Unused licenses:")) for i, lic in enumerate(sorted(report.unused_licenses)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Used licenses:")) for i, lic in enumerate(sorted(report.used_licenses)): if i: out.write(",") out.write(" ") out.write(lic) out.write("\n") out.write("* ") out.write(_("Read errors: {count}").format(count=len(report.read_errors))) out.write("\n") out.write("* ") out.write( _("Files with copyright information: {count} / {total}").format( count=file_total - len(report.files_without_copyright), total=file_total, ) ) out.write("\n") out.write("* ") out.write( _("Files with license information: {count} / {total}").format( count=file_total - len(report.files_without_licenses), total=file_total, ) ) out.write("\n") def add_arguments(parser): # pylint: disable=unused-argument """Add arguments to parser.""" parser.add_argument( "-q", "--quiet", action="store_true", help="Prevents output" ) def run(args, project: Project, out=sys.stdout): """List all non-compliant files.""" # pylint: disable=unused-argument report = ProjectReport.generate( project, do_checksum=False, multiprocessing=not args.no_multiprocessing ) if args.quiet: out = open(os.devnull, "w") result = lint(report, out=out) return 0 if result else 1 reuse-tool-0.14.0/src/reuse/project.py000066400000000000000000000261771416231101000176260ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Module that contains the central Project class.""" import contextlib import glob import logging import os from gettext import gettext as _ from pathlib import Path from typing import Dict, Iterator, Optional from boolean.boolean import ParseError from debian.copyright import Copyright from debian.copyright import Error as DebianError from license_expression import ExpressionError from . import ( _IGNORE_DIR_PATTERNS, _IGNORE_FILE_PATTERNS, IdentifierNotFound, SpdxInfo, ) from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( _HEADER_BYTES, GIT_EXE, HG_EXE, PathLike, _copyright_from_dep5, _determine_license_path, decoded_text_from_binary, extract_spdx_info, ) from .vcs import VCSStrategyGit, VCSStrategyHg, VCSStrategyNone, find_root _LOGGER = logging.getLogger(__name__) class Project: """Simple object that holds the project's root, which is necessary for many interactions. """ # pylint: disable=too-many-instance-attributes def __init__(self, root: PathLike, include_submodules: bool = False): self._root = Path(root) if not self._root.is_dir(): raise NotADirectoryError(f"{self._root} is no valid path") if GIT_EXE and VCSStrategyGit.in_repo(self._root): self.vcs_strategy = VCSStrategyGit(self) elif HG_EXE and VCSStrategyHg.in_repo(self._root): self.vcs_strategy = VCSStrategyHg(self) else: _LOGGER.warning(_("could not find supported VCS")) self.vcs_strategy = VCSStrategyNone(self) self.licenses_without_extension = dict() self.license_map = LICENSE_MAP.copy() # TODO: Is this correct? self.license_map.update(EXCEPTION_MAP) self.licenses = self._licenses() # Use '0' as None, because None is a valid value... self._copyright_val = 0 self.include_submodules = include_submodules def all_files(self, directory: PathLike = 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. """ if directory is None: directory = self.root directory = Path(directory) for root, dirs, files in os.walk(directory): root = Path(root) _LOGGER.debug("currently walking in '%s'", root) # Don't walk ignored directories for dir_ in list(dirs): the_dir = root / dir_ 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 ( the_dir / ".git" ).is_file() and not self.include_submodules: _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 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 spdx_info_of(self, path: PathLike) -> SpdxInfo: """Return SPDX info of *path*. This function will return any SPDX information that it can find, both from within the file and from the .reuse/dep5 file. """ path = _determine_license_path(path) _LOGGER.debug(f"searching '{path}' for SPDX information") dep5_result = SpdxInfo(set(), set()) file_result = SpdxInfo(set(), set()) # Search the .reuse/dep5 file for SPDX information. if self._copyright: dep5_result = _copyright_from_dep5( self.relative_from_root(path), self._copyright ) if any(dep5_result): _LOGGER.info( _("'{path}' covered by .reuse/dep5").format(path=path) ) # Search the file for SPDX information. with path.open("rb") as fp: try: file_result = extract_spdx_info( decoded_text_from_binary(fp, size=_HEADER_BYTES) ) except (ExpressionError, ParseError): _LOGGER.error( _( "'{path}' holds an SPDX expression that cannot be" " parsed, skipping the file" ).format(path=path) ) return SpdxInfo( dep5_result.spdx_expressions.union(file_result.spdx_expressions), dep5_result.copyright_lines.union(file_result.copyright_lines), ) def relative_from_root(self, path: Path) -> Path: """If the project root is /tmp/project, and *path* is /tmp/project/src/file, then return src/file. """ try: return path.relative_to(self.root) except ValueError: return Path(os.path.relpath(path, start=self.root)) def _is_path_ignored(self, path: Path) -> bool: """Is *path* ignored by some mechanism?""" name = path.name 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 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 License Identifier. """ if not path.suffix: raise IdentifierNotFound(f"{path} has no file extension") if path.stem in self.license_map: return path.stem if path.stem.startswith("LicenseRef-"): return path.stem raise IdentifierNotFound( f"Could not find SPDX License Identifier for {path}" ) @property def root(self) -> Path: """Path to the root of the project.""" return self._root @property def _copyright(self) -> Optional[Copyright]: if self._copyright_val == 0: copyright_path = self.root / ".reuse/dep5" try: with copyright_path.open() as fp: self._copyright_val = Copyright(fp) except OSError: _LOGGER.debug("no .reuse/dep5 file, or could not read it") except DebianError: _LOGGER.exception(_(".reuse/dep5 has syntax errors")) # This check is a bit redundant, but otherwise I'd have to repeat # this line under each exception. if not self._copyright_val: self._copyright_val = None return self._copyright_val def _licenses(self) -> Dict[str, Path]: """Return a dictionary of all licenses in the project, with their SPDX identifiers as names and paths as values. """ license_files = dict() directory = str(self.root / "LICENSES/**") for path in glob.iglob(directory, recursive=True): path = Path(path) # For some reason, LICENSES/** is resolved even though it # doesn't exist. I have no idea why. Deal with that here. if not Path(path).exists() or Path(path).is_dir(): continue if Path(path).suffix == ".license": continue path = self.relative_from_root(path) _LOGGER.debug( _("determining identifier of '{path}'").format(path=path) ) try: identifier = self._identifier_of_license(path) except IdentifierNotFound: if path.name in self.license_map: _LOGGER.info( _("{path} does not have a file extension").format( path=path ) ) identifier = path.name self.licenses_without_extension[identifier] = path else: identifier = path.stem _LOGGER.warning( _( "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." ).format(path=path, identifier=identifier) ) if identifier in license_files: _LOGGER.critical( _( "{identifier} is the SPDX License Identifier of both" " {path} and {other_path}" ).format( identifier=identifier, path=path, other_path=license_files[identifier], ) ) raise RuntimeError( f"Multiple licenses resolve to {identifier}" ) # Add the identifiers license_files[identifier] = path if ( identifier.startswith("LicenseRef-") and "Unknown" not in identifier ): self.license_map[identifier] = { "reference": str(path), "isDeprecatedLicenseId": False, "detailsUrl": None, "referenceNumber": None, "name": identifier, "licenseId": identifier, "seeAlso": [], "isOsiApproved": None, } return license_files def create_project() -> Project: """Create a project object. Try to find the project root from CWD, otherwise treat CWD as root. """ root = find_root() if root is None: root = Path.cwd() return Project(root) reuse-tool-0.14.0/src/reuse/report.py000066400000000000000000000322561416231101000174660ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Module that contains reports about files and projects for linting.""" import datetime import logging import multiprocessing as mp import random from gettext import gettext as _ from hashlib import md5 from io import StringIO from os import PathLike, cpu_count from pathlib import Path from typing import Iterable, List, NamedTuple, Optional, Set from uuid import uuid4 from . import __version__ from ._util import _LICENSING, _checksum from .project import Project _LOGGER = logging.getLogger(__name__) class _MultiprocessingContainer: """Container that remembers some data in order to generate a FileReport.""" # pylint: disable=too-few-public-methods def __init__(self, project, do_checksum): self.project = project self.do_checksum = do_checksum def __call__(self, file_): # pylint: disable=broad-except try: return _MultiprocessingResult( file_, FileReport.generate( self.project, file_, do_checksum=self.do_checksum ), None, ) except Exception as exc: return _MultiprocessingResult(file_, None, exc) class _MultiprocessingResult( NamedTuple ): # pylint: disable=too-few-public-methods """Result of :class:`MultiprocessingContainer`.""" path: PathLike report: Optional["FileReport"] error: Optional[Exception] class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" def __init__(self, do_checksum: bool = True): self.path = None self.licenses = dict() self.missing_licenses = dict() self.bad_licenses = dict() self.deprecated_licenses = set() self.read_errors = set() self.file_reports = set() self.licenses_without_extension = dict() self.do_checksum = do_checksum self._unused_licenses = None self._used_licenses = None self._files_without_licenses = None self._files_without_copyright = None def to_dict(self): """Turn the report into a json-like dictionary.""" return { "path": str(Path(self.path).resolve()), "licenses": { identifier: str(path) for identifier, path in self.licenses.items() }, "bad_licenses": { lic: [str(file_) for file_ in files] for lic, files in self.bad_licenses.items() }, "deprecated_licenses": sorted(self.deprecated_licenses), "licenses_without_extension": { identifier: str(path) for identifier, path in self.licenses_without_extension.items() }, "missing_licenses": { lic: [str(file_) for file_ in files] for lic, files in self.missing_licenses.items() }, "read_errors": list(map(str, self.read_errors)), "file_reports": [report.to_dict() for report in self.file_reports], } def bill_of_materials(self) -> str: """Generate a bill of materials from the project. See https://spdx.org/specifications. """ out = StringIO() # Write mandatory tags out.write("SPDXVersion: SPDX-2.1\n") out.write("DataLicense: CC0-1.0\n") out.write("SPDXID: SPDXRef-DOCUMENT\n") out.write(f"DocumentName: {Path(self.path).resolve().name}\n") # TODO: Generate UUID from git revision maybe # TODO: Fix the URL out.write( f"DocumentNamespace:" f" http://spdx.org/spdxdocs/spdx-v2.1-{uuid4()}\n" ) # Author # TODO: Fix Person and Organization out.write("Creator: Person: Anonymous ()\n") out.write("Creator: Organization: Anonymous ()\n") out.write(f"Creator: Tool: reuse-{__version__}\n") now = datetime.datetime.utcnow() now = now.replace(microsecond=0) out.write(f"Created: {now.isoformat()}Z\n") out.write( "CreatorComment: This document was created automatically" " using available reuse information consistent with" " REUSE.\n" ) reports = sorted(self.file_reports, key=lambda x: x.spdxfile.name) for report in reports: out.write( f"Relationship: SPDXRef-DOCUMENT describes" f" {report.spdxfile.spdx_id}\n" ) for report in reports: out.write("\n") out.write(f"FileName: {report.spdxfile.name}\n") out.write(f"SPDXID: {report.spdxfile.spdx_id}\n") out.write(f"FileChecksum: SHA1: {report.spdxfile.chk_sum}\n") # IMPORTANT: Make no assertion about concluded license. This tool # cannot, with full certainty, determine the license of a file. out.write("LicenseConcluded: NOASSERTION\n") for lic in sorted(report.spdxfile.licenses_in_file): out.write(f"LicenseInfoInFile: {lic}\n") if report.spdxfile.copyright: out.write( f"FileCopyrightText:" f" {report.spdxfile.copyright}\n" ) else: out.write("FileCopyrightText: NONE\n") # Licenses for lic, path in sorted(self.licenses.items()): if lic.startswith("LicenseRef-"): out.write("\n") out.write(f"LicenseID: {lic}\n") out.write("LicenseName: NOASSERTION\n") with (Path(self.path) / path).open() as fp: out.write(f"ExtractedText: {fp.read()}\n") return out.getvalue() @classmethod def generate( cls, project: Project, do_checksum: bool = True, multiprocessing: bool = cpu_count() > 1, ) -> "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 ) container = _MultiprocessingContainer(project, do_checksum) if multiprocessing: pool = mp.Pool() results = pool.map(container, project.all_files()) pool.close() pool.join() else: results = map(container, project.all_files()) for result in results: if 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(result.path) continue _LOGGER.error( _( "Unexpected error occurred while parsing '{path}'" ).format(path=result.path), exc_info=result.error, ) project_report.read_errors.add(result.path) continue file_report = result.report # File report. project_report.file_reports.add(file_report) # Bad and missing licenses. for license in file_report.missing_licenses: project_report.missing_licenses.setdefault(license, set()).add( file_report.path ) for license in file_report.bad_licenses: project_report.bad_licenses.setdefault(license, set()).add( file_report.path ) # More bad licenses, and also deprecated licenses for name, path in project.licenses.items(): if name not in project.license_map: project_report.bad_licenses.setdefault(name, set()).add(path) elif project.license_map[name]["isDeprecatedLicenseId"]: project_report.deprecated_licenses.add(name) return project_report @property 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 self._used_licenses = set(self.licenses) - self.unused_licenses return self._used_licenses @property 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 all_used_licenses = { lic for file_report in self.file_reports for lic in file_report.spdxfile.licenses_in_file } self._unused_licenses = { lic for lic in self.licenses if lic not in all_used_licenses } return self._unused_licenses @property def files_without_licenses(self) -> Iterable[PathLike]: """Iterable of paths that have no license information.""" if self._files_without_licenses is not None: return self._files_without_licenses self._files_without_licenses = { file_report.path for file_report in self.file_reports if not file_report.spdxfile.licenses_in_file } return self._files_without_licenses @property def files_without_copyright(self) -> Iterable[PathLike]: """Iterable of paths that have no copyright information.""" if self._files_without_copyright is not None: return self._files_without_copyright self._files_without_copyright = { file_report.path for file_report in self.file_reports if not file_report.spdxfile.copyright } return self._files_without_copyright class _File: # pylint: disable=too-few-public-methods """Represent an SPDX file. Sufficiently enough for our purposes, in any case. """ def __init__(self, name, spdx_id=None, chk_sum=None): self.name: str = name self.spdx_id: str = spdx_id self.chk_sum: str = chk_sum self.licenses_in_file: List[str] = [] self.copyright: str = None class FileReport: """Object that holds a linting report about a single file. Importantly, it also contains SPDX File information in :attr:`spdxfile`. """ def __init__( self, name: PathLike, path: PathLike, do_checksum: bool = True ): self.spdxfile = _File(name) self.path = Path(path) self.do_checksum = do_checksum self.bad_licenses = set() self.missing_licenses = set() def to_dict(self): """Turn the report into a json-like dictionary.""" return { "path": str(Path(self.path).resolve()), "name": self.spdxfile.name, "spdx_id": self.spdxfile.spdx_id, "chk_sum": self.spdxfile.chk_sum, "licenses_in_file": sorted(self.spdxfile.licenses_in_file), "copyright": self.spdxfile.copyright, } @classmethod def generate( cls, project: Project, path: PathLike, do_checksum: bool = True ) -> "FileReport": """Generate a FileReport from a path in a Project.""" path = Path(path) if not path.is_file(): raise OSError(f"{path} is not a file") # pylint: disable=protected-access relative = project.relative_from_root(path) report = cls("./" + str(relative), path, do_checksum=do_checksum) # Checksum and ID if report.do_checksum: report.spdxfile.chk_sum = _checksum(path) else: # This path avoids a lot of heavy computation, which is handy for # scenarios where you only need a unique hash, not a consistent # hash. report.spdxfile.chk_sum = "%040x" % random.getrandbits(40) spdx_id = md5() spdx_id.update(str(relative).encode("utf-8")) spdx_id.update(report.spdxfile.chk_sum.encode("utf-8")) report.spdxfile.spdx_id = f"SPDXRef-{spdx_id.hexdigest()}" spdx_info = project.spdx_info_of(path) for expression in spdx_info.spdx_expressions: for identifier in _LICENSING.license_keys(expression): # Bad license if identifier not in project.license_map: report.bad_licenses.add(identifier) # Missing license if identifier not in project.licenses: report.missing_licenses.add(identifier) # Add license to report. report.spdxfile.licenses_in_file.append(identifier) # Copyright text report.spdxfile.copyright = "\n".join( sorted(spdx_info.copyright_lines) ) return report def __hash__(self): if self.spdxfile.chk_sum is not None: return hash(self.spdxfile.name + self.spdxfile.chk_sum) return super().__hash__(self) reuse-tool-0.14.0/src/reuse/resources/000077500000000000000000000000001416231101000176035ustar00rootroot00000000000000reuse-tool-0.14.0/src/reuse/resources/exceptions.json000066400000000000000000000373711416231101000226720ustar00rootroot00000000000000{ "licenseListVersion": "3.15", "exceptions": [ { "reference": "./WxWindows-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./WxWindows-exception-3.1.html", "referenceNumber": 1, "name": "WxWindows Library Exception 3.1", "licenseExceptionId": "WxWindows-exception-3.1", "seeAlso": [ "http://www.opensource.org/licenses/WXwindows" ] }, { "reference": "./DigiRule-FOSS-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./DigiRule-FOSS-exception.html", "referenceNumber": 2, "name": "DigiRule FOSS License Exception", "licenseExceptionId": "DigiRule-FOSS-exception", "seeAlso": [ "http://www.digirulesolutions.com/drupal/foss" ] }, { "reference": "./freertos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./freertos-exception-2.0.html", "referenceNumber": 3, "name": "FreeRTOS Exception 2.0", "licenseExceptionId": "freertos-exception-2.0", "seeAlso": [ "https://web.archive.org/web/20060809182744/http://www.freertos.org/a00114.html" ] }, { "reference": "./SHL-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.0.html", "referenceNumber": 4, "name": "Solderpad Hardware License v2.0", "licenseExceptionId": "SHL-2.0", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.0/" ] }, { "reference": "./Qt-GPL-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-GPL-exception-1.0.html", "referenceNumber": 5, "name": "Qt GPL exception 1.0", "licenseExceptionId": "Qt-GPL-exception-1.0", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LICENSE.GPL3-EXCEPT" ] }, { "reference": "./FLTK-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./FLTK-exception.html", "referenceNumber": 6, "name": "FLTK exception", "licenseExceptionId": "FLTK-exception", "seeAlso": [ "http://www.fltk.org/COPYING.php" ] }, { "reference": "./OCCT-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCCT-exception-1.0.html", "referenceNumber": 7, "name": "Open CASCADE Exception 1.0", "licenseExceptionId": "OCCT-exception-1.0", "seeAlso": [ "http://www.opencascade.com/content/licensing" ] }, { "reference": "./389-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./389-exception.html", "referenceNumber": 8, "name": "389 Directory Server Exception", "licenseExceptionId": "389-exception", "seeAlso": [ "http://directory.fedoraproject.org/wiki/GPL_Exception_License_Text" ] }, { "reference": "./CLISP-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./CLISP-exception-2.0.html", "referenceNumber": 9, "name": "CLISP exception 2.0", "licenseExceptionId": "CLISP-exception-2.0", "seeAlso": [ "http://sourceforge.net/p/clisp/clisp/ci/default/tree/COPYRIGHT" ] }, { "reference": "./eCos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./eCos-exception-2.0.html", "referenceNumber": 10, "name": "eCos exception 2.0", "licenseExceptionId": "eCos-exception-2.0", "seeAlso": [ "http://ecos.sourceware.org/license-overview.html" ] }, { "reference": "./LLVM-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLVM-exception.html", "referenceNumber": 11, "name": "LLVM Exception", "licenseExceptionId": "LLVM-exception", "seeAlso": [ "http://llvm.org/foundation/relicensing/LICENSE.txt" ] }, { "reference": "./GCC-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-3.1.html", "referenceNumber": 12, "name": "GCC Runtime Library exception 3.1", "licenseExceptionId": "GCC-exception-3.1", "seeAlso": [ "http://www.gnu.org/licenses/gcc-exception-3.1.html" ] }, { "reference": "./Classpath-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Classpath-exception-2.0.html", "referenceNumber": 13, "name": "Classpath exception 2.0", "licenseExceptionId": "Classpath-exception-2.0", "seeAlso": [ "http://www.gnu.org/software/classpath/license.html", "https://fedoraproject.org/wiki/Licensing/GPL_Classpath_Exception" ] }, { "reference": "./LZMA-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LZMA-exception.html", "referenceNumber": 14, "name": "LZMA exception", "licenseExceptionId": "LZMA-exception", "seeAlso": [ "http://nsis.sourceforge.net/Docs/AppendixI.html#I.6" ] }, { "reference": "./Swift-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Swift-exception.html", "referenceNumber": 15, "name": "Swift Exception", "licenseExceptionId": "Swift-exception", "seeAlso": [ "https://swift.org/LICENSE.txt", "https://github.com/apple/swift-package-manager/blob/7ab2275f447a5eb37497ed63a9340f8a6d1e488b/LICENSE.txt#L205" ] }, { "reference": "./Libtool-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Libtool-exception.html", "referenceNumber": 16, "name": "Libtool Exception", "licenseExceptionId": "Libtool-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/libtool.git/tree/m4/libtool.m4" ] }, { "reference": "./LGPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LGPL-3.0-linking-exception.html", "referenceNumber": 17, "name": "LGPL-3.0 Linking Exception", "licenseExceptionId": "LGPL-3.0-linking-exception", "seeAlso": [ "https://raw.githubusercontent.com/go-xmlpath/xmlpath/v2/LICENSE", "https://github.com/goamz/goamz/blob/master/LICENSE", "https://github.com/juju/errors/blob/master/LICENSE" ] }, { "reference": "./Autoconf-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-2.0.html", "referenceNumber": 18, "name": "Autoconf exception 2.0", "licenseExceptionId": "Autoconf-exception-2.0", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html", "http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.gz" ] }, { "reference": "./Linux-syscall-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Linux-syscall-note.html", "referenceNumber": 19, "name": "Linux Syscall Note", "licenseExceptionId": "Linux-syscall-note", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/COPYING" ] }, { "reference": "./OpenJDK-assembly-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OpenJDK-assembly-exception-1.0.html", "referenceNumber": 20, "name": "OpenJDK Assembly exception 1.0", "licenseExceptionId": "OpenJDK-assembly-exception-1.0", "seeAlso": [ "http://openjdk.java.net/legal/assembly-exception.html" ] }, { "reference": "./Autoconf-exception-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-3.0.html", "referenceNumber": 21, "name": "Autoconf exception 3.0", "licenseExceptionId": "Autoconf-exception-3.0", "seeAlso": [ "http://www.gnu.org/licenses/autoconf-exception-3.0.html" ] }, { "reference": "./gnu-javamail-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./gnu-javamail-exception.html", "referenceNumber": 22, "name": "GNU JavaMail exception", "licenseExceptionId": "gnu-javamail-exception", "seeAlso": [ "http://www.gnu.org/software/classpathx/javamail/javamail.html" ] }, { "reference": "./OCaml-LGPL-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCaml-LGPL-linking-exception.html", "referenceNumber": 23, "name": "OCaml LGPL Linking Exception", "licenseExceptionId": "OCaml-LGPL-linking-exception", "seeAlso": [ "https://caml.inria.fr/ocaml/license.en.html" ] }, { "reference": "./PS-or-PDF-font-exception-20170817.json", "isDeprecatedLicenseId": false, "detailsUrl": "./PS-or-PDF-font-exception-20170817.html", "referenceNumber": 24, "name": "PS/PDF font exception (2017-08-17)", "licenseExceptionId": "PS-or-PDF-font-exception-20170817", "seeAlso": [ "https://github.com/ArtifexSoftware/urw-base35-fonts/blob/65962e27febc3883a17e651cdb23e783668c996f/LICENSE" ] }, { "reference": "./Universal-FOSS-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Universal-FOSS-exception-1.0.html", "referenceNumber": 25, "name": "Universal FOSS Exception, Version 1.0", "licenseExceptionId": "Universal-FOSS-exception-1.0", "seeAlso": [ "https://oss.oracle.com/licenses/universal-foss-exception/" ] }, { "reference": "./openvpn-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./openvpn-openssl-exception.html", "referenceNumber": 26, "name": "OpenVPN OpenSSL Exception", "licenseExceptionId": "openvpn-openssl-exception", "seeAlso": [ "http://openvpn.net/index.php/license.html" ] }, { "reference": "./Font-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Font-exception-2.0.html", "referenceNumber": 27, "name": "Font exception 2.0", "licenseExceptionId": "Font-exception-2.0", "seeAlso": [ "http://www.gnu.org/licenses/gpl-faq.html#FontException" ] }, { "reference": "./Bison-exception-2.2.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bison-exception-2.2.html", "referenceNumber": 28, "name": "Bison exception 2.2", "licenseExceptionId": "Bison-exception-2.2", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ] }, { "reference": "./Fawkes-Runtime-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Fawkes-Runtime-exception.html", "referenceNumber": 29, "name": "Fawkes Runtime Exception", "licenseExceptionId": "Fawkes-Runtime-exception", "seeAlso": [ "http://www.fawkesrobotics.org/about/license/" ] }, { "reference": "./GPL-CC-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-CC-1.0.html", "referenceNumber": 30, "name": "GPL Cooperation Commitment 1.0", "licenseExceptionId": "GPL-CC-1.0", "seeAlso": [ "https://github.com/gplcc/gplcc/blob/master/Project/COMMITMENT", "https://gplcc.github.io/gplcc/Project/README-PROJECT.html" ] }, { "reference": "./Qwt-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qwt-exception-1.0.html", "referenceNumber": 31, "name": "Qwt exception 1.0", "licenseExceptionId": "Qwt-exception-1.0", "seeAlso": [ "http://qwt.sourceforge.net/qwtlicense.html" ] }, { "reference": "./Nokia-Qt-exception-1.1.json", "isDeprecatedLicenseId": true, "detailsUrl": "./Nokia-Qt-exception-1.1.html", "referenceNumber": 32, "name": "Nokia Qt LGPL exception 1.1", "licenseExceptionId": "Nokia-Qt-exception-1.1", "seeAlso": [ "https://www.keepassx.org/dev/projects/keepassx/repository/revisions/b8dfb9cc4d5133e0f09cd7533d15a4f1c19a40f2/entry/LICENSE.NOKIA-LGPL-EXCEPTION" ] }, { "reference": "./i2p-gpl-java-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./i2p-gpl-java-exception.html", "referenceNumber": 33, "name": "i2p GPL+Java Exception", "licenseExceptionId": "i2p-gpl-java-exception", "seeAlso": [ "http://geti2p.net/en/get-involved/develop/licenses#java_exception" ] }, { "reference": "./GCC-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0.html", "referenceNumber": 34, "name": "GCC Runtime Library exception 2.0", "licenseExceptionId": "GCC-exception-2.0", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" ] }, { "reference": "./GPL-3.0-linking-source-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-source-exception.html", "referenceNumber": 35, "name": "GPL-3.0 Linking Exception (with Corresponding Source)", "licenseExceptionId": "GPL-3.0-linking-source-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs", "https://github.com/mirror/wget/blob/master/src/http.c#L20" ] }, { "reference": "./GPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-exception.html", "referenceNumber": 36, "name": "GPL-3.0 Linking Exception", "licenseExceptionId": "GPL-3.0-linking-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs" ] }, { "reference": "./Bootloader-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bootloader-exception.html", "referenceNumber": 37, "name": "Bootloader Distribution Exception", "licenseExceptionId": "Bootloader-exception", "seeAlso": [ "https://github.com/pyinstaller/pyinstaller/blob/develop/COPYING.txt" ] }, { "reference": "./mif-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./mif-exception.html", "referenceNumber": 38, "name": "Macros and Inline Functions Exception", "licenseExceptionId": "mif-exception", "seeAlso": [ "http://www.scs.stanford.edu/histar/src/lib/cppsup/exception", "http://dev.bertos.org/doxygen/", "https://www.threadingbuildingblocks.org/licensing" ] }, { "reference": "./SHL-2.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.1.html", "referenceNumber": 39, "name": "Solderpad Hardware License v2.1", "licenseExceptionId": "SHL-2.1", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.1/" ] }, { "reference": "./Qt-LGPL-exception-1.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-LGPL-exception-1.1.html", "referenceNumber": 40, "name": "Qt LGPL exception 1.1", "licenseExceptionId": "Qt-LGPL-exception-1.1", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LGPL_EXCEPTION.txt" ] }, { "reference": "./u-boot-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./u-boot-exception-2.0.html", "referenceNumber": 41, "name": "U-Boot exception 2.0", "licenseExceptionId": "u-boot-exception-2.0", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003dLicenses/Exceptions" ] } ], "releaseDate": "2021-11-14" }reuse-tool-0.14.0/src/reuse/resources/exceptions.json.license000066400000000000000000000001441416231101000242770ustar00rootroot00000000000000# SPDX-FileCopyrightText: Linux Foundation and its Contributors # # SPDX-License-Identifier: CC0-1.0reuse-tool-0.14.0/src/reuse/resources/licenses.json000066400000000000000000006412451416231101000223170ustar00rootroot00000000000000{ "licenseListVersion": "3.15", "licenses": [ { "reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", "referenceNumber": 0, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": [ "https://opensource.org/licenses/APL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", "referenceNumber": 1, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": [ "http://www.sugarcrm.com/crm/SPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", "referenceNumber": 2, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": [ "https://paritylicense.com/versions/6.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", "referenceNumber": 3, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/NLPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", "referenceNumber": 4, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d47c2415c1df81556eeb39be6cad458ef87c534a2" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", "referenceNumber": 5, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": [ "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", "referenceNumber": 6, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": [ "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", "referenceNumber": 7, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Afmparse" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", "referenceNumber": 8, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": [ "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt" ], "isOsiApproved": false }, { "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": 9, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", "referenceNumber": 10, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": [ "https://open.canada.ca/en/open-government-licence-canada" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", "referenceNumber": 11, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": [ "https://opensource.org/licenses/RPL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", "referenceNumber": 12, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003de5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", "referenceNumber": 13, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/diffmark" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", "referenceNumber": 14, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Crossword" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", "referenceNumber": 15, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d806557a5ad59804ef3a44d5abfbe91d706b0791f" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", "referenceNumber": 16, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": [ "https://www.eclipse.org/legal/epl-2.0", "https://www.opensource.org/licenses/EPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 17, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/noncommercial/1.0.0" ], "isOsiApproved": false }, { "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": 18, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", "referenceNumber": 19, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": [ "https://www.kernel.org/doc/man-pages/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", "referenceNumber": 20, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", "referenceNumber": 21, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Newsletr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", "referenceNumber": 22, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Latex2e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", "referenceNumber": 23, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": [ "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", "referenceNumber": 24, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Eurosym" ], "isOsiApproved": false }, { "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": 25, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", "referenceNumber": 26, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", "referenceNumber": 27, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 28, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", "referenceNumber": 29, "name": "MIT License", "licenseId": "MIT", "seeAlso": [ "https://opensource.org/licenses/MIT" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", "referenceNumber": 30, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10" ], "isOsiApproved": false }, { "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": 31, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "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": 32, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", "referenceNumber": 33, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": [ "https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt", "https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", "referenceNumber": 34, "name": "Cube License", "licenseId": "Cube", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Cube" ], "isOsiApproved": false }, { "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": 35, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": [ "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", "referenceNumber": 36, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Bahyph" ], "isOsiApproved": false }, { "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": 37, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", "referenceNumber": 38, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", "referenceNumber": 39, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": [ "https://opensource.org/licenses/MirOS" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", "referenceNumber": 40, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": [ "http://directory.fsf.org/wiki/License:BSD_4Clause" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 41, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode" ], "isOsiApproved": false }, { "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": 42, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": [ "https://gitlab.syncad.com/hive/dhive/-/blob/master/LICENSE", "https://github.com/greymass/swift-eosio/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", "referenceNumber": 43, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", "referenceNumber": 44, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": [ "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", "https://opensource.org/licenses/EUPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", "referenceNumber": 45, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": [ "https://opensource.org/licenses/CNRI-Python" ], "isOsiApproved": true }, { "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": 46, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", "referenceNumber": 47, "name": "X11 License", "licenseId": "X11", "seeAlso": [ "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", "referenceNumber": 48, "name": "GD License", "licenseId": "GD", "seeAlso": [ "https://libgd.github.io/manuals/2.3.0/files/license-txt.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", "referenceNumber": 49, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/DSDP" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", "referenceNumber": 50, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": [ "https://cdla.io/permissive-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", "referenceNumber": 51, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", "referenceNumber": 52, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License" ], "isOsiApproved": false }, { "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": 53, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", "referenceNumber": 54, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": [ "https://github.com/Neo23x0/sigma/blob/master/LICENSE.Detection.Rules.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", "referenceNumber": 55, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": [ "http://www.unicode.org/copyright.html" ], "isOsiApproved": true }, { "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": 56, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", "referenceNumber": 57, "name": "DOC License", "licenseId": "DOC", "seeAlso": [ "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", "https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", "referenceNumber": 58, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dc9f95c2f3f2ffb5e0ae55fe7388af75547660941" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", "referenceNumber": 59, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": [ "http://legacy.imatix.com/html/sfl/sfl4.htm#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", "referenceNumber": 60, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3a.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", "referenceNumber": 61, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CUA-OPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", "referenceNumber": 62, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": [ "https://opensource.org/licenses/Xnet" ], "isOsiApproved": true }, { "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": 63, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", "referenceNumber": 64, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", "referenceNumber": 65, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", "referenceNumber": 66, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": [ "http://www.cs.fsu.edu/~engelen/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", "referenceNumber": 67, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": [ "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE" ], "isOsiApproved": true }, { "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": 68, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", "referenceNumber": 69, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": [ "http://labs.metacarta.com/license-explanation.html#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 70, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", "referenceNumber": 71, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 72, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/at/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", "referenceNumber": 73, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", "referenceNumber": 74, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": [ "https://opensource.org/licenses/CATOSL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", "referenceNumber": 75, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Leptonica" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", "referenceNumber": 76, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.51/" ], "isOsiApproved": false }, { "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": 77, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/at/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", "referenceNumber": 78, "name": "psutils License", "licenseId": "psutils", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psutils" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", "referenceNumber": 79, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", "referenceNumber": 80, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": [ "http://doc.qt.nokia.com/3.3/license.html", "https://opensource.org/licenses/QPL-1.0", "https://doc.qt.io/archives/3.3/license.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", "referenceNumber": 81, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.1.html", "https://opensource.org/licenses/MPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 82, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", "referenceNumber": 83, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": [ "https://www.tapr.org/OHL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", "referenceNumber": 84, "name": "ICU License", "licenseId": "ICU", "seeAlso": [ "http://source.icu-project.org/repos/icu/icu/trunk/license.html" ], "isOsiApproved": false }, { "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": 85, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": [ "https://www.gnu.org/software/classpath/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", "referenceNumber": 86, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": [ "http://www.php.net/license/3_0.txt", "https://opensource.org/licenses/PHP-3.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", "referenceNumber": 87, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", "referenceNumber": 88, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dd32cf54a32d581ab475d23c810b0a7fbaf8d63c3" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 89, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SAX-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", "referenceNumber": 90, "name": "Sax Public Domain Notice", "licenseId": "SAX-PD", "seeAlso": [ "http://www.saxproject.org/copying.html" ], "isOsiApproved": false }, { "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": 91, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", "referenceNumber": 92, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": [ "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision\u003d326823" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", "referenceNumber": 93, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003darch/powerpc/cpu/ppc4xx/miiphy.c;h\u003d297155fdafa064b955e53e9832de93bfb0cfb85b;hb\u003d9fab4bf4cc077c21e43941866f3f2c196f28670d" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", "referenceNumber": 94, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT#Modern_Variants", "https://ptolemy.berkeley.edu/copyright.htm", "https://pirlwww.lpl.arizona.edu/resources/guide/software/PerlTk/Tixlic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", "referenceNumber": 95, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": [ "https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", "referenceNumber": 96, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Glulxe" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", "referenceNumber": 97, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", "referenceNumber": 98, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": [ "https://opensource.org/licenses/Sleepycat" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", "referenceNumber": 99, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": [ "http://www.geuz.org/gl2ps/COPYING.GL2PS" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", "referenceNumber": 100, "name": "Licence Libre du Québec – Réciprocité forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-Rplus-1.1" ], "isOsiApproved": true }, { "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": 101, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", "referenceNumber": 102, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#feh" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", "referenceNumber": 103, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": [ "https://unlicense.org/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", "referenceNumber": 104, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", "referenceNumber": 105, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": [ "https://opensource.org/licenses/NGPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", "referenceNumber": 106, "name": "bzip2 and libbzip2 License v1.0.6", "licenseId": "bzip2-1.0.6", "seeAlso": [ "https://sourceware.org/git/?p\u003dbzip2.git;a\u003dblob;f\u003dLICENSE;hb\u003dbzip2-1.0.6", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", "referenceNumber": 107, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT?rd\u003dLicensing/MIT#CMU_Style", "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", "referenceNumber": 108, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d4bc786f34b50aa301be6f5600f58a980070f481e" ], "isOsiApproved": false }, { "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": 109, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", "referenceNumber": 110, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 111, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", "referenceNumber": 112, "name": "Fair License", "licenseId": "Fair", "seeAlso": [ "http://fairlicense.org/", "https://opensource.org/licenses/Fair" ], "isOsiApproved": true }, { "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": 113, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", "referenceNumber": 114, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", "referenceNumber": 115, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": [ "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html" ], "isOsiApproved": false }, { "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": 116, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", "referenceNumber": 117, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", "referenceNumber": 118, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": [ "https://opensource.org/licenses/Motosoto" ], "isOsiApproved": true }, { "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": 119, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", "referenceNumber": 120, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", "referenceNumber": 121, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", "referenceNumber": 122, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": [ "https://creativecommons.org/licenses/publicdomain/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", "referenceNumber": 123, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Saxpath_License" ], "isOsiApproved": false }, { "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": 124, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", "referenceNumber": 125, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", "referenceNumber": 126, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": [ "http://www.faqs.org/rfcs/rfc1321.html" ], "isOsiApproved": false }, { "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": 127, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", "referenceNumber": 128, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", "referenceNumber": 129, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": [ "http://svnkit.com/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", "referenceNumber": 130, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", "referenceNumber": 131, "name": "NRL License", "licenseId": "NRL", "seeAlso": [ "http://web.mit.edu/network/isakmp/nrllicense.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", "referenceNumber": 132, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": [ "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 133, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", "referenceNumber": 134, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Computational-Use-of-Data-Agreement/blob/master/C-UDA-1.0.md", "https://cdla.dev/computational-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", "referenceNumber": 135, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d37b4b3f6cc4bf34e1d3dec61e69914b9819d8894" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", "referenceNumber": 136, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": [ "http://www.opencascade.com/content/occt-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", "referenceNumber": 137, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": [ "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", "referenceNumber": 138, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": [ "https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", "referenceNumber": 139, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "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": 140, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", "referenceNumber": 141, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TOSL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", "referenceNumber": 142, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": [ "http://www.unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", "referenceNumber": 143, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": [ "https://epics.anl.gov/license/open.php" ], "isOsiApproved": false }, { "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": 144, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", "referenceNumber": 145, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", "referenceNumber": 146, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d1cae062821881f41b73012ba816434897abf4205" ], "isOsiApproved": false }, { "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": 147, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 148, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", "referenceNumber": 149, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": [ "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev\u003d1.2" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", "referenceNumber": 150, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Wsuipa" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", "referenceNumber": 151, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL/", "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", "referenceNumber": 152, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": [ "http://www.opendatacommons.org/licenses/odbl/1.0/", "https://opendatacommons.org/licenses/odbl/1-0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 153, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/small-business/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", "referenceNumber": 154, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": [ "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c" ], "isOsiApproved": false }, { "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": 155, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", "referenceNumber": 156, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": [ "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", "referenceNumber": 157, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": [ "https://cdla.io/sharing-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", "referenceNumber": 158, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": [ "http://www.osetfoundation.org/public-license", "https://opensource.org/licenses/OPL-2.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", "referenceNumber": 159, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": [ "https://opensource.org/licenses/OSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", "referenceNumber": 160, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": [ "https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE", "https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", "referenceNumber": 161, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": [ "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1\u003d1.1\u0026r2\u003d1.1.1.1\u0026diff_format\u003ds" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", "referenceNumber": 162, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", "referenceNumber": 163, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": [ "http://glassfish.java.net/public/CDDL+GPL_1_1.html", "https://javaee.github.io/glassfish/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", "referenceNumber": 164, "name": "JSON License", "licenseId": "JSON", "seeAlso": [ "http://www.json.org/license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", "referenceNumber": 165, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": [ "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", "https://opensource.org/licenses/W3C" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", "referenceNumber": 166, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", "referenceNumber": 167, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3c.txt", "https://opensource.org/licenses/LPPL-1.3c" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", "referenceNumber": 168, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": [ "http://www.ruby-lang.org/en/LICENSE.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 169, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode" ], "isOsiApproved": false }, { "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": 170, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 171, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", "referenceNumber": 172, "name": "curl License", "licenseId": "curl", "seeAlso": [ "https://github.com/bagder/curl/blob/master/COPYING" ], "isOsiApproved": false }, { "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": 173, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 174, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", "referenceNumber": 175, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": [ "http://www.info-zip.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", "referenceNumber": 176, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": [ "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", "referenceNumber": 177, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", "referenceNumber": 178, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", "referenceNumber": 179, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": [ "https://www.smlnj.org/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 180, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", "referenceNumber": 181, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/libtiff" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", "referenceNumber": 182, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": [ "https://paritylicense.com/versions/7.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", "referenceNumber": 183, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h\u003dv4.19" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", "referenceNumber": 184, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": [ "http://artlibre.org/licence/lal/licence-art-libre-12/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", "referenceNumber": 185, "name": "Multics License", "licenseId": "Multics", "seeAlso": [ "https://opensource.org/licenses/Multics" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", "referenceNumber": 186, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": [ "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", "referenceNumber": 187, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp" ], "isOsiApproved": false }, { "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": 188, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": [ "https://www.open-mpi.org/community/license.php", "http://www.netlib.org/lapack/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", "referenceNumber": 189, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/OSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 190, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", "referenceNumber": 191, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": [ "http://freeimage.sourceforge.net/freeimage-license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", "referenceNumber": 192, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": [ "http://ecos.sourceware.org/old-license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", "referenceNumber": 193, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", "referenceNumber": 194, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", "referenceNumber": 195, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", "referenceNumber": 196, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": [ "http://www.users.on.net/~triforce/glidexp/COPYING.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", "referenceNumber": 197, "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", "licenseId": "PDDL-1.0", "seeAlso": [ "http://opendatacommons.org/licenses/pddl/1.0/", "https://opendatacommons.org/licenses/pddl/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", "referenceNumber": 198, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.0.html", "https://opensource.org/licenses/MPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", "referenceNumber": 199, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-2-Clause" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 200, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", "referenceNumber": 201, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": [ "https://github.com/CommunitySpecification/1.0/blob/master/1._Community_Specification_License-v1.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", "referenceNumber": 202, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": [ "http://www.wtfpl.net/about/", "http://sam.zoy.org/wtfpl/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", "referenceNumber": 203, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", "referenceNumber": 204, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": [ "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", "referenceNumber": 205, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", "referenceNumber": 206, "name": "Licence Libre du Québec – Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": [ "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", "http://opensource.org/licenses/LiLiQ-P-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", "referenceNumber": 207, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Abstyles" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", "referenceNumber": 208, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", "referenceNumber": 209, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": [ "https://helixcommunity.org/content/rpsl", "https://opensource.org/licenses/RPSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", "referenceNumber": 210, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": [ "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln\u003d4-9", "https://sqlite.org/src/artifact/df5091916dbb40e6" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", "referenceNumber": 211, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FDK-AAC", "https://directory.fsf.org/wiki/License:Fdk" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", "referenceNumber": 212, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": [ "https://opensource.org/licenses/ECL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", "referenceNumber": 213, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": [ "http://ti.arc.nasa.gov/opensource/nosa/", "https://opensource.org/licenses/NASA-1.3" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", "referenceNumber": 214, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": [ "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", "referenceNumber": 215, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", "referenceNumber": 216, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MITNFA" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", "referenceNumber": 217, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": [ "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", "referenceNumber": 218, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.1/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", "referenceNumber": 219, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", "referenceNumber": 220, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": [ "http://www.smlnj.org//license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 221, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", "referenceNumber": 222, "name": "Vim License", "licenseId": "Vim", "seeAlso": [ "http://vimdoc.sourceforge.net/htmldoc/uganda.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", "referenceNumber": 223, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": [ "http://rc.quest.com/topics/openssh/license.php#tcpwrappers" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", "referenceNumber": 224, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": [ "https://opensource.org/licenses/SPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", "referenceNumber": 225, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": [ "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c" ], "isOsiApproved": false }, { "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": 226, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", "referenceNumber": 227, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", "referenceNumber": 228, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": [ "http://www.freebsd.org/copyright/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", "referenceNumber": 229, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": [ "http://www.eiffel-nice.org/license/forum.txt", "https://opensource.org/licenses/EFL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", "referenceNumber": 230, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": [ "http://opencontent.org/openpub/", "https://www.debian.org/opl", "https://www.ctan.org/license/opl" ], "isOsiApproved": false }, { "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": 231, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", "referenceNumber": 232, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "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": 233, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", "referenceNumber": 234, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", "referenceNumber": 235, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": [ "https://opensource.org/licenses/UCL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", "referenceNumber": 236, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": [ "https://opensource.org/licenses/Naumen" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", "referenceNumber": 237, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", "referenceNumber": 238, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": [ "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", "referenceNumber": 239, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", "referenceNumber": 240, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": [ "https://opensource.org/licenses/attribution" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", "referenceNumber": 241, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 242, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", "referenceNumber": 243, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Dotseqn" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", "referenceNumber": 244, "name": "GNU Library General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", "referenceNumber": 245, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", "referenceNumber": 246, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/" ], "isOsiApproved": false }, { "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": 247, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", "referenceNumber": 248, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": [ "http://www.openoffice.org/licenses/sissl_license.html", "https://opensource.org/licenses/SISSL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", "referenceNumber": 249, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/LBNLBSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", "referenceNumber": 250, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", "referenceNumber": 251, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 252, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", "referenceNumber": 253, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": [ "http://www.erlang.org/EPLICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", "referenceNumber": 254, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/dvipdfm" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", "referenceNumber": 255, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": [ "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", "https://opensource.org/licenses/OGTSL" ], "isOsiApproved": true }, { "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": 256, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", "referenceNumber": 257, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": [ "https://github.com/htacg/tidy-html5/blob/next/README/LICENSE.md" ], "isOsiApproved": false }, { "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": 258, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", "referenceNumber": 259, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", "referenceNumber": 260, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/XSkat_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", "referenceNumber": 261, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": [ "http://www.opensource.apple.com/license/apsl/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", "referenceNumber": 262, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", "referenceNumber": 263, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-PL" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 264, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": [ "http://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", "referenceNumber": 265, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": [ "http://landley.net/toybox/license.html", "https://opensource.org/licenses/0BSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", "referenceNumber": 266, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SWL" ], "isOsiApproved": false }, { "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": 267, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", "referenceNumber": 268, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d470b0c18ec67621c85881b2733057fecf4a1acc3" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", "referenceNumber": 269, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": [ "https://cdla.dev/permissive-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", "referenceNumber": 270, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", "referenceNumber": 271, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": [ "https://opensource.org/licenses/IPA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", "referenceNumber": 272, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", "referenceNumber": 273, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd\u003dLicensing/CrystalStacker" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", "referenceNumber": 274, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": [ "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", "https://opensource.org/licenses/OSL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", "referenceNumber": 275, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", "referenceNumber": 276, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": [ "http://ec.europa.eu/idabc/en/document/7330.html", "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id\u003d31096" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/D-FSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", "referenceNumber": 277, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": [ "http://www.dipp.nrw.de/d-fsl/lizenzen/", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", "referenceNumber": 278, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Qhull" ], "isOsiApproved": false }, { "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": 279, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", "referenceNumber": 280, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": [ "https://www.mongodb.com/licensing/server-side-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", "referenceNumber": 281, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": [ "http://otm.illinois.edu/uiuc_openSource", "https://opensource.org/licenses/NCSA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", "referenceNumber": 282, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": [ "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", "https://opensource.org/licenses/EUDatagrid" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", "referenceNumber": 283, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcd1284c4a91a8a380d904eee68d1583f989ed386" ], "isOsiApproved": false }, { "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": 284, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", "referenceNumber": 285, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", "referenceNumber": 286, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#enna" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", "referenceNumber": 287, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", "referenceNumber": 288, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": [ "http://data.norge.no/nlod/en/2.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", "referenceNumber": 289, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", "referenceNumber": 290, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": [ "https://opensource.org/licenses/UPL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", "referenceNumber": 291, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": [ "http://www.apache.org/licenses/LICENSE-1.0" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", "referenceNumber": 292, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": [ "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", "referenceNumber": 293, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": [ "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", "referenceNumber": 294, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": [ "https://opendatacommons.org/licenses/by/1.0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", "referenceNumber": 295, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", "referenceNumber": 296, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/app/iceauth/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xvinfo/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xsetroot/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xauth/-/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", "referenceNumber": 297, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": [ "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", "referenceNumber": 298, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", "referenceNumber": 299, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xerox" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", "referenceNumber": 300, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", "referenceNumber": 301, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", "referenceNumber": 302, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": [ "http://www.unidata.ucar.edu/software/netcdf/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", "referenceNumber": 303, "name": "ANTLR Software Rights Notice with license fallback", "licenseId": "ANTLR-PD-fallback", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", "referenceNumber": 304, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": [ "http://www.oclc.org/research/activities/software/license/v2final.htm", "https://opensource.org/licenses/OCLC-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", "referenceNumber": 305, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcbf50f4e1185a21abd4c0a54d3f4341fe28f36ea" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", "referenceNumber": 306, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Rdisc_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", "referenceNumber": 307, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db6d68acd14e51ca3aab4428bf26522aa74873f0e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", "referenceNumber": 308, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": [ "https://opensource.org/licenses/nokia" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", "referenceNumber": 309, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Nunit" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", "referenceNumber": 310, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-2.1.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", "referenceNumber": 311, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", "referenceNumber": 312, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": [ "http://www.opensource.apple.com/cdl/", "https://fedoraproject.org/wiki/Licensing/Common_Documentation_License", "https://www.gnu.org/licenses/license-list.html#ACDL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", "referenceNumber": 313, "name": "W3C Software Notice and Document License (2015-05-13)", "licenseId": "W3C-20150513", "seeAlso": [ "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", "referenceNumber": 314, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": [ "https://opensource.org/licenses/LPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", "referenceNumber": 315, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": [ "http://www.tcl.tk/software/tcltk/license.html", "https://fedoraproject.org/wiki/Licensing/TCL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", "referenceNumber": 316, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": [ "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", "referenceNumber": 317, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Gnuplot" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 318, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/nl/legalcode" ], "isOsiApproved": false }, { "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": 319, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", "referenceNumber": 320, "name": "XPP License", "licenseId": "xpp", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/xpp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", "referenceNumber": 321, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": [ "https://joinup.ec.europa.eu/page/eupl-text-11-12", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt", "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri\u003dCELEX:32017D0863", "https://opensource.org/licenses/EUPL-1.2" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", "referenceNumber": 322, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", "referenceNumber": 323, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": [ "https://opensource.org/licenses/IPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", "referenceNumber": 324, "name": "ISC License", "licenseId": "ISC", "seeAlso": [ "https://www.isc.org/licenses/", "https://www.isc.org/downloads/software-support-policy/isc-license/", "https://opensource.org/licenses/ISC" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", "referenceNumber": 325, "name": "Zed License", "licenseId": "Zed", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Zed" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", "referenceNumber": 326, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": [ "https://opensource.org/licenses/ECL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", "referenceNumber": 327, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:BSD#Modification_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", "referenceNumber": 328, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": [ "http://research.cs.wisc.edu/condor/license.html#condor", "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", "referenceNumber": 329, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": [ "https://mariadb.com/bsl11/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", "referenceNumber": 330, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": [ "https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" ], "isOsiApproved": false }, { "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": 331, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", "referenceNumber": 332, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": [ "https://opensource.org/licenses/VSL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", "referenceNumber": 333, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", "referenceNumber": 334, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": [ "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", "referenceNumber": 335, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": [ "http://plan9.bell-labs.com/plan9/license.html", "https://opensource.org/licenses/LPL-1.02" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", "referenceNumber": 336, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", "referenceNumber": 337, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", "referenceNumber": 338, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", "referenceNumber": 339, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": [ "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", "https://opensource.org/licenses/OSL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", "referenceNumber": 340, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", "referenceNumber": 341, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db0d176738e96a0d3b9f85cb51e140a86f21be715" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", "referenceNumber": 342, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": [ "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", "referenceNumber": 343, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.1.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", "referenceNumber": 344, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": [ "http://old.zope.org/Resources/ZPL/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", "referenceNumber": 345, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": [ "http://www.perlfoundation.org/artistic_license_2_0", "https://www.perlfoundation.org/artistic-license-20.html", "https://opensource.org/licenses/artistic-license-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", "referenceNumber": 346, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": [ "https://opensource.org/licenses/WXwindows" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", "referenceNumber": 347, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": [ "http://www.php.net/license/3_01.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", "referenceNumber": 348, "name": "libpng License", "licenseId": "Libpng", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "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": 349, "name": "BSD 3-Clause No Nuclear License", "licenseId": "BSD-3-Clause-No-Nuclear-License", "seeAlso": [ "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam\u003d1467140197_43d516ce1776bd08a58235a7785be1cc" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", "referenceNumber": 350, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", "referenceNumber": 351, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": [ "https://metadata.ftp-master.debian.org/changelogs//main/a/arpwatch/arpwatch_2.1a15-7_copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", "referenceNumber": 352, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": [ "http://apache.org/licenses/LICENSE-1.1", "https://opensource.org/licenses/Apache-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", "referenceNumber": 353, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": [ "http://data.norge.no/nlod/en/1.0" ], "isOsiApproved": false }, { "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": 354, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", "referenceNumber": 355, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": [ "http://research.scea.com/scea_shared_source_license.html" ], "isOsiApproved": false }, { "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": 356, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "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": 357, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", "referenceNumber": 358, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 359, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": [ "https://www.gnu.org/licenses/gcc-exception-3.1.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", "referenceNumber": 360, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", "referenceNumber": 361, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": [ "https://blueoakcouncil.org/license/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", "referenceNumber": 362, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL2/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", "referenceNumber": 363, "name": "AMD\u0027s plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", "referenceNumber": 364, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": [ "https://opensource.org/licenses/Frameworx-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", "referenceNumber": 365, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": [ "http://www.zimbra.com/legal/zimbra-public-license-1-4" ], "isOsiApproved": false }, { "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": 366, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", "referenceNumber": 367, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": [ "https://opensource.org/licenses/Entessa" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", "referenceNumber": 368, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": [ "http://www.eclipse.org/legal/epl-v10.html", "https://opensource.org/licenses/EPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", "referenceNumber": 369, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", "referenceNumber": 370, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": [ "http://liballeg.org/license.html#allegro-4-the-giftware-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", "referenceNumber": 371, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", "referenceNumber": 372, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": [ "http://bits.netizen.com.au/licenses/NOSL/nosl.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", "referenceNumber": 373, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Borceux" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", "referenceNumber": 374, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": [ "http://www.python.org/download/releases/1.6.1/download_win/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", "referenceNumber": 375, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Noweb" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", "referenceNumber": 376, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", "referenceNumber": 377, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-1.1" ], "isOsiApproved": false }, { "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": 378, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", "referenceNumber": 379, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", "referenceNumber": 380, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": [ "http://freetype.fis.uniroma2.it/FTL.TXT", "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT", "http://gitlab.freedesktop.org/freetype/freetype/-/raw/master/docs/FTL.TXT" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 381, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", "referenceNumber": 382, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", "referenceNumber": 383, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": [ "http://www.xfree86.org/current/LICENSE4.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", "referenceNumber": 384, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": [ "https://opensource.org/licenses/RPL-1.5" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", "referenceNumber": 385, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": [ "https://artlibre.org/" ], "isOsiApproved": false }, { "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": 386, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/us/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", "referenceNumber": 387, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", "referenceNumber": 388, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-RL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", "referenceNumber": 389, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": [ "http://www.openldap.org/software/release/license.html" ], "isOsiApproved": true }, { "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": 390, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", "referenceNumber": 391, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": [ "https://opensource.org/licenses/HPND" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", "referenceNumber": 392, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPAL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", "referenceNumber": 393, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": [ "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", "http://www.ncftp.com/ncftp/doc/LICENSE.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 394, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", "referenceNumber": 395, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", "referenceNumber": 396, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": [ "https://www.gnu.org/licenses/ecos-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", "referenceNumber": 397, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": [ "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", "referenceNumber": 398, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution" ], "isOsiApproved": false }, { "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": 399, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", "referenceNumber": 400, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-3-Clause" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", "referenceNumber": 401, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": [ "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", "referenceNumber": 402, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": [ "http://www.postgresql.org/about/licence", "https://opensource.org/licenses/PostgreSQL" ], "isOsiApproved": true }, { "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": 403, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": [ "https://jogamp.org/git/?p\u003dgluegen.git;a\u003dblob_plain;f\u003dLICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", "referenceNumber": 404, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobeLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", "referenceNumber": 405, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", "referenceNumber": 406, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": [ "https://firstdonoharm.dev/version/2/1/license.html", "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", "referenceNumber": 407, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": [ "http://www.codeproject.com/info/cpol10.aspx" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", "referenceNumber": 408, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": [ "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", "https://opensource.org/licenses/RSCPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", "referenceNumber": 409, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": [ "https://opensource.org/licenses/cddl1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", "referenceNumber": 410, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": [ "https://data.gov.tw/license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", "referenceNumber": 411, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psfrag" ], "isOsiApproved": false }, { "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": 412, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", "referenceNumber": 413, "name": "NTP License", "licenseId": "NTP", "seeAlso": [ "https://opensource.org/licenses/NTP" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", "referenceNumber": 414, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": [ "http://www.netbsd.org/about/redistribution.html#default" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", "referenceNumber": 415, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-2.0", "https://opensource.org/licenses/ZPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", "referenceNumber": 416, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": [ "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", "https://opensource.org/licenses/EFL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", "referenceNumber": 417, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": [ "http://www.rosenlaw.com/AFL3.0.htm", "https://opensource.org/licenses/afl-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", "referenceNumber": 418, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": [ "https://enterprise.dejacode.com/licenses/public/naist-2003/#license-text", "https://github.com/nodejs/node/blob/4a19cc8947b1bba2b2d27816ec3d0edf9b28e503/LICENSE#L343" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", "referenceNumber": 419, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", "referenceNumber": 420, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md", "https://cdla.dev/open-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", "referenceNumber": 421, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": [ "http://www.imagemagick.org/script/license.php" ], "isOsiApproved": false }, { "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": 422, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", "referenceNumber": 423, "name": "zlib License", "licenseId": "Zlib", "seeAlso": [ "http://www.zlib.net/zlib_license.html", "https://opensource.org/licenses/Zlib" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", "referenceNumber": 424, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": [ "http://www.jython.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", "referenceNumber": 425, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": [ "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", "referenceNumber": 426, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": [ "https://opensource.org/licenses/Intel" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", "referenceNumber": 427, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", "referenceNumber": 428, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/VOSTROM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", "referenceNumber": 429, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": [ "https://opensource.org/licenses/Watcom-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", "referenceNumber": 430, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", "referenceNumber": 431, "name": "Licence Libre du Québec – Réciprocité version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-R-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", "referenceNumber": 432, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.5/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", "referenceNumber": 433, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", "referenceNumber": 434, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", "referenceNumber": 435, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": [ "https://github.com/aws/mit-0", "https://romanrm.net/mit-zero", "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", "referenceNumber": 436, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", "referenceNumber": 437, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": [ "http://dev.perl.org/licenses/artistic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", "referenceNumber": 438, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d6852b9d90022e8593c98205413380536b1b5a7cf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", "referenceNumber": 439, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html", "https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh", "https://github.com/protegeproject/protege/blob/master/license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", "referenceNumber": 440, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", "referenceNumber": 441, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": [ "https://opensource.org/licenses/NOSL3.0" ], "isOsiApproved": true }, { "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": 442, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.html#FontException" ], "isOsiApproved": false }, { "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": 443, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", "referenceNumber": 444, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d42b0383c50c299977b5893ee695cf4e486fb0dc7" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", "referenceNumber": 445, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xinetd_License" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Net-SNMP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", "referenceNumber": 446, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": [ "http://net-snmp.sourceforge.net/about/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", "referenceNumber": 447, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": [ "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", "referenceNumber": 448, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", "referenceNumber": 449, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", "referenceNumber": 450, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": [ "https://www.apache.org/licenses/LICENSE-2.0", "https://opensource.org/licenses/Apache-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", "referenceNumber": 451, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": [ "https://www.ogc.org/ogc/software/1.0" ], "isOsiApproved": false }, { "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": 452, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": [ "https://www.gnu.org/licenses/autoconf-exception-3.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", "referenceNumber": 453, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003ddf2cc1e21eb7c160695f5b7cffd6296c151ba188" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", "referenceNumber": 454, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", "referenceNumber": 455, "name": "Mup License", "licenseId": "Mup", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Mup" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", "referenceNumber": 456, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": [ "https://creativecommons.org/publicdomain/zero/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", "referenceNumber": 457, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Beerware", "https://people.freebsd.org/~phk/" ], "isOsiApproved": false }, { "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": 458, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", "referenceNumber": 459, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": [ "https://www.freebsd.org/copyright/freebsd-doc-license/" ], "isOsiApproved": false }, { "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": 460, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/au/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", "referenceNumber": 461, "name": "Open Market License", "licenseId": "OML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Open_Market_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", "referenceNumber": 462, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": [ "http://www.openssl.org/source/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", "referenceNumber": 463, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MakeIndex" ], "isOsiApproved": false }, { "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": 464, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", "referenceNumber": 465, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 466, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", "referenceNumber": 467, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": [ "https://opensource.org/licenses/BSDplusPatent" ], "isOsiApproved": true }, { "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": 468, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 469, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", "referenceNumber": 470, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": [ "https://opensource.org/licenses/SimPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", "referenceNumber": 471, "name": "Barr License", "licenseId": "Barr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Barr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", "referenceNumber": 472, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": [ "http://www.boost.org/LICENSE_1_0.txt", "https://opensource.org/licenses/BSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", "referenceNumber": 473, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": [ "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", "referenceNumber": 474, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": [ "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", "referenceNumber": 475, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": [ "https://coil.apotheon.org/plaintext/01.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", "referenceNumber": 476, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": [ "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", "https://fedoraproject.org/wiki/Licensing/Open_Public_License" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 477, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true } ], "releaseDate": "2021-11-14" }reuse-tool-0.14.0/src/reuse/resources/licenses.json.license000066400000000000000000000001441416231101000237230ustar00rootroot00000000000000# SPDX-FileCopyrightText: Linux Foundation and its Contributors # # SPDX-License-Identifier: CC0-1.0reuse-tool-0.14.0/src/reuse/spdx.py000066400000000000000000000022471416231101000171260ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Compilation of the SPDX Document.""" import contextlib import logging import sys from gettext import gettext as _ from ._util import PathType from .project import Project from .report import ProjectReport _LOGGER = logging.getLogger(__name__) def add_arguments(parser) -> None: """Add arguments to the parser.""" parser.add_argument( "--output", "-o", dest="file", action="store", type=PathType("w") ) def run(args, project: Project, out=sys.stdout) -> int: """Print the project's bill of materials.""" if args.file: out = args.file.open("w", encoding="UTF-8") if args.file.suffix != ".spdx": _LOGGER.warning( _("'{path}' does not end with .spdx").format(path=out.name) ) report = ProjectReport.generate( project, multiprocessing=not args.no_multiprocessing ) out.write(report.bill_of_materials()) # Don't close sys.stdout or StringIO if args.file: with contextlib.suppress(Exception): out.close() return 0 reuse-tool-0.14.0/src/reuse/supported_licenses.py000066400000000000000000000015221416231101000220550ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """supported-licenses command handler""" import sys from ._licenses import _LICENSES, _load_license_list from .project import Project # pylint: disable=unused-argument def add_arguments(parser) -> None: """Add arguments to the parser.""" def run(args, project: Project, out=sys.stdout): """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( "{: <40}\t{: <80}\t{: <50}\n".format( license_id, license_name, license_reference ) ) return 0 reuse-tool-0.14.0/src/reuse/templates/000077500000000000000000000000001416231101000175675ustar00rootroot00000000000000reuse-tool-0.14.0/src/reuse/templates/default_template.jinja2000066400000000000000000000002571416231101000242110ustar00rootroot00000000000000{% for copyright_line in copyright_lines %} {{ copyright_line }} {% endfor %} {% for expression in spdx_expressions %} SPDX-License-Identifier: {{ expression }} {% endfor %} reuse-tool-0.14.0/src/reuse/templates/default_template.jinja2.license000066400000000000000000000001671416231101000256320ustar00rootroot00000000000000SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC0-1.0 reuse-tool-0.14.0/src/reuse/vcs.py000066400000000000000000000147421416231101000167460ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2020 John Mulligan # # SPDX-License-Identifier: GPL-3.0-or-later """This module deals with version control systems.""" import logging import os from abc import ABC, abstractmethod from os import PathLike from pathlib import Path from typing import Optional, Set from ._util import GIT_EXE, HG_EXE, execute_command _LOGGER = logging.getLogger(__name__) class VCSStrategy(ABC): """Strategy pattern for version control systems.""" @abstractmethod def __init__(self, project: "Project"): self.project = project @abstractmethod def is_ignored(self, path: PathLike) -> bool: """Is *path* ignored by the VCS?""" @classmethod @abstractmethod def in_repo(cls, directory: PathLike) -> bool: """Is *directory* inside of the VCS repository? :raises NotADirectoryError: if directory is not a directory. """ @classmethod @abstractmethod def find_root(cls, cwd: PathLike = None) -> Optional[Path]: """Try to find the root of the project from *cwd*. If none is found, return None. :raises NotADirectoryError: if directory is not a directory. """ 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: PathLike) -> bool: return False @classmethod def in_repo(cls, directory: PathLike) -> bool: return False @classmethod def find_root(cls, cwd: PathLike = None) -> Optional[Path]: return None class VCSStrategyGit(VCSStrategy): """Strategy that is used for Git.""" def __init__(self, project): super().__init__(project) if not GIT_EXE: raise FileNotFoundError("Could not find binary for Git") self._all_ignored_files = self._find_all_ignored_files() 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. """ command = [ GIT_EXE, "ls-files", "--exclude-standard", "--ignored", "--others", "--directory", # TODO: This flag is unexpected. I reported it as a bug in Git. # This flag---counter-intuitively---lists untracked directories # that contain ignored files. "--no-empty-directory", # Separate output with \0 instead of \n. "-z", ] result = execute_command(command, _LOGGER, cwd=self.project.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} def is_ignored(self, path: PathLike) -> bool: path = self.project.relative_from_root(path) return path in self._all_ignored_files @classmethod def in_repo(cls, directory: PathLike) -> bool: if directory is None: directory = Path.cwd() if not Path(directory).is_dir(): raise NotADirectoryError() command = [GIT_EXE, "status"] result = execute_command(command, _LOGGER, cwd=directory) return not result.returncode @classmethod def find_root(cls, cwd: PathLike = None) -> Optional[Path]: if cwd is None: cwd = Path.cwd() if not Path(cwd).is_dir(): raise NotADirectoryError() command = [GIT_EXE, "rev-parse", "--show-toplevel"] result = execute_command(command, _LOGGER, cwd=cwd) if not result.returncode: path = result.stdout.decode("utf-8")[:-1] return Path(os.path.relpath(path, cwd)) return None class VCSStrategyHg(VCSStrategy): """Strategy that is used for Mercurial.""" def __init__(self, project: "Project"): super().__init__(project) if not HG_EXE: 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]: """Return a set of all files ignored by mercurial. If a whole directory is ignored, don't return all files inside of it. """ command = [ HG_EXE, "status", "--ignored", # terse is marked 'experimental' in the hg help but is documented # in the man page. It collapses the output of a dir containing only # ignored files to the ignored name like the git command does. # TODO: Re-enable this flag in the future. # "--terse=i", "--no-status", "--print0", ] result = execute_command(command, _LOGGER, cwd=self.project.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} def is_ignored(self, path: PathLike) -> bool: path = self.project.relative_from_root(path) return path in self._all_ignored_files @classmethod def in_repo(cls, directory: PathLike) -> bool: if directory is None: directory = Path.cwd() if not Path(directory).is_dir(): raise NotADirectoryError() command = [HG_EXE, "root"] result = execute_command(command, _LOGGER, cwd=directory) return not result.returncode @classmethod def find_root(cls, cwd: PathLike = None) -> Optional[Path]: if cwd is None: cwd = Path.cwd() if not Path(cwd).is_dir(): raise NotADirectoryError() command = [HG_EXE, "root"] result = execute_command(command, _LOGGER, cwd=cwd) if not result.returncode: path = result.stdout.decode("utf-8")[:-1] return Path(os.path.relpath(path, cwd)) return None def find_root(cwd: PathLike = None) -> Optional[Path]: """Try to find the root of the project from *cwd*. If none is found, return None. :raises NotADirectoryError: if directory is not a directory. """ if GIT_EXE: root = VCSStrategyGit.find_root(cwd=cwd) if root: return root if HG_EXE: root = VCSStrategyHg.find_root(cwd=cwd) if root: return root return None reuse-tool-0.14.0/tests/000077500000000000000000000000001416231101000150215ustar00rootroot00000000000000reuse-tool-0.14.0/tests/conftest.py000066400000000000000000000221611416231101000172220ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Global fixtures and configuration.""" # pylint: disable=redefined-outer-name,subprocess-run-check import datetime import logging import multiprocessing as mp import os import shutil import subprocess import sys from inspect import cleandoc from io import StringIO from pathlib import Path from typing import Optional from unittest.mock import create_autospec import pytest from debian.copyright import Copyright from jinja2 import Environment os.environ["LC_ALL"] = "C" # 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 # reason), then an ImportError is raised. try: # pylint: disable=unused-import import reuse except ImportError: sys.path.append(os.path.join(Path(__file__).parent.parent, "src")) finally: from reuse._util import GIT_EXE, HG_EXE, setup_logging CWD = Path.cwd() TESTS_DIRECTORY = Path(__file__).parent.resolve() RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" def pytest_configure(): """Called after command line options have been parsed and all plugins and initial conftest files been loaded. """ setup_logging(level=logging.DEBUG) def pytest_runtest_setup(item): """Called before running a test.""" # pylint: disable=unused-argument # Make sure to restore CWD os.chdir(CWD) @pytest.fixture() def git_exe() -> str: """Run the test with git.""" if not GIT_EXE: pytest.skip("cannot run this test without git") yield GIT_EXE @pytest.fixture() def hg_exe() -> str: """Run the test with mercurial (hg).""" if not HG_EXE: pytest.skip("cannot run this test without mercurial") yield HG_EXE @pytest.fixture(params=[True, False]) def multiprocessing(request, monkeypatch) -> bool: """Run the test with or without multiprocessing.""" if not request.param: monkeypatch.delattr(mp, "Pool") yield request.param @pytest.fixture() def empty_directory(tmpdir_factory) -> Path: """Create a temporary empty directory.""" directory = Path(str(tmpdir_factory.mktemp("empty_directory"))) os.chdir(str(directory)) return directory @pytest.fixture() def fake_repository(tmpdir_factory) -> Path: """Create a temporary fake repository.""" directory = Path(str(tmpdir_factory.mktemp("fake_repository"))) for file_ in (RESOURCES_DIRECTORY / "fake_repository").iterdir(): if file_.is_file(): shutil.copy(file_, directory / file_.name) elif file_.is_dir(): shutil.copytree(file_, directory / file_.name) # 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 Mary Sue\n" "SPDX" "-License-Identifier: GPL-3.0-or-later WITH Autoconf-exception-3.0" ) (directory / "src/custom.py").write_text( "SPDX-FileCopyrightText: 2017 Mary Sue\n" "SPDX" "-License-Identifier: LicenseRef-custom" ) os.chdir(directory) return directory def _repo_contents( fake_repository, ignore_filename=".gitignore", ignore_prefix="" ): """Generate contents for a vcs repository. Currently defaults to git-like behavior for ignoring files with the expectation that other tools can be configured to ignore files by just chanigng the ignore-file-name and enabling git-like behavior with a prefix line in the ignore file. """ gitignore = ignore_prefix + ( "# SPDX" "-License-Identifier: CC0-1.0\n" "# SPDX" "-FileCopyrightText: 2017 Mary Sue\n" "*.pyc\nbuild" ) (fake_repository / ignore_filename).write_text(gitignore) (fake_repository / "LICENSES/CC0-1.0.txt").write_text("License text") for file_ in (fake_repository / "src").iterdir(): if file_.suffix == ".py": file_.with_suffix(".pyc").write_text("foo") build_dir = fake_repository / "build" build_dir.mkdir() (build_dir / "hello.py").write_text("foo") @pytest.fixture() def git_repository(fake_repository: Path, git_exe: Optional[str]) -> Path: """Create a git repository with ignored files.""" os.chdir(fake_repository) _repo_contents(fake_repository) subprocess.run([git_exe, "init", str(fake_repository)]) subprocess.run([git_exe, "add", str(fake_repository)]) subprocess.run( [ git_exe, "-c", "user.name", "Example", "-c", "user.email", "example@example.com", "commit", "-m", "initial", ] ) return fake_repository @pytest.fixture() def hg_repository(fake_repository: Path, hg_exe: Optional[str]) -> Path: """Create a mercurial repository with ignored files.""" os.chdir(fake_repository) _repo_contents( fake_repository, ignore_filename=".hgignore", ignore_prefix="syntax:glob", ) subprocess.run([hg_exe, "init", "."]) subprocess.run([hg_exe, "addremove"]) subprocess.run( [ hg_exe, "commit", "--user", "Example ", "-m", "initial", ] ) return fake_repository @pytest.fixture() def submodule_repository( git_repository: Path, git_exe: Optional[str], tmpdir_factory ) -> Path: """Create a git repository that contains a submodule.""" header = cleandoc( """ spdx-FileCopyrightText: 2019 Jane Doe spdx-License-Identifier: CC0-1.0 """ ).replace("spdx", "SPDX") submodule = Path(str(tmpdir_factory.mktemp("submodule"))) (submodule / "foo.py").write_text(header) os.chdir(submodule) subprocess.run([git_exe, "init", str(submodule)]) subprocess.run([git_exe, "add", str(submodule)]) subprocess.run( [ git_exe, "-c", "user.name", "Example", "-c", "user.email", "example@example.com", "commit", "-m", "initial", ] ) os.chdir(git_repository) subprocess.run( [git_exe, "submodule", "add", str(submodule.resolve()), "submodule"] ) subprocess.run( [ git_exe, "-c", "user.name", "Example", "-c", "user.email", "example@example.com", "commit", "-m", "add submodule", ] ) (git_repository / ".gitmodules.license").write_text(header) return git_repository @pytest.fixture(scope="session") def copyright(): """Create a dep5 Copyright object.""" with (RESOURCES_DIRECTORY / "fake_repository/.reuse/dep5").open() as fp: return Copyright(fp) @pytest.fixture() def stringio(): """Create a StringIO object.""" return StringIO() @pytest.fixture() def binary_string(): """Create a binary string.""" return bytes(range(256)) @pytest.fixture() def template_simple_source(): """Source code of simple Jinja2 template.""" return cleandoc( """ Hello, world! {% for copyright_line in copyright_lines %} {{ copyright_line }} {% endfor %} {% for expression in spdx_expressions %} spdx-License-Identifier: {{ expression }} {% endfor %} """.replace( "spdx-Lic", "SPDX-Lic" ) ) @pytest.fixture() def template_simple(template_simple_source): """Provide a simple Jinja2 template.""" env = Environment(trim_blocks=True) return env.from_string(template_simple_source) @pytest.fixture() def template_no_spdx_source(): """Source code of Jinja2 template without SPDX lines.""" return "Hello, world" @pytest.fixture() def template_no_spdx(template_no_spdx_source): """Provide a Jinja2 template without SPDX lines.""" env = Environment(trim_blocks=True) return env.from_string(template_no_spdx_source) @pytest.fixture() def template_commented_source(): """Source code of a simple Jinja2 template that is already commented.""" return cleandoc( """ # Hello, world! # {% for copyright_line in copyright_lines %} # {{ copyright_line }} {% endfor %} # {% for expression in spdx_expressions %} # spdx-License-Identifier: {{ expression }} {% endfor %} """.replace( "spdx-Lic", "SPDX-Lic" ) ) @pytest.fixture() def template_commented(template_commented_source): """Provide a Jinja2 template that is already commented.""" env = Environment(trim_blocks=True) return env.from_string(template_commented_source) @pytest.fixture() def mock_date_today(monkeypatch): """Mock away datetime.date.today to always return 2018.""" date = create_autospec(datetime.date) date.today.return_value = datetime.date(2018, 1, 1) monkeypatch.setattr(datetime, "date", date) reuse-tool-0.14.0/tests/resources/000077500000000000000000000000001416231101000170335ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/000077500000000000000000000000001416231101000222405ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/.reuse/000077500000000000000000000000001416231101000234415ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/.reuse/dep5000066400000000000000000000003271416231101000242230ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Some project Upstream-Contact: Mary Sue Source: https://example.com/ Files: doc/* Copyright: 2017 Mary Sue License: CC0-1.0 reuse-tool-0.14.0/tests/resources/fake_repository/LICENSES/000077500000000000000000000000001416231101000234455ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/LICENSES/Autoconf-exception-3.0.txt000066400000000000000000000000161416231101000302530ustar00rootroot00000000000000Exception textreuse-tool-0.14.0/tests/resources/fake_repository/LICENSES/CC0-1.0.txt000066400000000000000000000000151416231101000250430ustar00rootroot00000000000000License text reuse-tool-0.14.0/tests/resources/fake_repository/LICENSES/GPL-3.0-or-later.txt000066400000000000000000000000151416231101000266450ustar00rootroot00000000000000License text reuse-tool-0.14.0/tests/resources/fake_repository/LICENSES/LicenseRef-custom.txt000066400000000000000000000000001416231101000275230ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/doc/000077500000000000000000000000001416231101000230055ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/doc/index.rst000066400000000000000000000000161416231101000246430ustar00rootroot00000000000000Hello, world! reuse-tool-0.14.0/tests/resources/fake_repository/src/000077500000000000000000000000001416231101000230275ustar00rootroot00000000000000reuse-tool-0.14.0/tests/resources/fake_repository/src/custom.py000066400000000000000000000000711416231101000247110ustar00rootroot00000000000000# This file is overriden by the fake_repository fixture. reuse-tool-0.14.0/tests/resources/fake_repository/src/exception.py000066400000000000000000000000711416231101000253750ustar00rootroot00000000000000# This file is overriden by the fake_repository fixture. reuse-tool-0.14.0/tests/resources/fake_repository/src/source_code.c000066400000000000000000000002341416231101000254640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2017 Mary Sue */ /* SPDX-License-Identifier: GPL-3.0-or-later */ #include main() { printf("Hello, world!\n"); } reuse-tool-0.14.0/tests/resources/fake_repository/src/source_code.html000066400000000000000000000001701416231101000262050ustar00rootroot00000000000000

Hello, world!

reuse-tool-0.14.0/tests/resources/fake_repository/src/source_code.jinja2000066400000000000000000000001621416231101000264170ustar00rootroot00000000000000{# SPDX-FileCopyrightText: 2017 Mary Sue #} {# SPDX-License-Identifier: GPL-3.0-or-later #}

Hello, world!

reuse-tool-0.14.0/tests/resources/fake_repository/src/source_code.py000066400000000000000000000002461416231101000256750ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Mary Sue # # SPDX-License-Identifier: GPL-3.0-or-later """Module docstring.""" if __name__ == "__main__": print("Hello, world!") reuse-tool-0.14.0/tests/resources/fsfe.png000066400000000000000000000125121416231101000204650ustar00rootroot00000000000000PNG  IHDRmFqbKGD pHYs  tIME4IDATxyu?s3!8$Äke]ETU]u`DD˭E-t]]D]IhaH&h dfr&\L\dLt{UIM%j@3{(]`\or.הPx6ChtJ{ ^XD\jB)#_+ tUxI1KA^E1[ ( mqxM)q:4/$ gS=q64šEQm3Nʥ ;yQ xRC/+eQWj  œLÀ#qݗh=xM s欸yYSĢ WY~=x^ [4{ˌƈlXNՊ-~lsF*|iIɅ-x 08Ֆ=^YM\D,iUowTYB#fAJ`Ţ6O}jŲ]T21G3IbpDO-@\;WOl9׹;x}RnbDTfR9kC)g⺚'7XM\瀥M Ѹs2:OMHH t鞩BI$dmTw%W'~g:ouooBfaqu|IznBB6&s~!ЁG [3od,XTO9>\%9N*={eSqE!tU|3o[H)yhU02VG ѻg=;Ƃ^=Ϸ۝NG^%[*=PQ}l'/vwÎmmD zÂ2cЖpW?@{%6uYbgN`lh^8QzQ m&&O~ԕ0r%1],qEkD.."7s6Ю>618h 4]^BlafEqa"Dw{x{/˿#c(E !Ta4~G@@U(Upǀ+]ռZ80䜥b=]\aXL*r;sm}<5ź]R,FGkw k#hvCwR 0 魳`b;LɸjmTI,ۍ[,ȰctdzX\ '^o+K9>#ډw]Lub;JC[ޖ-)xmzյ,cGLd/`-˳ͻubv Yodwz?j48md}u!rDbp}XlV uE>$˶5rzUY[Ђqs&q9pO/Oߴp|MKӎ^[BW`Dɚ\D6rn/ WYRœr3DAϲ1tc.(m^#-NCwAF( pgB6qFG <NA5 F(DgX6I[ }vv[_^(j hڭe-YK i++%] ̀ ɤr p̤Q|ȶi!re6i1-0 ArXf̸g(^*o}W׺16y3yĿYO%IQXL}L?5l' =3MeBq۶ilY<\j(IilgŸ<'P19 gyٱx;/7iL-Uw*xvڸL62x"f, Mhzׯv3iIy4dq6TkldCdD \ԓ)}-s%,KG҅%;oNGx@wP0Ԩ+src!-JD# t9"]ծlvCy|feDc`кY]^2z6`PQHk&,6kӋU+h;N[Ñ鿥@eC&Wln JV+`$Dz;NoT.PKZ?Ah Ȗ4zAw"V.섫*Uk տ3dqLܪ:/Ah'[*^յIC|5YCaTYWA'Kc~hDtn_4FَzR2<]&U׺+\Z ^IQZcYWIKndΟM!.I,nf">KG}b3r#tEn_k.wt_v韌 UXg%+bƻ dwJ?쇺M;MpPd6`3k]J/B{RPn3ʌ_(CAh(.6TO xFn"_N[g4tmF8}xFcD Q.&ߣ2'ˏ0/ }dSHYeh;]RhXeeXd 3$ksR3sq*{OAWT"Ȓ`^ܵ0|]e,סl,BEr#pэJiy"gG48/ɺX G=UhG./o!PBxWbX<~sEV1GBxX<^U:rQcn6td|61# VrR׀x/Q֏ȃ[Vw= <0@dݶ9<_{)4ӏy%3u?7E"_B{-)uLo `b4=O'?߬wX {˝N8oa:=Tß7;Tymr|DPϸZzXC|մxLuqPi<UHrPYV7 g\Ƣk; @@*thFe:,w`?M!6W?&qOYgtCO t9qj P # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse._comment""" # pylint: disable=protected-access,invalid-name,redefined-outer-name from inspect import cleandoc from textwrap import dedent import pytest from reuse._comment import ( CCommentStyle, CommentCreateError, CommentParseError, CommentStyle, HtmlCommentStyle, PythonCommentStyle, _all_style_classes, ) @pytest.fixture( params=[ Style for Style in _all_style_classes() if Style.can_handle_single() ] ) def SingleStyle(request): """Yield all Style classes that support single-line comments.""" yield request.param @pytest.fixture( params=[ Style for Style in _all_style_classes() if Style.can_handle_multi() ] ) def MultiStyle(request): """Yield all Style classes that support multi-line comments.""" yield request.param def test_create_comment_generic_single(SingleStyle): """Create a comment for all classes that support single-line comments.""" text = "Hello" expected = ( f"{SingleStyle.SINGLE_LINE}{SingleStyle.INDENT_AFTER_SINGLE}Hello" ) assert SingleStyle.create_comment(text) == expected def test_create_comment_generic_multi(MultiStyle): """Create a comment for all classes that support multi-line comments.""" # pylint: disable=line-too-long text = "Hello" expected = cleandoc( f""" {MultiStyle.MULTI_LINE[0]} {MultiStyle.INDENT_BEFORE_MIDDLE}{MultiStyle.MULTI_LINE[1]}{MultiStyle.INDENT_AFTER_MIDDLE}Hello {MultiStyle.INDENT_BEFORE_END}{MultiStyle.MULTI_LINE[2]} """ ) assert MultiStyle.create_comment(text, force_multi=True) == expected def test_parse_comment_generic_single(SingleStyle): """Parse a comment for all classes that support single-line comments.""" text = f"{SingleStyle.SINGLE_LINE}{SingleStyle.INDENT_AFTER_SINGLE}Hello" expected = "Hello" assert SingleStyle.parse_comment(text) == expected def test_parse_comment_generic_multi(MultiStyle): """Parse a comment for all classes that support multi-line comments.""" # pylint: disable=line-too-long text = cleandoc( f""" {MultiStyle.MULTI_LINE[0]} {MultiStyle.INDENT_BEFORE_MIDDLE}{MultiStyle.MULTI_LINE[1]}{MultiStyle.INDENT_AFTER_MIDDLE}Hello {MultiStyle.INDENT_BEFORE_END}{MultiStyle.MULTI_LINE[2]} """ ) expected = "Hello" assert MultiStyle.parse_comment(text) == expected def test_base_class_throws_errors(): """When trying to do much of anything with the base class, expect errors.""" with pytest.raises(CommentParseError): CommentStyle.parse_comment("hello") with pytest.raises(CommentCreateError): CommentStyle.create_comment("hello") with pytest.raises(CommentParseError): CommentStyle.comment_at_first_character("hello") def test_create_comment_python(): """Create a simple Python comment.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ # Hello # # world """ ) assert PythonCommentStyle.create_comment(text) == expected def test_parse_comment_python(): """Parse a simple Python comment.""" text = cleandoc( """ # Hello # # world """ ) expected = cleandoc( """ Hello world """ ) assert PythonCommentStyle.parse_comment(text) == expected def test_parse_comment_python_indented(): """Preserve indentations in Python comments.""" text = cleandoc( """ # def foo(): # print("foo") """ ) expected = cleandoc( """ def foo(): print("foo") """ ) assert PythonCommentStyle.parse_comment(text) == expected def test_create_comment_python_strip_newlines(): """Don't include unnecessary newlines in the comment.""" text = "\nhello\n" expected = "# hello" assert PythonCommentStyle.create_comment(text) == expected def test_create_comment_python_force_multi(): """Raise CommentCreateError when creating a multi-line Python comment.""" with pytest.raises(CommentCreateError): PythonCommentStyle.create_comment("hello", force_multi=True) def test_parse_comment_python_strip_newlines(): """When given a comment, remove newlines before and after before parsing.""" text = dedent( """ # # hello # """ ) expected = "\nhello\n" assert PythonCommentStyle.parse_comment(text) == expected def test_parse_comment_python_not_a_comment(): """Raise CommentParseError when a comment isn't provided.""" text = "Hello world" with pytest.raises(CommentParseError): PythonCommentStyle.parse_comment(text) def test_parse_comment_python_single_line_is_not_comment(): """Raise CommentParseError when a single line is not a comment.""" text = cleandoc( """ # Hello world """ ) with pytest.raises(CommentParseError): PythonCommentStyle.parse_comment(text) def test_parse_comment_python_multi_error(): """Raise CommentParseError when trying to parse a multi-line Python comment. """ with pytest.raises(CommentParseError): PythonCommentStyle._parse_comment_multi("Hello world") def test_create_comment_c_single(): """Create a C comment with single-line comments.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ // Hello // world """ ) assert CCommentStyle.create_comment(text) == expected def test_parse_comment_c_single(): """Parse a C comment with single-line comments.""" text = cleandoc( """ // Hello // world """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_create_comment_c_multi(): """Create a C comment with multi-line comments.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ /* * Hello * world */ """ ) assert CCommentStyle.create_comment(text, force_multi=True) == expected def test_create_comment_c_multi_contains_ending(): """Raise CommentCreateError when the text contains a comment ending.""" text = cleandoc( """ Hello world */ """ ) with pytest.raises(CommentCreateError): CCommentStyle.create_comment(text, force_multi=True) def test_parse_comment_c_multi(): """Parse a C comment with multi-line comments.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_missing_middle(): """Parse a C comment even though the middle markers are missing.""" text = cleandoc( """ /* Hello world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_misaligned_end(): """Parse a C comment even though the end is misaligned.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_no_middle(): """Parse a C comment that has no middle whatsoever.""" text = cleandoc( """ /* Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_ends_at_last(): """Parse a C comment that treats the last line like a regular line.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_starts_at_first(): """Parse a C comment that treats the first line like a regular line.""" text = cleandoc( """ /* Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_indented(): """Preserve indentations in C comments.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_single_line(): """Parse a single-line multi-line comment.""" text = "/* Hello world */" expected = "Hello world" assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_no_start(): """Raise CommentParseError when there is no comment starter.""" text = "Hello world */" with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) with pytest.raises(CommentParseError): CCommentStyle._parse_comment_multi(text) def test_parse_comment_c_multi_no_end(): """Raise CommentParseError when there is no comment end.""" text = "/* Hello world" with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) def test_parse_comment_c_multi_text_after_end(): """Raise CommentParseError when there is stuff after the comment delimiter. """ text = cleandoc( """ /* * Hello * world */ Spam """ ) with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) def test_create_comment_html(): """Create an HTML comment.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ """ ) assert HtmlCommentStyle.create_comment(text) == expected def test_parse_comment_html(): """Parse an HTML comment.""" text = cleandoc( """ """ ) expected = cleandoc( """ Hello world """ ) assert HtmlCommentStyle.parse_comment(text) == expected def test_parse_comment_html_single_line(): """Parse a single-line HTML comment.""" text = "" expected = "Hello world" assert HtmlCommentStyle.parse_comment(text) == expected def test_create_comment_html_single(): """Creating a single-line HTML comment fails.""" with pytest.raises(CommentCreateError): HtmlCommentStyle._create_comment_single("hello") def test_comment_at_first_character_python(): """Find the comment block at the first character.""" text = cleandoc( """ # Hello # world Spam """ ) expected = cleandoc( """ # Hello # world """ ) assert PythonCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_python_no_comment(): """The text does not start with a comment character.""" with pytest.raises(CommentParseError): PythonCommentStyle.comment_at_first_character(" # Hello world") def test_comment_at_first_character_python_indented_comments(): """Don't handle indented comments.""" text = cleandoc( """ # Hello # world """ ) expected = "# Hello" assert PythonCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_c_multi(): """Simple test for a multi-line C comment.""" text = cleandoc( """ /* * Hello * world */ Spam """ ) expected = cleandoc( """ /* * Hello * world */ """ ) assert CCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_c_multi_never_ends(): """Expect CommentParseError if the comment never ends.""" text = cleandoc( """ /* * Hello * world /* """ ) with pytest.raises(CommentParseError): CCommentStyle.comment_at_first_character(text) reuse-tool-0.14.0/tests/test_download.py000066400000000000000000000056361416231101000202530ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.download""" from pathlib import Path import pytest import requests from reuse.download import download_license, put_license_in_file class MockResponse: """Super simple mocked version of Response.""" # pylint: disable=too-few-public-methods def __init__(self, text=None, status_code=None): self.text = text self.status_code = status_code def test_download(monkeypatch): """A straightforward test: Request license text, get license text.""" monkeypatch.setattr(requests, "get", lambda _: MockResponse("hello", 200)) result = download_license("0BSD") assert result == "hello" def test_download_404(monkeypatch): """If the server returns a 404, there is no license text.""" monkeypatch.setattr( requests, "get", lambda _: MockResponse(status_code=404) ) with pytest.raises(requests.RequestException): download_license("does-not-exist") def test_download_exception(monkeypatch): """If requests raises an exception itself, that exception is not escaped.""" def raise_exception(_): raise requests.RequestException() monkeypatch.setattr(requests, "get", raise_exception) with pytest.raises(requests.RequestException): download_license("hello world") def test_put_simple(fake_repository, monkeypatch): """Straightforward test.""" monkeypatch.setattr( requests, "get", lambda _: MockResponse("hello\n", 200) ) put_license_in_file("0BSD", "LICENSES/0BSD.txt") assert (fake_repository / "LICENSES/0BSD.txt").read_text() == "hello\n" def test_put_file_exists(fake_repository, monkeypatch): """The to-be-downloaded file already exists.""" # pylint: disable=unused-argument monkeypatch.setattr( requests, "get", lambda _: MockResponse("hello\n", 200) ) with pytest.raises(FileExistsError) as exc_info: put_license_in_file( "GPL-3.0-or-later", "LICENSES/GPL-3.0-or-later.txt" ) assert Path(exc_info.value.filename).name == "GPL-3.0-or-later.txt" def test_put_request_exception(fake_repository, monkeypatch): """There was an error while downloading the license file.""" # pylint: disable=unused-argument monkeypatch.setattr( requests, "get", lambda _: MockResponse(status_code=404) ) with pytest.raises(requests.RequestException): put_license_in_file("0BSD", "LICENSES/0BSD.txt") def test_put_empty_dir(empty_directory, monkeypatch): """Create a LICENSES/ directory if one does not yet exist.""" monkeypatch.setattr( requests, "get", lambda _: MockResponse("hello\n", 200) ) put_license_in_file("0BSD", "LICENSES/0BSD.txt") assert (empty_directory / "LICENSES").exists() assert (empty_directory / "LICENSES/0BSD.txt").read_text() == "hello\n" reuse-tool-0.14.0/tests/test_header.py000066400000000000000000000241671416231101000176740ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # pylint: disable=redefined-outer-name """All tests for reuse.header""" # pylint: disable=implicit-str-concat-in-sequence from inspect import cleandoc import pytest from reuse import SpdxInfo from reuse._comment import CCommentStyle, CommentCreateError from reuse.header import ( MissingSpdxInfo, create_header, find_and_replace_header, ) def test_create_header_simple(): """Create a super simple header.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) expected = cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") assert create_header(spdx_info).strip() == expected def test_create_header_template_simple(template_simple): """Create a header with a simple template.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) expected = cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") assert ( create_header(spdx_info, template=template_simple).strip() == expected ) def test_create_header_template_no_spdx(template_no_spdx): """Create a header with a template that does not have all SPDX info.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) with pytest.raises(MissingSpdxInfo): create_header(spdx_info, template=template_no_spdx) def test_create_header_template_commented(template_commented): """Create a header with an already-commented template.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) expected = cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") assert ( create_header( spdx_info, template=template_commented, template_is_commented=True, style=CCommentStyle, ).strip() == expected ) def test_create_header_already_contains_spdx(): """Create a new header from a header that already contains SPDX info.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) existing = cleandoc( """ # spdx-FileCopyrightText: John Doe # # spdx-License-Identifier: MIT """ ).replace("spdx", "SPDX") expected = cleandoc( """ # spdx-FileCopyrightText: John Doe # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later # spdx-License-Identifier: MIT """ ).replace("spdx", "SPDX") assert create_header(spdx_info, header=existing).strip() == expected def test_create_header_existing_is_wrong(): """If the existing header contains errors, raise a CommentCreateError.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) existing = cleandoc( """ # spdx-FileCopyrightText: John Doe # # spdx-License-Identifier: MIT AND OR 0BSD """ ).replace("spdx", "SPDX") with pytest.raises(CommentCreateError): create_header(spdx_info, header=existing) def test_create_header_old_syntax(): """Old copyright syntax is preserved when creating a new header.""" spdx_info = SpdxInfo({"GPL-3.0-or-later"}, set()) existing = cleandoc( """ # Copyright John Doe """ ) expected = cleandoc( """ # Copyright John Doe # # spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") assert create_header(spdx_info, header=existing).strip() == expected def test_create_header_remove_fluff(): """Any stuff that isn't SPDX info is removed when using create_header.""" spdx_info = SpdxInfo({"GPL-3.0-or-later"}, set()) existing = cleandoc( """ # spdx-FileCopyrightText: John Doe # # Hello, world! pass """ ).replace("spdx", "SPDX") expected = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") assert create_header(spdx_info, header=existing).strip() == expected def test_find_and_replace_no_header(): """Given text without header, add a header.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) text = "pass" expected = cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_verbatim(): """Replace a header with itself.""" spdx_info = SpdxInfo(set(), set()) text = cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == text def test_find_and_replace_newline_before_header(): """In a scenario where the header is preceded by whitespace, remove the preceding whitespace. """ spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) text = cleandoc( """ # spdx-FileCopyrightText: Jane Doe pass """ ).replace("spdx", "SPDX") text = "\n" + text expected = cleandoc( """ # spdx-FileCopyrightText: Jane Doe # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_preserve_preceding(): """When the SPDX header is in the middle of the file, keep it there.""" spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) text = cleandoc( """ # Hello, world! def foo(bar): return bar # spdx-FileCopyrightText: Jane Doe pass """ ).replace("spdx", "SPDX") expected = cleandoc( """ # Hello, world! def foo(bar): return bar # spdx-FileCopyrightText: Jane Doe # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_keep_shebang(): """When encountering a shebang, keep it and put the REUSE header beneath it. """ spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) text = cleandoc( """ #!/usr/bin/env python3 # spdx-FileCopyrightText: Jane Doe pass """ ).replace("spdx", "SPDX") expected = cleandoc( """ #!/usr/bin/env python3 # spdx-FileCopyrightText: Jane Doe # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_separate_shebang(): """When the shebang is part of the same comment as the SPDX comment, separate the two. """ spdx_info = SpdxInfo({"GPL-3.0-or-later"}, set()) text = cleandoc( """ #!/usr/bin/env python3 #!nix-shell -p python3 # spdx-FileCopyrightText: Jane Doe pass """ ).replace("spdx", "SPDX") expected = cleandoc( """ #!/usr/bin/env python3 #!nix-shell -p python3 # spdx-FileCopyrightText: Jane Doe # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_only_shebang(): """When the file only contains a shebang, keep it at the top of the file.""" spdx_info = SpdxInfo({"GPL-3.0-or-later"}, set()) text = cleandoc( """ #!/usr/bin/env python3 # Hello, world! pass """ ) expected = cleandoc( """ #!/usr/bin/env python3 # spdx-License-Identifier: GPL-3.0-or-later # Hello, world! pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_keep_old_comment(): """When encountering a comment that does not contain copyright and licensing information, preserve it below the REUSE header. """ spdx_info = SpdxInfo( {"GPL-3.0-or-later"}, {"SPDX" "-FileCopyrightText: Mary Sue"} ) text = cleandoc( """ # Hello, world! pass """ ).replace("spdx", "SPDX") expected = cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later # Hello, world! pass """ ).replace("spdx", "SPDX") assert find_and_replace_header(text, spdx_info) == expected def test_find_and_replace_preserve_newline(): """If the file content ends with a newline, don't remove it.""" spdx_info = SpdxInfo(set(), set()) text = ( cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") + "\n" ) assert find_and_replace_header(text, spdx_info) == text reuse-tool-0.14.0/tests/test_lint.py000066400000000000000000000112621416231101000174020ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.lint""" # pylint: disable=invalid-name import shutil import sys import pytest from reuse.lint import ( lint, lint_bad_licenses, lint_files_without_copyright_and_licensing, lint_missing_licenses, lint_read_errors, lint_summary, ) from reuse.project import Project from reuse.report import ProjectReport try: import posix as is_posix except ImportError: is_posix = False cpython = pytest.mark.skipif( sys.implementation.name != "cpython", reason="only CPython supported" ) posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") def test_lint_simple(fake_repository): """Extremely simple test for lint.""" project = Project(fake_repository) report = ProjectReport.generate(project) result = lint(report) assert result def test_lint_git(git_repository): """Extremely simple test for lint with a git repository.""" project = Project(git_repository) report = ProjectReport.generate(project) result = lint(report) assert result def test_lint_submodule(submodule_repository): """Extremely simple test for lint with an ignored submodule.""" project = Project(submodule_repository) (submodule_repository / "submodule/foo.c").write_text("foo") report = ProjectReport.generate(project) result = lint(report) assert result def test_lint_submodule_included(submodule_repository): """Extremely simple test for lint with an included submodule.""" project = Project(submodule_repository, include_submodules=True) (submodule_repository / "submodule/foo.c").write_text("foo") report = ProjectReport.generate(project) result = lint(report) assert not result def test_lint_empty_directory(empty_directory): """An empty directory is compliant.""" project = Project(empty_directory) report = ProjectReport.generate(project) result = lint(report) assert result def test_lint_deprecated(fake_repository, stringio): """If a repo has a deprecated license, detect it.""" shutil.copy( fake_repository / "LICENSES/GPL-3.0-or-later.txt", fake_repository / "LICENSES/GPL-3.0.txt", ) (fake_repository / "foo.py").write_text( "SPDX" "-License-Identifier: GPL-3.0\n" "SPDX" "-FileCopyrightText: Jane Doe" ) project = Project(fake_repository) report = ProjectReport.generate(project) result = lint(report, out=stringio) assert not result assert "GPL-3.0" in stringio.getvalue() def test_lint_bad_license(fake_repository, stringio): """A bad license is detected.""" (fake_repository / "foo.py").write_text( "SPDX" "-License-Identifier: bad-license" ) project = Project(fake_repository) report = ProjectReport.generate(project) result = lint_bad_licenses(report, out=stringio) assert "foo.py" in str(list(result)[0]) assert "foo.py" in stringio.getvalue() assert "bad-license" in stringio.getvalue() def test_lint_missing_licenses(fake_repository, stringio): """A missing license is detected.""" (fake_repository / "foo.py").write_text("SPDX" "-License-Identifier: MIT") project = Project(fake_repository) report = ProjectReport.generate(project) result = lint_missing_licenses(report, out=stringio) assert "foo.py" in str(list(result)[0]) assert "foo.py" in stringio.getvalue() assert "MIT" in stringio.getvalue() def test_lint_unused_licenses(fake_repository, stringio): """An unused license is detected.""" (fake_repository / "LICENSES/MIT.txt").write_text("foo") project = Project(fake_repository) report = ProjectReport.generate(project) lint_summary(report, out=stringio) assert "MIT" in stringio.getvalue() @cpython @posix def test_lint_read_errors(fake_repository, stringio): """A read error is detected.""" (fake_repository / "foo.py").write_text("foo") (fake_repository / "foo.py").chmod(0o000) project = Project(fake_repository) report = ProjectReport.generate(project) result = lint_read_errors(report, out=stringio) assert "foo.py" in str(list(result)[0]) assert "foo.py" in stringio.getvalue() def test_lint_files_without_copyright_and_licensing(fake_repository, stringio): """A file without copyright and licensing is detected.""" (fake_repository / "foo.py").write_text("foo") project = Project(fake_repository) report = ProjectReport.generate(project) result = lint_files_without_copyright_and_licensing(report, out=stringio) assert "foo.py" in str(list(result)[0]) assert "foo.py" in stringio.getvalue() reuse-tool-0.14.0/tests/test_main.py000066400000000000000000000202211416231101000173530ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Stefan Bakker # 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 os import re from pathlib import Path from typing import Optional from unittest.mock import create_autospec import pytest import requests from reuse import download from reuse._main import main from reuse._util import GIT_EXE, HG_EXE @pytest.fixture(params=[True, False]) def optional_git_exe(request, monkeypatch) -> Optional[str]: """Run the test with or without git.""" exe = GIT_EXE if request.param else "" monkeypatch.setattr("reuse.project.GIT_EXE", exe) monkeypatch.setattr("reuse._util.GIT_EXE", exe) yield exe @pytest.fixture(params=[True, False]) def optional_hg_exe(request, monkeypatch) -> Optional[str]: """Run the test with or without mercurial.""" exe = HG_EXE if request.param else "" monkeypatch.setattr("reuse.project.HG_EXE", exe) monkeypatch.setattr("reuse._util.HG_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 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_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_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_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 "index.rst" 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 "index.rst" in stringio.getvalue() assert ":-(" in stringio.getvalue() def test_lint_custom_root_different_cwd(fake_repository, stringio): """Use a custom root while CWD is different.""" os.chdir("/") result = main(["--root", str(fake_repository), "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() def test_spdx(fake_repository, stringio): """Compile to an SPDX document.""" os.chdir(str(fake_repository)) result = main(["spdx"], out=stringio) # TODO: This test is rubbish. assert result == 0 assert stringio.getvalue() 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() ) 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_request_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 = requests.RequestException() 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 = requests.RequestException() 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") ) 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_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( 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(), ) reuse-tool-0.14.0/tests/test_main_addheader.py000066400000000000000000000566511416231101000213540ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Stefan Bakker # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._main: addheader""" # pylint: disable=unused-argument import stat from inspect import cleandoc import pytest from reuse._main import main # TODO: Replace this test with a monkeypatched test def test_addheader_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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") result = main( [ "addheader", "--year", "2016", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "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 """ ).replace("spdx", "SPDX") ) def test_addheader_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") result = main( [ "addheader", "--exclude-year", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # spdx-FileCopyrightText: Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--style", "c", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ // spdx-FileCopyrightText: 2018 Mary Sue // // spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.js", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ // spdx-FileCopyrightText: 2018 Mary Sue // // spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "Makefile", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_unrecognised_style(fake_repository): """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( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.foo", ] ) def test_addheader_skip_unrecognised(fake_repository, stringio): """Skip file that has an unrecognised extension.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--skip-unrecognised", "foo.foo", ], out=stringio, ) assert result == 0 assert "Skipped unrecognised file foo.foo" in stringio.getvalue() def test_addheader_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( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--style=c", "--skip-unrecognised", "foo.foo", ], out=stringio, ) assert result == 0 assert "no effect" in caplog.text def test_addheader_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(["addheader", "foo.py"]) def test_addheader_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) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate.jinja2", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate.jinja2", ] + list(map(str, simple_files)), out=stringio, ) assert result == 0 for simple_file in simple_files: assert ( simple_file.read_text() == cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_template_no_spdx( fake_repository, stringio, template_no_spdx_source ): """Add a header with a template that lacks SPDX 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( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate.jinja2", "foo.py", ], out=stringio, ) assert result == 1 def test_addheader_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) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate.commented.jinja2", "foo.c", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate.jinja2", "foo.py", ] ) def test_addheader_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) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--template", "mytemplate", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ # Hello, world! # # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later pass """ ).replace("spdx", "SPDX") ) def test_addheader_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) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.png", ], out=stringio, ) assert result == 0 assert ( binary_file.with_name(f"{binary_file.name}.license") .read_text() .strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) def test_addheader_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}') result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.json", ], out=stringio, ) assert result == 0 assert ( json_file.with_name(f"{json_file.name}.license").read_text().strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) def test_addheader_explicit_license( fake_repository, stringio, mock_date_today ): """Add a header to a .license file if --explicit-license is given.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--explicit-license", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license") .read_text() .strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) assert simple_file.read_text() == "pass" def test_addheader_explicit_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--explicit-license", "foo.txt", ], out=stringio, ) assert result == 0 assert not simple_file_license_license.exists() assert ( simple_file_license.read_text().strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) def test_addheader_explicit_license_unsupported_filetype( fake_repository, stringio, mock_date_today ): """Add a header to a .license file if --explicit-license is given, with the base file being an otherwise unsupported filetype. """ simple_file = fake_repository / "foo.txt" simple_file.write_text("Preserve this") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--explicit-license", "foo.txt", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license") .read_text() .strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) assert simple_file.read_text() == "Preserve this" def test_addheader_explicit_license_doesnt_write_to_file( fake_repository, stringio, mock_date_today ): """Adding a header to a .license file if --explicit-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) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--explicit-license", "foo.txt", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license") .read_text() .strip() == cleandoc( """ spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) assert simple_file.read_text() == "Preserve this" def test_addheader_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( [ "addheader", "--license", "Apache-2.0", "--copyright", "mycorp", "--style", "python", "test.sh", ] ) assert info.value # should not exit with 0 def test_addheader_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 Jane Doe Hello """ ).replace("spdx", "SPDX") ) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 assert ( license_file.read_text() == cleandoc( """ spdx-FileCopyrightText: 2016 Jane Doe spdx-FileCopyrightText: 2018 Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) assert simple_file.read_text() == "foo" def test_addheader_year_mutually_exclusive(fake_repository): """--exclude-year and --year are mutually exclusive.""" with pytest.raises(SystemExit): main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--exclude-year", "--year", "2020", "src/source_code.py", ] ) def test_addheader_single_multi_line_mutually_exclusive(fake_repository): """--single-line and --multi-line are mutually exclusive.""" with pytest.raises(SystemExit): main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--single-line", "--multi-line", "src/source_code.c", ] ) @pytest.mark.parametrize("skip_option", [("--skip-unrecognised"), ("")]) def test_addheader_multi_line_not_supported(fake_repository, skip_option): """Expect a fail if --multi-line is not supported for a file type.""" with pytest.raises(SystemExit): main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--multi-line", skip_option, "src/source_code.py", ] ) @pytest.mark.parametrize("skip_option", [("--skip-unrecognised"), ("")]) def test_addheader_single_line_not_supported(fake_repository, skip_option): """Expect a fail if --single-line is not supported for a file type.""" with pytest.raises(SystemExit): main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--single-line", skip_option, "src/source_code.html", ] ) def test_addheader_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") result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--multi-line", "foo.c", ], out=stringio, ) assert result == 0 assert ( simple_file.read_text() == cleandoc( """ /* * spdx-FileCopyrightText: 2018 Mary Sue * * spdx-License-Identifier: GPL-3.0-or-later */ foo """ ).replace("spdx", "SPDX") ) @pytest.mark.parametrize("line_ending", ["\r\n", "\r", "\n"]) def test_addheader_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"]) ) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 with open(simple_file, newline="") as fp: contents = fp.read() assert ( contents == cleandoc( """ # spdx-FileCopyrightText: 2018 Mary Sue # # spdx-License-Identifier: GPL-3.0-or-later hello world """ ) .replace("spdx", "SPDX") .replace("\n", line_ending) ) reuse-tool-0.14.0/tests/test_project.py000066400000000000000000000316341416231101000201070ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.project.""" # pylint: disable=invalid-name,protected-access import os import shutil from inspect import cleandoc from pathlib import Path from textwrap import dedent import pytest from license_expression import LicenseSymbol from reuse.project import Project try: import posix as is_posix except ImportError: is_posix = False posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") TESTS_DIRECTORY = Path(__file__).parent.resolve() RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" def test_project_not_a_directory(empty_directory): """Cannot create a Project without a valid directory.""" (empty_directory / "foo.py").write_text("foo") with pytest.raises(NotADirectoryError): Project(empty_directory / "foo.py") 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") project = Project(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(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(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(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(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").touch() project = Project(empty_directory) assert not list(project.all_files()) @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: Mary Sue spdx-License-Identifier: GPL-3.0-or-later """ ).replace("spdx", "SPDX") ) (empty_directory / "symlink").symlink_to("blob") project = Project(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(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(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(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(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(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(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(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(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(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(hg_repository) assert Path("hello\nworld.pyc").absolute() not in project.all_files() def test_spdx_info_of_file_does_not_exist(fake_repository): """Raise FileNotFoundError when asking for the SPDX info of a file that does not exist. """ project = Project(fake_repository) with pytest.raises(FileNotFoundError): project.spdx_info_of(fake_repository / "does_not_exist") def test_spdx_info_of_directory(empty_directory): """Raise IsADirectoryError when calling spdx_info_of on a directory.""" (empty_directory / "src").mkdir() project = Project(empty_directory) with pytest.raises((IsADirectoryError, PermissionError)): project.spdx_info_of(empty_directory / "src") def test_spdx_info_of_unlicensed_file(fake_repository): """Return an empty SpdxInfo object when asking for the SPDX information of a file that has no SPDX information. """ (fake_repository / "foo.py").write_text("foo") project = Project(fake_repository) assert not any(project.spdx_info_of("foo.py")) def test_spdx_info_of_only_copyright(fake_repository): """A file contains only a copyright line. Test whether it correctly picks up on that. """ (fake_repository / "foo.py").write_text( "SPDX-FileCopyrightText: 2017 Mary Sue" ) project = Project(fake_repository) spdx_info = project.spdx_info_of("foo.py") assert not any(spdx_info.spdx_expressions) assert len(spdx_info.copyright_lines) == 1 assert ( spdx_info.copyright_lines.pop() == "SPDX-FileCopyrightText: 2017 Mary Sue" ) def test_spdx_info_of_only_copyright_also_covered_by_debian(fake_repository): """A file contains only a copyright line, but debian/copyright also has information on this file. Use both. """ (fake_repository / "doc/foo.py").write_text( "SPDX-FileCopyrightText: in file" ) project = Project(fake_repository) spdx_info = project.spdx_info_of("doc/foo.py") assert any(spdx_info.spdx_expressions) assert len(spdx_info.copyright_lines) == 2 assert "SPDX-FileCopyrightText: in file" in spdx_info.copyright_lines assert "2017 Mary Sue" in spdx_info.copyright_lines def test_spdx_info_of_also_covered_by_dep5(fake_repository): """A file contains all SPDX information, but .reuse/dep5 also provides information on this file. Use both. """ (fake_repository / "doc/foo.py").write_text( dedent( """ SPDX-License-Identifier: MIT SPDX-FileCopyrightText: in file""" ) ) project = Project(fake_repository) spdx_info = project.spdx_info_of("doc/foo.py") assert LicenseSymbol("MIT") in spdx_info.spdx_expressions assert LicenseSymbol("CC0-1.0") in spdx_info.spdx_expressions assert "SPDX-FileCopyrightText: in file" in spdx_info.copyright_lines assert "2017 Mary Sue" in spdx_info.copyright_lines def test_spdx_info_of_no_duplicates(empty_directory): """A file contains the same lines twice. The SpdxInfo only contains those lines once. """ spdx_line = "SPDX-License-Identifier: GPL-3.0-or-later\n" copyright_line = ( "SPDX-FileCopyrightText: 2017 Free Software Foundation Europe\n" ) text = spdx_line + copyright_line (empty_directory / "foo.py").write_text(text * 2) project = Project(empty_directory) spdx_info = project.spdx_info_of("foo.py") assert len(spdx_info.spdx_expressions) == 1 assert LicenseSymbol("GPL-3.0-or-later") in spdx_info.spdx_expressions assert len(spdx_info.copyright_lines) == 1 assert ( "SPDX-FileCopyrightText: 2017 Free Software Foundation Europe" in spdx_info.copyright_lines ) def test_spdx_info_of_binary_succeeds(fake_repository): """spdx_info_of succeeds when the target is covered by dep5.""" shutil.copy( RESOURCES_DIRECTORY / "fsfe.png", fake_repository / "doc/fsfe.png" ) project = Project(fake_repository) spdx_info = project.spdx_info_of("doc/fsfe.png") assert LicenseSymbol("CC0-1.0") in spdx_info.spdx_expressions def test_license_file_detected(empty_directory): """Test whether---when given a file and a license file---the license file is detected and read. """ (empty_directory / "foo.py").write_text("foo") (empty_directory / "foo.py.license").write_text( "SPDX-FileCopyrightText: 2017 Mary Sue\nSPDX-License-Identifier: MIT\n" ) project = Project(empty_directory) spdx_info = project.spdx_info_of("foo.py") assert "SPDX-FileCopyrightText: 2017 Mary Sue" in spdx_info.copyright_lines assert LicenseSymbol("MIT") in spdx_info.spdx_expressions def test_licenses_filename(empty_directory): """Detect the license identifier of a license from its stem.""" (empty_directory / "LICENSES").mkdir() (empty_directory / "LICENSES/foo.txt").write_text("foo") project = Project(empty_directory) assert "foo" in project.licenses def test_licenses_no_extension(empty_directory): """Detect the license identifier of a license from its full name if it is in the license list. """ (empty_directory / "LICENSES").mkdir() (empty_directory / "LICENSES/GPL-3.0-or-later").write_text("foo") (empty_directory / "LICENSES/MIT-3.0-or-later").write_text("foo") project = Project(empty_directory) assert "GPL-3.0-or-later" in project.licenses assert "MIT-3" in project.licenses def test_licenses_subdirectory(empty_directory): """Find a license in a subdirectory of LICENSES/.""" (empty_directory / "LICENSES/sub").mkdir(parents=True) (empty_directory / "LICENSES/sub/MIT.txt").write_text("foo") project = Project(empty_directory) assert "MIT" in project.licenses def test_relative_from_root(empty_directory): """A simple test. Given /path/to/root/src/hello.py, return src/hello.py.""" project = Project(empty_directory) assert project.relative_from_root(project.root / "src/hello.py") == Path( "src/hello.py" ) def test_relative_from_root_no_shared_base_path(empty_directory): """A path can still be relative from root if the paths do not have a common prefix. For instance, if root is /path/to/root and given root/src/hello.py from the directory /path/to, return src/hello.py. This is a bit involved, but works out. """ project = Project(empty_directory) parent = empty_directory.parent os.chdir(parent) assert project.relative_from_root( Path(f"{project.root.name}/src/hello.py") ) == Path("src/hello.py") reuse-tool-0.14.0/tests/test_report.py000066400000000000000000000163521416231101000177540ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.report""" # pylint: disable=invalid-name import os import sys import pytest from reuse.project import Project from reuse.report import FileReport, ProjectReport try: import posix as is_posix except ImportError: is_posix = False cpython = pytest.mark.skipif( sys.implementation.name != "cpython", reason="only CPython supported" ) posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") def test_generate_file_report_file_simple(fake_repository): """An extremely simple generate test, just to see if the function doesn't crash. """ project = Project(fake_repository) result = FileReport.generate(project, "src/source_code.py") assert result.spdxfile.licenses_in_file == ["GPL-3.0-or-later"] assert result.spdxfile.copyright == "SPDX-FileCopyrightText: 2017 Mary Sue" assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_file_from_different_cwd(fake_repository): """Another simple generate test, but from a different CWD.""" os.chdir("/") project = Project(fake_repository) result = FileReport.generate( project, fake_repository / "src/source_code.py" ) assert result.spdxfile.licenses_in_file == ["GPL-3.0-or-later"] assert result.spdxfile.copyright == "SPDX-FileCopyrightText: 2017 Mary Sue" assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_file_missing_license(fake_repository): """Simple generate test with a missing license.""" (fake_repository / "foo.py").write_text( "SPDX" "-License-Identifier: BSD-3-Clause" ) project = Project(fake_repository) result = FileReport.generate(project, "foo.py") assert result.spdxfile.copyright == "" assert result.missing_licenses == {"BSD-3-Clause"} assert not result.bad_licenses def test_generate_file_report_file_bad_license(fake_repository): """Simple generate test with a bad license.""" (fake_repository / "foo.py").write_text( "SPDX" "-License-Identifier: fakelicense" ) project = Project(fake_repository) result = FileReport.generate(project, "foo.py") assert result.spdxfile.copyright == "" assert result.bad_licenses == {"fakelicense"} assert result.missing_licenses == {"fakelicense"} def test_generate_file_report_exception(fake_repository): """Simple generate test to test if the exception is detected.""" project = Project(fake_repository) result = FileReport.generate(project, "src/exception.py") assert set(result.spdxfile.licenses_in_file) == { "GPL-3.0-or-later", "Autoconf-exception-3.0", } assert result.spdxfile.copyright == "SPDX-FileCopyrightText: 2017 Mary Sue" assert not result.bad_licenses assert not result.missing_licenses def test_generate_project_report_simple(fake_repository, multiprocessing): """Simple generate test, just to see if it sort of works.""" project = Project(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(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(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(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(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert result.unused_licenses == {"MIT"} 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") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "bad" in result.bad_licenses 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") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "bad" in result.bad_licenses assert "bad" in result.missing_licenses 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" ) project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "GPL-3.0" in result.deprecated_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) project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) # pylint: disable=superfluous-parens assert (fake_repository / "bad") in result.read_errors def test_generate_project_report_to_dict(fake_repository, multiprocessing): """Extremely simple test for ProjectReport.to_dict.""" project = Project(fake_repository) report = ProjectReport.generate(project, multiprocessing=multiprocessing) # TODO: Actually do something report.to_dict() def test_bill_of_materials(fake_repository, multiprocessing): """Generate a bill of materials.""" project = Project(fake_repository) report = ProjectReport.generate(project, multiprocessing=multiprocessing) # TODO: Actually do something report.bill_of_materials() reuse-tool-0.14.0/tests/test_util.py000066400000000000000000000311361416231101000174130ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._util""" # pylint: disable=protected-access,invalid-name 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 license_expression import LicenseSymbol from reuse import _util from reuse._util import _LICENSING try: import pwd is_root = pwd.getpwuid(os.getuid()).pw_name == "root" is_posix = True except ImportError: is_root = False is_posix = False git = pytest.mark.skipif(not _util.GIT_EXE, reason="requires git") no_root = pytest.mark.xfail(is_root, reason="fails when user is root") posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") 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_spdx_info( "SPDX" "-License-Identifier: {}".format(expression) ) assert result.spdx_expressions == {_LICENSING.parse(expression)} 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_spdx_info(expression) def test_extract_no_info(): """Given a file without SPDX information, return an empty SpdxInfo object. """ result = _util.extract_spdx_info("") assert result == _util.SpdxInfo(set(), set()) def test_extract_tab(): """A tag followed by a tab is also valid.""" result = _util.extract_spdx_info("SPDX" "-License-Identifier:\tMIT") assert result.spdx_expressions == {_LICENSING.parse("MIT")} def test_extract_many_whitespace(): """When a tag is followed by a lot of whitespace, the whitespace should be filtered out. """ result = _util.extract_spdx_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_spdx_info(expression) assert str(list(result.spdx_expressions)[0]) == "GPL-3.0-or-later" def test_extract_copyright(): """Given a file with copyright information, have it return that copyright information. """ copyright = "SPDX" "-FileCopyrightText: 2019 Jane Doe" result = _util.extract_spdx_info(copyright) assert result.copyright_lines == {copyright} def test_extract_copyright_duplicate(): """When a copyright line is duplicated, only yield one.""" copyright = "SPDX" "-FileCopyrightText: 2019 Jane Doe" result = _util.extract_spdx_info("\n".join((copyright, copyright))) assert result.copyright_lines == {copyright} def test_extract_copyright_tab(): """A tag followed by a tab is also valid.""" copyright = "SPDX" "-FileCopyrightText:\t2019 Jane Doe" result = _util.extract_spdx_info(copyright) assert result.copyright_lines == {copyright} def test_extract_copyright_many_whitespace(): """When a tag is followed by a lot of whitespace, that is also valid. The whitespace is not filtered out. """ copyright = "SPDX" "-FileCopyrightText: 2019 Jane Doe" result = _util.extract_spdx_info(copyright) assert result.copyright_lines == {copyright} def test_extract_copyright_variations(): """There are multiple ways to declare copyright. All should be detected.""" text = cleandoc( """ SPDX-FileCopyrightText: 2019 Jane Doe SPDX-FileCopyrightText: © 2019 Jane Doe © 2019 Jane Doe Copyright © 2019 Jane Doe Copyright 2019 Jane Doe Copyright (C) 2019 Jane Doe """ ) result = _util.extract_spdx_info(text) lines = text.splitlines() for line in lines: assert line in result.copyright_lines assert len(lines) == len(result.copyright_lines) def test_copyright_from_dep5(copyright): """Verify that the glob in the dep5 file is matched.""" result = _util._copyright_from_dep5("doc/foo.rst", copyright) assert LicenseSymbol("CC0-1.0") in result.spdx_expressions assert "2017 Mary Sue" in result.copyright_lines 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_style_spdx(): """Given a simple statement and style, make it a copyright line.""" statement = _util.make_copyright_line("hello", copyright_style="spdx") assert statement == "SPDX-FileCopyrightText: hello" def test_make_copyright_line_style_spdx_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="spdx" ) assert statement == "SPDX-FileCopyrightText: 2019 hello" def test_make_copyright_line_style_spdx_symbol_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="spdx-symbol" ) assert statement == "SPDX-FileCopyrightText: © 2019 hello" def test_make_copyright_line_style_string_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="string" ) assert statement == "Copyright 2019 hello" def test_make_copyright_line_style_string_c_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="string-c" ) assert statement == "Copyright (C) 2019 hello" def test_make_copyright_line_style_string_symbol_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="string-symbol" ) assert statement == "Copyright © 2019 hello" def test_make_copyright_line_style_symbol_year(): """Given a simple statement, style and a year, make it a copyright line.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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 arguement, expect an error.""" with pytest.raises(RuntimeError): _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 ☺" encoded = text.encode("utf-8") assert _util.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" 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" 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" def test_detect_line_endings_mac(): """Given a CR string, detect the line endings.""" assert _util.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" 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 reuse-tool-0.14.0/tests/test_vcs.py000066400000000000000000000015361416231101000172320ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.vcs""" # pylint: disable=invalid-name import os from pathlib import Path from reuse import vcs def test_find_root_in_git_repo(git_repository): """When using reuse from a child directory in a Git repo, always find the root directory. """ os.chdir("src") result = vcs.find_root() assert Path(result).absolute().resolve() == git_repository def test_find_root_in_hg_repo(hg_repository): """When using reuse from a child directory in a Mercurial repo, always find the root directory. """ os.chdir("src") result = vcs.find_root() assert Path(result).absolute().resolve() == hg_repository reuse-tool-0.14.0/tox.ini000066400000000000000000000017621416231101000152000ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later [tox] envlist = py{36,37,38,39,310}-test, lint, black, reuse, docs [testenv] passenv = HOME CI deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = py.test --cov-report term-missing --cov={envsitepackagesdir}/reuse [testenv:lint] basepython = python3 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = /usr/bin/make lint [testenv:black] basepython = python3 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = /usr/bin/make blackcheck [testenv:reuse] basepython = python3 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = /usr/bin/make reuse [testenv:docs] basepython = python3 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = /usr/bin/make docs