From ac6f1de626b8a21c88a625cf77dd922d2214d867 Mon Sep 17 00:00:00 2001 From: Vratko Polak Date: Wed, 17 Apr 2024 17:24:24 +0200 Subject: [PATCH] feat(tox): add copyright year fixer script 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 --- resources/libraries/bash/entry/tox/README.txt | 14 +++--- .../libraries/bash/entry/tox/copyright_year.sh | 9 ++-- .../libraries/bash/entry/tox/fix_copyright_year.sh | 55 ++++++++++++++++++++++ resources/libraries/python/LispSetup.py | 2 +- tox.ini | 4 ++ 5 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 resources/libraries/bash/entry/tox/fix_copyright_year.sh diff --git a/resources/libraries/bash/entry/tox/README.txt b/resources/libraries/bash/entry/tox/README.txt index e13b60209e..9ce21e93d0 100644 --- a/resources/libraries/bash/entry/tox/README.txt +++ b/resources/libraries/bash/entry/tox/README.txt @@ -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: @@ -14,6 +14,13 @@ 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_? diff --git a/resources/libraries/bash/entry/tox/copyright_year.sh b/resources/libraries/bash/entry/tox/copyright_year.sh index 9ed9fcb653..272763100e 100644 --- a/resources/libraries/bash/entry/tox/copyright_year.sh +++ b/resources/libraries/bash/entry/tox/copyright_year.sh @@ -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 index 0000000000..d822f272af --- /dev/null +++ b/resources/libraries/bash/entry/tox/fix_copyright_year.sh @@ -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 diff --git a/resources/libraries/python/LispSetup.py b/resources/libraries/python/LispSetup.py index 6579764596..9e3ef97aa3 100644 --- a/resources/libraries/python/LispSetup.py +++ b/resources/libraries/python/LispSetup.py @@ -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 2d7fbdd126..e0ac85c22a 100644 --- 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 -- 2.16.6