about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--templates/awk/.licensure.yml18
-rwxr-xr-x[l---------]templates/awk/scripts/renew_copyright_header.sh87
-rw-r--r--[l---------]templates/awk/treefmt.nix74
-rw-r--r--templates/c/.licensure.yml18
-rwxr-xr-x[l---------]templates/c/scripts/renew_copyright_header.sh87
-rw-r--r--[l---------]templates/c/treefmt.nix74
-rw-r--r--templates/latex/.licensure.yml43
-rwxr-xr-x[l---------]templates/latex/scripts/renew_copyright_header.sh87
-rw-r--r--[l---------]templates/latex/treefmt.nix74
-rw-r--r--templates/rust/.licensure.yml18
-rwxr-xr-x[l---------]templates/rust/scripts/renew_copyright_header.sh87
-rw-r--r--[l---------]templates/rust/treefmt.nix74
-rw-r--r--templates/shell/.licensure.yml18
-rwxr-xr-x[l---------]templates/shell/scripts/renew_copyright_header.sh87
-rw-r--r--[l---------]templates/shell/treefmt.nix74
l---------[-rw-r--r--]treefmt.nix74
16 files changed, 904 insertions, 90 deletions
diff --git a/templates/awk/.licensure.yml b/templates/awk/.licensure.yml
index e1f5a01..b7f963a 100644
--- a/templates/awk/.licensure.yml
+++ b/templates/awk/.licensure.yml
@@ -14,6 +14,24 @@ excludes:
 # 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: Benedikt Peetz
+        email: "benedikt.peetz@b-peetz.de"
+
+    template: |
+      <TODO> 2024 - [year] (C) by [name of author]
+      SPDX-License-Identifier: CC-BY-SA-4.0
+
+      <TODO> 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
diff --git a/templates/awk/scripts/renew_copyright_header.sh b/templates/awk/scripts/renew_copyright_header.sh
index f286da9..edb0a65 120000..100755
--- a/templates/awk/scripts/renew_copyright_header.sh
+++ b/templates/awk/scripts/renew_copyright_header.sh
@@ -1 +1,86 @@
-../../../common/renew_copyright_header.sh
\ No newline at end of file
+#! /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
+
+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" | "toml" | "envrc" | "yml" | "gitignore" | "awk")
+        sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file"
+        ;;
+    # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long)
+    "c" | "h" | "md" | "rs")
+        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: GPL-3.0-or-later' "$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
diff --git a/templates/awk/treefmt.nix b/templates/awk/treefmt.nix
index 6a4fe7d..1cbab40 120000..100644
--- a/templates/awk/treefmt.nix
+++ b/templates/awk/treefmt.nix
@@ -1 +1,73 @@
-../../treefmt.nix
\ No newline at end of file
+{
+  treefmt-nix,
+  pkgs,
+}:
+treefmt-nix.lib.evalModule pkgs (
+  {pkgs, ...}: {
+    # Used to find the project root
+    projectRootFile = "flake.nix";
+
+    programs = {
+      alejandra.enable = true;
+      rustfmt.enable = true;
+      clang-format.enable = true;
+      mdformat.enable = true;
+      shfmt = {
+        enable = true;
+        indent_size = 4;
+      };
+      shellcheck.enable = true;
+      prettier = {
+        settings = {
+          arrowParens = "always";
+          bracketSameLine = false;
+          bracketSpacing = true;
+          editorconfig = true;
+          embeddedLanguageFormatting = "auto";
+          endOfLine = "lf";
+          # experimentalTernaries = false;
+          htmlWhitespaceSensitivity = "css";
+          insertPragma = false;
+          jsxSingleQuote = true;
+          printWidth = 80;
+          proseWrap = "always";
+          quoteProps = "consistent";
+          requirePragma = false;
+          semi = true;
+          singleAttributePerLine = true;
+          singleQuote = true;
+          trailingComma = "all";
+          useTabs = false;
+          vueIndentScriptAndStyle = false;
+
+          tabWidth = 4;
+          overrides = {
+            files = ["*.js"];
+            options.tabwidth = 2;
+          };
+        };
+      };
+      stylua.enable = true;
+      ruff = {
+        enable = true;
+        format = true;
+      };
+      taplo.enable = true;
+    };
+
+    settings = {
+      global.excludes = [
+        "CHANGELOG.md"
+        "NEWS.md"
+      ];
+      formatter = {
+        clang-format = {
+          options = ["--style" "GNU"];
+        };
+        shfmt = {
+          includes = ["*.bash"];
+        };
+      };
+    };
+  }
+)
diff --git a/templates/c/.licensure.yml b/templates/c/.licensure.yml
index e1f5a01..b7f963a 100644
--- a/templates/c/.licensure.yml
+++ b/templates/c/.licensure.yml
@@ -14,6 +14,24 @@ excludes:
 # 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: Benedikt Peetz
+        email: "benedikt.peetz@b-peetz.de"
+
+    template: |
+      <TODO> 2024 - [year] (C) by [name of author]
+      SPDX-License-Identifier: CC-BY-SA-4.0
+
+      <TODO> 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
diff --git a/templates/c/scripts/renew_copyright_header.sh b/templates/c/scripts/renew_copyright_header.sh
index f286da9..edb0a65 120000..100755
--- a/templates/c/scripts/renew_copyright_header.sh
+++ b/templates/c/scripts/renew_copyright_header.sh
@@ -1 +1,86 @@
-../../../common/renew_copyright_header.sh
\ No newline at end of file
+#! /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
+
+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" | "toml" | "envrc" | "yml" | "gitignore" | "awk")
+        sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file"
+        ;;
+    # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long)
+    "c" | "h" | "md" | "rs")
+        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: GPL-3.0-or-later' "$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
diff --git a/templates/c/treefmt.nix b/templates/c/treefmt.nix
index 6a4fe7d..1cbab40 120000..100644
--- a/templates/c/treefmt.nix
+++ b/templates/c/treefmt.nix
@@ -1 +1,73 @@
-../../treefmt.nix
\ No newline at end of file
+{
+  treefmt-nix,
+  pkgs,
+}:
+treefmt-nix.lib.evalModule pkgs (
+  {pkgs, ...}: {
+    # Used to find the project root
+    projectRootFile = "flake.nix";
+
+    programs = {
+      alejandra.enable = true;
+      rustfmt.enable = true;
+      clang-format.enable = true;
+      mdformat.enable = true;
+      shfmt = {
+        enable = true;
+        indent_size = 4;
+      };
+      shellcheck.enable = true;
+      prettier = {
+        settings = {
+          arrowParens = "always";
+          bracketSameLine = false;
+          bracketSpacing = true;
+          editorconfig = true;
+          embeddedLanguageFormatting = "auto";
+          endOfLine = "lf";
+          # experimentalTernaries = false;
+          htmlWhitespaceSensitivity = "css";
+          insertPragma = false;
+          jsxSingleQuote = true;
+          printWidth = 80;
+          proseWrap = "always";
+          quoteProps = "consistent";
+          requirePragma = false;
+          semi = true;
+          singleAttributePerLine = true;
+          singleQuote = true;
+          trailingComma = "all";
+          useTabs = false;
+          vueIndentScriptAndStyle = false;
+
+          tabWidth = 4;
+          overrides = {
+            files = ["*.js"];
+            options.tabwidth = 2;
+          };
+        };
+      };
+      stylua.enable = true;
+      ruff = {
+        enable = true;
+        format = true;
+      };
+      taplo.enable = true;
+    };
+
+    settings = {
+      global.excludes = [
+        "CHANGELOG.md"
+        "NEWS.md"
+      ];
+      formatter = {
+        clang-format = {
+          options = ["--style" "GNU"];
+        };
+        shfmt = {
+          includes = ["*.bash"];
+        };
+      };
+    };
+  }
+)
diff --git a/templates/latex/.licensure.yml b/templates/latex/.licensure.yml
index 551ddfc..b7f963a 100644
--- a/templates/latex/.licensure.yml
+++ b/templates/latex/.licensure.yml
@@ -14,6 +14,24 @@ excludes:
 # 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: Benedikt Peetz
+        email: "benedikt.peetz@b-peetz.de"
+
+    template: |
+      <TODO> 2024 - [year] (C) by [name of author]
+      SPDX-License-Identifier: CC-BY-SA-4.0
+
+      <TODO> 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
@@ -27,7 +45,7 @@ licenses:
     #   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: CC-BY-SA-4.0
+    ident: GPL-3.0-or-later
     #
     #   A list of authors who hold copyright over these files
     authors:
@@ -44,14 +62,25 @@ licenses:
     #      Name <email@example.com>. If multiple authors are provided the
     #      list is concatenated together with commas.
     template: |
-      <TODO> 2024 - [year] (C) by [name of author]
-      SPDX-License-Identifier: CC-BY-SA-4.0
+        Copyright (C) 2023 - [year]:
+        [name of author]
+        SPDX-License-Identifier: GPL-3.0-or-later
 
-      <TODO> is licensed under a
-      Creative Commons Attribution-ShareAlike 4.0 International License.
+        This file is part of the TODO.
 
-      You should have received a copy of the license along with this
-      work.  If not, see <https://creativecommons.org/licenses/by-sa/4.0/>.
+        Trixy 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
diff --git a/templates/latex/scripts/renew_copyright_header.sh b/templates/latex/scripts/renew_copyright_header.sh
index f286da9..edb0a65 120000..100755
--- a/templates/latex/scripts/renew_copyright_header.sh
+++ b/templates/latex/scripts/renew_copyright_header.sh
@@ -1 +1,86 @@
-../../../common/renew_copyright_header.sh
\ No newline at end of file
+#! /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
+
+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" | "toml" | "envrc" | "yml" | "gitignore" | "awk")
+        sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file"
+        ;;
+    # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long)
+    "c" | "h" | "md" | "rs")
+        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: GPL-3.0-or-later' "$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
diff --git a/templates/latex/treefmt.nix b/templates/latex/treefmt.nix
index 6a4fe7d..1cbab40 120000..100644
--- a/templates/latex/treefmt.nix
+++ b/templates/latex/treefmt.nix
@@ -1 +1,73 @@
-../../treefmt.nix
\ No newline at end of file
+{
+  treefmt-nix,
+  pkgs,
+}:
+treefmt-nix.lib.evalModule pkgs (
+  {pkgs, ...}: {
+    # Used to find the project root
+    projectRootFile = "flake.nix";
+
+    programs = {
+      alejandra.enable = true;
+      rustfmt.enable = true;
+      clang-format.enable = true;
+      mdformat.enable = true;
+      shfmt = {
+        enable = true;
+        indent_size = 4;
+      };
+      shellcheck.enable = true;
+      prettier = {
+        settings = {
+          arrowParens = "always";
+          bracketSameLine = false;
+          bracketSpacing = true;
+          editorconfig = true;
+          embeddedLanguageFormatting = "auto";
+          endOfLine = "lf";
+          # experimentalTernaries = false;
+          htmlWhitespaceSensitivity = "css";
+          insertPragma = false;
+          jsxSingleQuote = true;
+          printWidth = 80;
+          proseWrap = "always";
+          quoteProps = "consistent";
+          requirePragma = false;
+          semi = true;
+          singleAttributePerLine = true;
+          singleQuote = true;
+          trailingComma = "all";
+          useTabs = false;
+          vueIndentScriptAndStyle = false;
+
+          tabWidth = 4;
+          overrides = {
+            files = ["*.js"];
+            options.tabwidth = 2;
+          };
+        };
+      };
+      stylua.enable = true;
+      ruff = {
+        enable = true;
+        format = true;
+      };
+      taplo.enable = true;
+    };
+
+    settings = {
+      global.excludes = [
+        "CHANGELOG.md"
+        "NEWS.md"
+      ];
+      formatter = {
+        clang-format = {
+          options = ["--style" "GNU"];
+        };
+        shfmt = {
+          includes = ["*.bash"];
+        };
+      };
+    };
+  }
+)
diff --git a/templates/rust/.licensure.yml b/templates/rust/.licensure.yml
index e1f5a01..b7f963a 100644
--- a/templates/rust/.licensure.yml
+++ b/templates/rust/.licensure.yml
@@ -14,6 +14,24 @@ excludes:
 # 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: Benedikt Peetz
+        email: "benedikt.peetz@b-peetz.de"
+
+    template: |
+      <TODO> 2024 - [year] (C) by [name of author]
+      SPDX-License-Identifier: CC-BY-SA-4.0
+
+      <TODO> 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
diff --git a/templates/rust/scripts/renew_copyright_header.sh b/templates/rust/scripts/renew_copyright_header.sh
index f286da9..edb0a65 120000..100755
--- a/templates/rust/scripts/renew_copyright_header.sh
+++ b/templates/rust/scripts/renew_copyright_header.sh
@@ -1 +1,86 @@
-../../../common/renew_copyright_header.sh
\ No newline at end of file
+#! /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
+
+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" | "toml" | "envrc" | "yml" | "gitignore" | "awk")
+        sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file"
+        ;;
+    # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long)
+    "c" | "h" | "md" | "rs")
+        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: GPL-3.0-or-later' "$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
diff --git a/templates/rust/treefmt.nix b/templates/rust/treefmt.nix
index 6a4fe7d..1cbab40 120000..100644
--- a/templates/rust/treefmt.nix
+++ b/templates/rust/treefmt.nix
@@ -1 +1,73 @@
-../../treefmt.nix
\ No newline at end of file
+{
+  treefmt-nix,
+  pkgs,
+}:
+treefmt-nix.lib.evalModule pkgs (
+  {pkgs, ...}: {
+    # Used to find the project root
+    projectRootFile = "flake.nix";
+
+    programs = {
+      alejandra.enable = true;
+      rustfmt.enable = true;
+      clang-format.enable = true;
+      mdformat.enable = true;
+      shfmt = {
+        enable = true;
+        indent_size = 4;
+      };
+      shellcheck.enable = true;
+      prettier = {
+        settings = {
+          arrowParens = "always";
+          bracketSameLine = false;
+          bracketSpacing = true;
+          editorconfig = true;
+          embeddedLanguageFormatting = "auto";
+          endOfLine = "lf";
+          # experimentalTernaries = false;
+          htmlWhitespaceSensitivity = "css";
+          insertPragma = false;
+          jsxSingleQuote = true;
+          printWidth = 80;
+          proseWrap = "always";
+          quoteProps = "consistent";
+          requirePragma = false;
+          semi = true;
+          singleAttributePerLine = true;
+          singleQuote = true;
+          trailingComma = "all";
+          useTabs = false;
+          vueIndentScriptAndStyle = false;
+
+          tabWidth = 4;
+          overrides = {
+            files = ["*.js"];
+            options.tabwidth = 2;
+          };
+        };
+      };
+      stylua.enable = true;
+      ruff = {
+        enable = true;
+        format = true;
+      };
+      taplo.enable = true;
+    };
+
+    settings = {
+      global.excludes = [
+        "CHANGELOG.md"
+        "NEWS.md"
+      ];
+      formatter = {
+        clang-format = {
+          options = ["--style" "GNU"];
+        };
+        shfmt = {
+          includes = ["*.bash"];
+        };
+      };
+    };
+  }
+)
diff --git a/templates/shell/.licensure.yml b/templates/shell/.licensure.yml
index e1f5a01..b7f963a 100644
--- a/templates/shell/.licensure.yml
+++ b/templates/shell/.licensure.yml
@@ -14,6 +14,24 @@ excludes:
 # 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: Benedikt Peetz
+        email: "benedikt.peetz@b-peetz.de"
+
+    template: |
+      <TODO> 2024 - [year] (C) by [name of author]
+      SPDX-License-Identifier: CC-BY-SA-4.0
+
+      <TODO> 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
diff --git a/templates/shell/scripts/renew_copyright_header.sh b/templates/shell/scripts/renew_copyright_header.sh
index f286da9..edb0a65 120000..100755
--- a/templates/shell/scripts/renew_copyright_header.sh
+++ b/templates/shell/scripts/renew_copyright_header.sh
@@ -1 +1,86 @@
-../../../common/renew_copyright_header.sh
\ No newline at end of file
+#! /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
+
+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" | "toml" | "envrc" | "yml" | "gitignore" | "awk")
+        sed --in-place "1,${TEMPLATE_LINE_LENGTH}d" "$file"
+        ;;
+    # normal '/* ... */' like comments (these are $TEMPLATE_LINE_LENGTH + 2 lines long)
+    "c" | "h" | "md" | "rs")
+        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: GPL-3.0-or-later' "$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
diff --git a/templates/shell/treefmt.nix b/templates/shell/treefmt.nix
index 6a4fe7d..1cbab40 120000..100644
--- a/templates/shell/treefmt.nix
+++ b/templates/shell/treefmt.nix
@@ -1 +1,73 @@
-../../treefmt.nix
\ No newline at end of file
+{
+  treefmt-nix,
+  pkgs,
+}:
+treefmt-nix.lib.evalModule pkgs (
+  {pkgs, ...}: {
+    # Used to find the project root
+    projectRootFile = "flake.nix";
+
+    programs = {
+      alejandra.enable = true;
+      rustfmt.enable = true;
+      clang-format.enable = true;
+      mdformat.enable = true;
+      shfmt = {
+        enable = true;
+        indent_size = 4;
+      };
+      shellcheck.enable = true;
+      prettier = {
+        settings = {
+          arrowParens = "always";
+          bracketSameLine = false;
+          bracketSpacing = true;
+          editorconfig = true;
+          embeddedLanguageFormatting = "auto";
+          endOfLine = "lf";
+          # experimentalTernaries = false;
+          htmlWhitespaceSensitivity = "css";
+          insertPragma = false;
+          jsxSingleQuote = true;
+          printWidth = 80;
+          proseWrap = "always";
+          quoteProps = "consistent";
+          requirePragma = false;
+          semi = true;
+          singleAttributePerLine = true;
+          singleQuote = true;
+          trailingComma = "all";
+          useTabs = false;
+          vueIndentScriptAndStyle = false;
+
+          tabWidth = 4;
+          overrides = {
+            files = ["*.js"];
+            options.tabwidth = 2;
+          };
+        };
+      };
+      stylua.enable = true;
+      ruff = {
+        enable = true;
+        format = true;
+      };
+      taplo.enable = true;
+    };
+
+    settings = {
+      global.excludes = [
+        "CHANGELOG.md"
+        "NEWS.md"
+      ];
+      formatter = {
+        clang-format = {
+          options = ["--style" "GNU"];
+        };
+        shfmt = {
+          includes = ["*.bash"];
+        };
+      };
+    };
+  }
+)
diff --git a/treefmt.nix b/treefmt.nix
index 1cbab40..d29102a 100644..120000
--- a/treefmt.nix
+++ b/treefmt.nix
@@ -1,73 +1 @@
-{
-  treefmt-nix,
-  pkgs,
-}:
-treefmt-nix.lib.evalModule pkgs (
-  {pkgs, ...}: {
-    # Used to find the project root
-    projectRootFile = "flake.nix";
-
-    programs = {
-      alejandra.enable = true;
-      rustfmt.enable = true;
-      clang-format.enable = true;
-      mdformat.enable = true;
-      shfmt = {
-        enable = true;
-        indent_size = 4;
-      };
-      shellcheck.enable = true;
-      prettier = {
-        settings = {
-          arrowParens = "always";
-          bracketSameLine = false;
-          bracketSpacing = true;
-          editorconfig = true;
-          embeddedLanguageFormatting = "auto";
-          endOfLine = "lf";
-          # experimentalTernaries = false;
-          htmlWhitespaceSensitivity = "css";
-          insertPragma = false;
-          jsxSingleQuote = true;
-          printWidth = 80;
-          proseWrap = "always";
-          quoteProps = "consistent";
-          requirePragma = false;
-          semi = true;
-          singleAttributePerLine = true;
-          singleQuote = true;
-          trailingComma = "all";
-          useTabs = false;
-          vueIndentScriptAndStyle = false;
-
-          tabWidth = 4;
-          overrides = {
-            files = ["*.js"];
-            options.tabwidth = 2;
-          };
-        };
-      };
-      stylua.enable = true;
-      ruff = {
-        enable = true;
-        format = true;
-      };
-      taplo.enable = true;
-    };
-
-    settings = {
-      global.excludes = [
-        "CHANGELOG.md"
-        "NEWS.md"
-      ];
-      formatter = {
-        clang-format = {
-          options = ["--style" "GNU"];
-        };
-        shfmt = {
-          includes = ["*.bash"];
-        };
-      };
-    };
-  }
-)
+common/treefmt.nix
\ No newline at end of file