aboutsummaryrefslogtreecommitdiff
path: root/copyright
diff options
context:
space:
mode:
Diffstat (limited to 'copyright')
-rwxr-xr-xcopyright78
1 files changed, 78 insertions, 0 deletions
diff --git a/copyright b/copyright
new file mode 100755
index 0000000..b9b5aa0
--- /dev/null
+++ b/copyright
@@ -0,0 +1,78 @@
+#! /usr/bin/env bash
+
+# Update copyright in a git project. The fact that it is a git project is
+# used to avoid submodules as well as generated files. In other words, only
+# files tracked by git are updated.
+#
+# Run from the project root.
+#
+usage="usage: copyright <old-year> <new-year>"
+
+owd=`pwd`
+trap "{ cd $owd; exit 1; }" ERR
+set -o errtrace # Trap in functions.
+
+function info () { echo "$*" 1>&2; }
+function error () { info "$*"; exit 1; }
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ *)
+ break
+ ;;
+ esac
+done
+
+old="$1"
+new="$2"
+
+if [ -z "$old" -o -z "$new" ]; then
+ error "$usage"
+fi
+
+# Load submodules into a map.
+#
+declare -A submodules
+for s in $(git submodule foreach -q 'echo $path'); do
+ submodules["$s"]=true
+done
+
+# Get the list of files.
+#
+files=()
+while IFS= read -r -d '' f; do
+
+ if [ "${submodules["$f"]}" = true ]; then
+ info "skipping submodule $f"
+ continue
+ fi
+
+ # Exclude symlinks (normally point into a submodule).
+ #
+ if test -L "$f"; then
+ info "skipping symlink $f"
+ continue
+ fi
+
+ files+=("$f")
+
+done < <(git ls-tree -r HEAD -z --name-only )
+
+# Process each file.
+#
+for f in "${files[@]}"; do
+
+ info "processing $f"
+
+ sed -i -re "s/(Copyright \(c\) [0-9]+)-$old (Code Synthesis)/\1-$new \2/" "$f"
+
+ # Grep for matching copyrights that didn't end with $old (or have other
+ # discrepancies like single year only, etc).
+ #
+ grep -vE "Copyright \(c\) [0-9]+-$new (Code Synthesis)" "$f" | \
+ grep -iE --color=auto "Copyright.*Code Synthesis" || true
+
+ # Grep for the old year (for review).
+ #
+ grep --color=auto --with-filename "$old" "$f" || true
+done