feat(tox): add copyright year fixer script 54/35154/15
authorVratko Polak <vrpolak@cisco.com>
Wed, 17 Apr 2024 15:24:24 +0000 (17:24 +0200)
committerVratko Polak <vrpolak@cisco.com>
Wed, 17 Apr 2024 15:24:24 +0000 (17:24 +0200)
It uses rather simple sed commands, but seems to work well enough.

+ Improve readme.
+ Shortened comments about why 3 lines.

Change-Id: I50b395dfeb586f671f7c4c82f22369de90b351ec
Signed-off-by: Vratko Polak <vrpolak@cisco.com>
resources/libraries/bash/entry/tox/README.txt
resources/libraries/bash/entry/tox/copyright_year.sh
resources/libraries/bash/entry/tox/fix_copyright_year.sh [new file with mode: 0644]
resources/libraries/python/LispSetup.py
tox.ini

index e13b602..9ce21e9 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2022 Cisco and/or its affiliates.
+# Copyright (c) 2024 Cisco and/or its affiliates.
 # 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:
 This directory contains tox scripts and other files they need.
 Generally, a tox script is either a checker (suitable for automated verify)
 or a fixer (manually started, risky as uncommitted edits can be lost).
+
+In the tox verify job we want to avoid running fixers,
+as they can affect what other checkers see
+(e.g. autogen fixer could add more too long lines).
+That is why we keep fixers separate from checkers in principle,
+even for fairly safe tasks (e.g. bumping copyright years).
+
 Each tox script is assumed to be run from tox,
 when working directory is set to ${CSIT_DIR}.
 
@@ -26,14 +33,9 @@ Each checker script should:
 + Only the output suitable for automated processing by an external caller
   should be written to stdout.
 ++ The level of "less verbose" depends on check and state of codebase.
-+ TODO: Should we carefully document which files are
-  whitelisted/blacklisted for a particulat check?
 
 Each fixer script should:
 + Perform edits on current filesystem
 + Not assume git is clean (there may be uncommitted edits).
 + Use "git diff HEAD~" to get both comitted and uncomitted edits to analyze.
 + Output whatever it wants (possibly nothing).
-
-TODO: Should checkers be named differently than fixers?
-      E.g. both scripts and tox environments start with fix_?
index 9ed9fcb..2727631 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2022 Cisco and/or its affiliates.
+# Copyright (c) 2024 Cisco and/or its affiliates.
 # 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:
@@ -24,10 +24,7 @@ set -exuo pipefail
 # but not the current year (in the same line).
 # The offending lines are stored to copyright_year.log (overwriting).
 #
-# 3 lines were chosen, because first two lines could be shebang and empty line,
-# and more than 3 lines would start failing on files with multiple copyright
-# holders. There, only the last updating entity needs to bump its year,
-# and put other copyright lines below.
+# 3 lines were chosen, because first two lines could be shebang and empty line.
 
 # "set -eu" handles failures from the following two lines.
 BASH_CHECKS_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
@@ -42,7 +39,7 @@ IFS=$'\n'
 files=($(git diff --name-only HEAD~ || true))
 unset IFS
 truncate -s 0 "copyright_year.log" || die
-# A change can have thousands of files, supress console output in the cycle.
+# A change can have thousands of files, supress console output for the cycle.
 set +x
 for fil in "${files[@]}"; do
     # Greps do "fail" on 0 line output, we need to ignore that
diff --git a/resources/libraries/bash/entry/tox/fix_copyright_year.sh b/resources/libraries/bash/entry/tox/fix_copyright_year.sh
new file mode 100644 (file)
index 0000000..d822f27
--- /dev/null
@@ -0,0 +1,55 @@
+# Copyright (c) 2024 Cisco and/or its affiliates.
+# 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.
+
+set -exuo pipefail
+
+# This file should be executed from tox, as the assumed working directory
+# is different from where this file is located.
+# This file does not have executable flag nor shebang,
+# to dissuade non-tox callers.
+
+# This is a fixer script, so be careful before starting it.
+# It is recommended to always commit your recent edits before running this,
+# and use "git diff" after running this to confirm the edits are correct.
+# Otherwise you can lose your edits and introduce bad edits.
+
+# This script runs a variant of "git diff" command
+# to get the list of edited files, and few sed commands to edit the year
+# if "20.." pattern matches in first 3 lines.
+# No detection of "copyright", so edits can apply at surprising places.
+
+# 3 lines were chosen, because first two lines could be shebang and empty line.
+
+# "set -eu" handles failures from the following two lines.
+BASH_CHECKS_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
+BASH_FUNCTION_DIR="$(readlink -e "${BASH_CHECKS_DIR}/../../function")"
+source "${BASH_FUNCTION_DIR}/common.sh" || {
+    echo "Source failed." >&2
+    exit 1
+}
+
+year=$(date +'%Y')
+IFS=$'\n'
+files=($(git diff --name-only HEAD~ || true))
+unset IFS
+# A change can have thousands of files, supress console output for the cycle.
+set +x
+for fil in "${files[@]}"; do
+    if [[ -f "${fil}" ]]; then
+        sed -i "1 s/20../${year}/g" "${fil}"
+        sed -i "2 s/20../${year}/g" "${fil}"
+        sed -i "3 s/20../${year}/g" "${fil}"
+    # Else the file was actually deleted and sed would fail.
+    fi
+done
+set -x
index 6579764..9e3ef97 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2016-2020 Cisco and/or its affiliates.
+# Copyright (c) 2024 Cisco and/or its affiliates.
 # 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:
diff --git a/tox.ini b/tox.ini
index 2d7fbdd..e0ac85c 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -51,6 +51,10 @@ commands = bash {[tox]script_dir}/autogen.sh
 whitelist_externals = bash
 commands = bash {[tox]script_dir}/copyright_year.sh
 
+[testenv:fix_copyright_year]
+whitelist_externals = bash
+commands = bash {[tox]script_dir}/fix_copyright_year.sh
+
 [testenv:gpl_license]
 whitelist_externals = bash
 commands = bash {[tox]script_dir}/gpl_license.sh