diff options
author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2024-08-03 17:57:52 +0200 |
---|---|---|
committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2024-08-03 17:57:52 +0200 |
commit | 65966971a298f00303dae4783402cbb827798a7f (patch) | |
tree | b87b60398b4a0453ba09b66af6058aab56d690b0 | |
parent | feat(templates/latex): Add a `watch.sh` script (diff) | |
download | flake-templates-65966971a298f00303dae4783402cbb827798a7f.tar.gz flake-templates-65966971a298f00303dae4783402cbb827798a7f.zip |
feat(common): Replace the hand-crafted licensing approach with reuse
-rw-r--r-- | common/.licensure.yml | 186 | ||||
-rw-r--r-- | common/.reuse/templates/default.jinja2 | 2 | ||||
-rw-r--r-- | common/LICENSE.spdx | 7 | ||||
-rw-r--r-- | common/README.md | 15 | ||||
-rw-r--r-- | common/docs/%INIT_APPLICATION_NAME.1.md | 16 | ||||
-rw-r--r-- | common/init | 77 | ||||
-rwxr-xr-x | common/scripts/cprh.sh | 57 | ||||
-rwxr-xr-x | common/scripts/renew_copyright_header.sh | 92 |
8 files changed, 104 insertions, 348 deletions
diff --git a/common/.licensure.yml b/common/.licensure.yml deleted file mode 100644 index 639d750..0000000 --- a/common/.licensure.yml +++ /dev/null @@ -1,186 +0,0 @@ ---- -# Regexes which if matched by a file path will always be excluded from -# getting a license header -excludes: - - .*lock - - \.git/.* - - LICENSE.spdx - - LICENSE - - COPYING - - COPYING.LESSER - - .*\.(rst|txt|pdf) -# Definition of the licenses used on this project and to what files -# they should apply. -# -# No default license configuration is provided. This section must be -# configured by the user. -licenses: - - files: \.tex - ident: CC-BY-SA-4.0 - authors: - - name: "%INIT_AUTHOR_NAME" - email: "%INIT_AUTHOR_EMAIL" - - template: | - %INIT_APPLICATION_NAME_STYLIZED %INIT_YEAR - [year] (C) by [name of author] - SPDX-License-Identifier: CC-BY-SA-4.0 - - %INIT_APPLICATION_NAME_STYLIZED is licensed under a - Creative Commons Attribution-ShareAlike 4.0 International License. - - You should have received a copy of the license along with this - work. If not, see <https://creativecommons.org/licenses/by-sa/4.0/>. - - unwrap_text: false - - # Either a regex or the string "any" to determine to what files this - # license should apply. It is common for projects to have files - # under multiple licenses or with multiple copyright holders. This - # provides the ability to automatically license files correctly - # based on their file paths. - # - # If "any" is provided all files will match this license. - - files: any - # - # The license identifier, a list of common identifiers can be - # found at: https://spdx.org/licenses/ but existence of the ident - # in this list it is not enforced unless auto_template is set to - # true. - ident: GPL-3.0-or-later - # - # A list of authors who hold copyright over these files - authors: - # Provide either your full name or company name for copyright purposes - - name: "%INIT_AUTHOR_NAME" - # Optionally provide email for copyright purposes - email: "%INIT_AUTHOR_EMAIL" - - # The template that will be rendered to generate the header before - # comment characters are applied. Available variables are: - # - [year]: substituted with the current year. - # - [name of author]: Substituted with name of the author and email - # if provided. If email is provided the output appears as Full - # Name <email@example.com>. If multiple authors are provided the - # list is concatenated together with commas. - template: | - Copyright (C) %INIT_YEAR - [year]: - [name of author] - SPDX-License-Identifier: GPL-3.0-or-later - - This file is part of %INIT_APPLICATION_NAME_STYLIZED. - - %INIT_APPLICATION_NAME_STYLIZED is free software: you can redistribute it and/or modify - it under the terms of the Lesser 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 - and the Lesser GNU General Public License along with this program. - If not, see <https://www.gnu.org/licenses/>. - - - # If auto_template is true then template is ignored and the SPDX - # API will be queried with the ident value to automatically - # determine the license header template. auto_template works best - # with licenses that have a standardLicenseHeader field defined in - # their license info JSON, if it is not then we will use the full - # licenseText to generate the header which works fine for short - # licenses like MIT but can be quite lengthy for other licenses - # like BSD-4-Clause. The above default template is valid for most - # licenses and is recommended for MIT, and BSD licenses. Common - # licenses that work well with the auto_template feature are GPL - # variants, and the Apache 2.0 license. - # - # Important Note: this means the ident must be a valid SPDX identifier - # auto_template: true - - # If true try to detect the text wrapping of the template, and unwrap it - unwrap_text: false - -# Define type of comment characters to apply based on file extensions. -comments: - # The extensions (or singular extension) field defines which file - # extensions to apply the commenter to. - - extensions: - - js - - go - # The commenter field defines the kind of commenter to - # generate. There are two types of commenters: line and block. - # - # This demonstrates a line commenter configuration. A line - # commenter type will apply the comment_char to the beginning of - # each line in the license header. It will then apply a number of - # empty newlines to the end of the header equal to trailing_lines. - # - # If trailing_lines is omitted it is assumed to be 0. - commenter: - type: line - comment_char: "//" - trailing_lines: 1 - - - extensions: - - rs - - tri - - css - - cpp - - c - - h - # This demonstrates a block commenter configuration. A block - # commenter type will add start_block_char as the first character - # in the license header and add end_block_char as the last character - # in the license header. If per_line_char is provided each line of - # the header between the block start and end characters will be - # line commented with the per_line_char - # - # trailing_lines works the same for both block and line commenter - # types - commenter: - type: block - start_block_char: "/*\n" - end_block_char: "*/\n" - per_line_char: "*" - trailing_lines: 1 - - - extension: - - html - - md - commenter: - type: block - start_block_char: "<!--\n" - end_block_char: "-->\n" - trailing_lines: 1 - - - extensions: - - el - - lisp - commenter: - type: line - comment_char: ";;;" - trailing_lines: 1 - - - extensions: - - tex - - bib - commenter: - type: line - comment_char: "%" - trailing_lines: 1 - - # The extension string "any" is special and so will match any file - # extensions. Commenter configurations are always checked in the - # order they are defined, so if any is used it should be the last - # commenter configuration or else it will override all others. - # - # In this configuration if we can't match the file extension we fall - # back to the popular '#' line comment used in most scripting - # languages. - - extension: any - commenter: - type: line - comment_char: '#' - trailing_lines: 1 diff --git a/common/.reuse/templates/default.jinja2 b/common/.reuse/templates/default.jinja2 new file mode 100644 index 0000000..688bffc --- /dev/null +++ b/common/.reuse/templates/default.jinja2 @@ -0,0 +1,2 @@ +%INIT_REUSE_TEMPLATE +<!-- vim: ft=htmldjango --> diff --git a/common/LICENSE.spdx b/common/LICENSE.spdx deleted file mode 100644 index 2b99390..0000000 --- a/common/LICENSE.spdx +++ /dev/null @@ -1,7 +0,0 @@ -SPDXVersion: SPDX-2.3 -DataLicense: CC0-1.0 -Creator: flake template init -PackageName: %INIT_APPLICATION_NAME -PackageOriginator: %INIT_APPLICATION_ORIGINATOR -PackageHomePage: %INIT_APPLICATION_HOME_PAGE -PackageLicenseDeclared: %INIT_SPDX_LICENSE_IDENTIFIER diff --git a/common/README.md b/common/README.md index 46287a6..9c5c6da 100644 --- a/common/README.md +++ b/common/README.md @@ -2,11 +2,10 @@ > %INIT_DESCRIPTION -Some text about the project. - -## Licence - -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. +## Licensing +This project complies with the REUSE v3.2 specification. This means that every file +clearly states its copyright. +Please run `./scripts/cprh.sh contributer NAME EMAIL FILES..` after you +contributed to `FILES..` to record your contribution (obviously replacing +the `NAME`, `EMAIL` and `FILES..` placeholders with your name, email, and +the paths to the changed files respectively (see the `--help` output for more)). diff --git a/common/docs/%INIT_APPLICATION_NAME.1.md b/common/docs/%INIT_APPLICATION_NAME.1.md index e044647..5546aad 100644 --- a/common/docs/%INIT_APPLICATION_NAME.1.md +++ b/common/docs/%INIT_APPLICATION_NAME.1.md @@ -34,21 +34,13 @@ TODO # BUGS -Report bugs to <https://%INIT_REMOTE/%INIT_OWNER/%INIT_REPOSITORY/issues>. +Report bugs to <%INIT_BUG_URL>. # COPYRIGHT Copyright (C) %INIT_YEAR %INIT_AUTHOR_NAME -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 free software. -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 <https://www.gnu.org/licenses/>. +You should have received a copy of the License +along with this program. If not, see <%INIT_LICENSE_URL>. diff --git a/common/init b/common/init index f416b34..edb0d1e 100644 --- a/common/init +++ b/common/init @@ -51,8 +51,8 @@ git init # necessary meta data prompt APPLICATION_NAME "The name of the application" "$(basename "$PWD")" -prompt APPLICATION_NAME_STYLIZED "The stylized name of the application (for documentation)" "$(echo "$APPLICATION_NAME" | sed 's/\([a-z]*\)/\u\1/')" -prompt APPLICATION_NAME_CAPITALIZED_MAN_PART "The capitalized name of the application (for documentation also with a man section part)" "$(echo "$APPLICATION_NAME" | sed 's/\([a-z]*\)/\U\1(1)/')" "dont_ask" +prompt APPLICATION_NAME_STYLIZED "The stylized name of the application (for documentation)" "$(echo "$APPLICATION_NAME" sed 's/[_-]/ /g' | sed 's/^\(\w\)/\U\1/g' | sed 's/ \(\w\)/ \U\1/g')" +prompt APPLICATION_NAME_CAPITALIZED_MAN_PART "The capitalized name of the application (for documentation also with a man section part)" "$(echo "$APPLICATION_NAME" | sed 's/_/-/g' | sed 's/\(.*\)/\U\1(1)/')" "dont_ask" prompt APPLICATION_VERSION "The version of this program, without the prefix" "0.1.0" prompt AUTHOR_NAME "The name of the author (or authors)" "$(git config --get user.name)" @@ -60,59 +60,50 @@ prompt AUTHOR_EMAIL "The email of the author (or authors)" "$(git config --get u # cog change-log variables prompt REMOTE "The remote, this project will be pushed to" "git.vhack.eu" -prompt REPOSITORY "The name of the repository in the remote" "$APPLICATION_NAME" +prompt REPOSITORY "The path of the repository on the remote" "$APPLICATION_NAME" prompt OWNER "The name of owner of the repository" "$AUTHOR_NAME" # nice meta data -prompt DESCRIPTION "The description of this project" "[can be empty]" +prompt DESCRIPTION "The description of this project" "" prompt CURRENT_DATE "The stylized version of the current date" "$(date +'%b %Y')" prompt YEAR "The year the work on this has begun (for copyright reasons)" "$(date +'%Y')" prompt APPLICATION_SOURCE_CODE_REPOSITORY "The package's source code repository URL" "https://$REMOTE/$OWNER/$REPOSITORY" +prompt HOME_PAGE "The home page URL of the project" "https://$REPOSITORY.org/" +prompt BUG_URL "The URL people should report bugs to" "$APPLICATION_SOURCE_CODE_REPOSITORY/issues" -# LICENSE.spdx data (source: https://github.com/david-a-wheeler/spdx-tutorial) if [ -e ./lpm.toml ]; then # Use a different default license in latex projects. init_default_license="CC-BY-SA-4.0" else - init_default_license="GPL-3.0-or-later" + init_default_license="AGPL-3.0-or-later" fi -prompt SPDX_LICENSE_IDENTIFIER "THE SPDX identifer of your choosen license" "$init_default_license" -prompt APPLICATION_ORIGINATOR "The person or organization from whom the package originally came" "$AUTHOR_NAME" -prompt APPLICATION_HOME_PAGE "The package's home page URL" "https://$REMOTE/$OWNER/$REPOSITORY" - -echo "Downloading license .." -case "$SPDX_LICENSE_IDENTIFIER" in -"AGPL-3.0-or-later") - default_license_url="https://www.gnu.org/licenses/agpl-3.0.txt" - curl "$default_license_url" >COPYING - ;; -"GPL-3.0-or-later") - default_license_url="https://www.gnu.org/licenses/gpl-3.0.txt" - curl "$default_license_url" >COPYING - ;; -"LGPL-3.0-or-later") - default_license_url="https://www.gnu.org/licenses/lgpl+gpl-3.0.txt" - curl "https://www.gnu.org/licenses/gpl-3.0.txt" >COPYING - curl "https://www.gnu.org/licenses/lgpl-3.0-standalone.html" >COPYING.LESSER - ;; - -"Apache-2.0") - default_license_url="https://www.apache.org/licenses/LICENSE-2.0.txt" - curl "$default_license_url" >LICENSE - ;; - -"CC-BY-SA-4.0") - default_license_url="https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt" - curl "$default_license_url" >LICENSE - ;; - -*) - default_license_url="file:///dev/null" - echo " -> No license found for your identifier: '$SPDX_LICENSE_IDENTIFIER'" - ;; -esac - -prompt LICENSE_URL "The url of the license" "$default_license_url" "dont_ask" +prompt SPDX_LICENSE_IDENTIFIER "THE SPDX identifer of your choosen license" "$init_default_license" "dont_ask" + +default_license_url="$(curl --silent --show-error "https://spdx.org/licenses/$SPDX_LICENSE_IDENTIFIER.json" | jq --raw-output '.seeAlso[0]')" + +# Prefer possible text versions of the license +if curl --fail --silent --show-error "$default_license_url.txt" >/dev/null; then + default_license_url="$default_license_url.txt" +fi +prompt LICENSE_URL "The url of the license" "$default_license_url" +prompt REUSE_TEMPLATE "The template used in reuse annotate" "$( + cat <<EOF | fmt --uniform-spacing --width=75 +{% for copyright_line in copyright_lines %} +{{ copyright_line }} +{% endfor %} +{% for contributor_line in contributor_lines %} +SPDX-FileContributor: {{ contributor_line }} +{% endfor %} +{% for expression in spdx_expressions %} +SPDX-License-Identifier: {{ expression }} +{% endfor %} + +This file is part of $APPLICATION_NAME_STYLIZED - $DESCRIPTION. + +You should have received a copy of the License along with this program. +If not, see <$LICENSE_URL>. +EOF +)" "dont_ask" echo "$DESCRIPTION" >.git/description diff --git a/common/scripts/cprh.sh b/common/scripts/cprh.sh new file mode 100755 index 0000000..9582575 --- /dev/null +++ b/common/scripts/cprh.sh @@ -0,0 +1,57 @@ +#! /usr/bin/env sh + +die() { + echo "$@" 1>&2 + exit 1 +} + +help() { + cat <<EOF +A copyright header managment tool. + +USAGE: + cprh.sh [OPTIONS] contribute NAME EMAIL FILE.. + +OPTIONS: + --help | -h + Display this help and exit. + +ARGUMENTS: + NAME := [[git config user.name]] + Your name. + + NAME := [[git config user.email]] + Your email address. + + FILE := [[git diff --name-only --cached]] + The file you want to change. This can be given multiple times. +EOF +} + +for arg in "$@"; do + case "$arg" in + "--help" | "-h") + help + exit 0 + ;; + *) + echo "'$1' is not a recognized option. See --help for more!" 1>&2 + exit 1 + ;; + esac +done + +user_name="$1" +[ -z "$user_name" ] && die "No NAME set! See --help for more" + +user_email="$2" +[ -z "$user_email" ] && die "No EMAIL set! See --help for more" +shift 2 + +styleOne="" +styleTwo="" +[ "$COMMENT_STYLE" ] && styleOne="--style" && styleTwo="$COMMENT_STYLE" + +# The styleTwo must be unquoted to avoid adding empty args to reuse +# shellcheck disable=2086 +reuse annotate --copyright "$user_name <$user_email>" --copyright-prefix string-c --template default --multi-line $styleOne $styleTwo diff --git a/common/scripts/renew_copyright_header.sh b/common/scripts/renew_copyright_header.sh deleted file mode 100755 index 423547f..0000000 --- a/common/scripts/renew_copyright_header.sh +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env sh - -# NOTE: This is the line length of the .licensure.yml header template **plus** the extra -# line after the template comment. -TEMPLATE_LINE_LENGTH=20 -LATEX_TEMPLATE_LINE_LENGTH=9 - -PROJECT_ROOT="$(git rev-parse --show-toplevel)" - -remove() { - extension="$1" - file="$2" - - # We need to differentiate, when removing the old copyright header, as some - # formatters do weird things to the file - case "$extension" in - # normal '#' comments (these are $TEMPLATE_LINE_LENGTH lines long) - "Makefile" | "makefile" | "toml" | "envrc" | "yml" | "gitignore" | "awk" | "pest" | "lua") - sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file" - ;; - # LaTeX files (or TeX files in general) have a different license, use the - # $LATEX_TEMPLATE_LINE_LENGTH variable. - "tex") - sed --in-place "1,${LATEX_TEMPLATE_LINE_LENGTH}d" "$file" - ;; - # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long) - "c" | "h" | "md" | "rs" | "html" | "svg" | "drawio" | "tri") - length="$((TEMPLATE_LINE_LENGTH + 2))" - sed --in-place "1,${length}d;" "$file" - ;; - # alejandra (the nix formatter) removes the blank line after the comment, - # thus only $TEMPLATE_LINE_LENGTH - 1 lines - "nix") - length="$((TEMPLATE_LINE_LENGTH - 1))" - sed --in-place "1,${length}d;" "$file" - ;; - # Shell needs a shebang on the first line, only after the first line can we - # remove the $TEMPLATE_LINE_LENGTH lines - "sh") - sed --in-place "2,${TEMPLATE_LINE_LENGTH}d;" "$file" - licensure --in-place "$file" - - TEMPLATE_LINE_LENGTH_NEW="$(($(yq --raw-output '.licenses | map(.template) | join("")' "$PROJECT_ROOT/.licensure.yml" | wc -l) + $(yq '.comments | last | .commenter.trailing_lines' "$PROJECT_ROOT/.licensure.yml")))" - - # delete the current shebang - to="$((TEMPLATE_LINE_LENGTH_NEW + 1))" - sed --in-place "${TEMPLATE_LINE_LENGTH_NEW},${to}d;" "$file" - - # add a new one - sed --in-place "1i#! /usr/bin/env sh" "$file" - ;; - *) - echo "File '$file' with extension '$extension' is not know yet, please add it!" - ;; - esac -} - -list() { - echo "$extension -> $file" -} - -if [ -f "$1" ]; then - file="$(realpath "$1")" - filename="$(basename -- "$file")" - extension="${filename##*.}" - filename="${filename%.*}" - - if [ -n "$DRY_RUN" ]; then - list "$extension" "$file" - else - remove "$extension" "$file" - fi -else - fd --type file --hidden . | while read -r file; do - if grep --quiet 'SPDX-License-Identifier' "$file"; then - filename="$(basename -- "$file")" - extension="${filename##*.}" - filename="${filename%.*}" - - if [ -n "$DRY_RUN" ]; then - list "$extension" "$file" - else - remove "$extension" "$file" - fi - fi - done - - if [ -z "$DRY_RUN" ]; then - licensure --in-place --project - nix fmt - fi -fi |