summaryrefslogtreecommitdiff
path: root/scripts/rev-check
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/rev-check')
-rwxr-xr-xscripts/rev-check315
1 files changed, 315 insertions, 0 deletions
diff --git a/scripts/rev-check b/scripts/rev-check
new file mode 100755
index 000000000..05b092afd
--- /dev/null
+++ b/scripts/rev-check
@@ -0,0 +1,315 @@
+#!/bin/bash
+
+# This script will allow to check for changes in the original
+# English docs for languages that use po files for translation.
+# It combines the function of the old doc-check and rev-update
+# scripts (resulting in the name rev-check :-)
+
+# For each language, the last three revisions for which the
+# translation has been updated are saved in a file.
+# The current revision of English documents is checked against
+# the most recent revisions in this file.
+
+lang=""
+default_lang="nl"
+file=""
+
+print_usage () {
+ echo "Usage: $(basename $0) [options] [language] [file]"
+ echo " TODO: explanation of syntax and options"
+}
+
+print_usage_err () {
+ print_usage
+ exit 1
+}
+
+check_parm_lang () {
+ # Check that directory exists won't work after conversion to po...
+ if [ -d "$1" ] ; then
+ lang="$1"
+ else
+ echo "Info: no valid language specified, using default '$default_lang'"
+ if [ -d "$default_lang" ] ; then
+ lang="$default_lang"
+ return 1
+ else
+ echo "Error: directory for language '$default_lang' not found"
+ print_usage_err
+ fi
+ fi
+ return 0
+}
+
+check_parm_file () {
+ file=$(echo "$1" | sed "s:^./::" | sed "s:^en/::")
+ if [ ! -f "./en/$file" ] ; then
+ echo "Error: file '$file' does not exist"
+ return 1
+ fi
+ return 0
+}
+
+parse_opts () {
+ command="check"
+ do_diff=""
+ do_all=""
+ parm_count=0
+
+ for opt in $@; do
+ case "$opt" in
+ --update|-u)
+ [ $command = "check" ] || print_usage_err
+ command="update"
+ ;;
+ --add|-a)
+ [ $command = "check" ] || print_usage_err
+ command="add"
+ ;;
+ --diff|-d)
+ do_diff=1
+ ;;
+ --all|-A)
+ do_all=1
+ ;;
+ --convert)
+ [ $command = "check" ] || print_usage_err
+ command="convert"
+ ;;
+ --help|-h)
+ print_usage
+ exit 0
+ ;;
+ -*)
+ print_usage_err
+ ;;
+ *)
+ parm_count=$(($parm_count + 1))
+ if [ $parm_count -eq 1 ] ; then
+ check_parm_lang "$opt"
+ [ $? -ne 0 ] && parm_count=$(($parm_count + 1))
+ fi
+ if [ $parm_count -eq 2 ] ; then
+ check_parm_file "$opt"
+ [ $? -ne 0 ] && print_usage_err
+ fi
+
+ [ $parm_count -gt 2 ] && print_usage_err
+ ;;
+ esac
+
+ done
+
+ [ -z "$lang" ] && check_parm_lang "<none>"
+
+ case $command in
+ check)
+ [ "$do_all" ] && print_usage_err
+ ;;
+ convert)
+ [ "$do_all" ] && print_usage_err
+ if [ -n "$file" ] ; then
+ echo "Error: parameter [file] not allowed with --$command option"
+ print_usage_err
+ fi
+ if [ ! -d $lang ] ; then
+ echo "Error: directory for language '$lang' not found"
+ exit 1
+ fi
+ ;;
+ add|update)
+ if [ ! "$do_all" ] && [ -z "$file" ] ; then
+ echo "Error: parameter [file] missing, to update all files add --all option"
+ print_usage_err
+ fi
+ if [ "$do_all" ] && [ ! -z "$file" ] ; then
+ echo "Error: parameter [file] not allowed with --all option"
+ print_usage_err
+ fi
+ ;;
+ esac
+}
+
+get_rev () {
+ local REV
+ REV="$(egrep '^<\!--[[:space:]]*\$Id:' ./en/$1 | \
+ sed 's/^.*$Id:[[:space:]]*//' | cut -d " " -f 2)"
+ if [ -z "$REV" ] ; then
+ echo "Error: could not determine revision of './en/$1'"
+ return 1
+ fi
+ echo "$REV"
+ return 0
+}
+
+get_trev () {
+ local TREV
+ [ "$2" = "all" ] && fields="2-" || fields="2"
+ TREV="$(egrep "^$1" $rev_file | cut -f $fields)"
+ if [ -z "$TREV" ] ; then
+ return 1
+ fi
+ echo "$TREV"
+ return 0
+}
+
+print_diff () {
+ local TREV
+ local TREV_PREV=""
+ for TREV in $2; do
+ [ "$TREV_PREV" ] && echo "Diff against revision $TREV_PREV failed, trying next oldest: $TREV"
+ svn diff -r $TREV:$3 ./en/$1
+ [ $? -eq 0 ] && break
+ TREV_PREV=$TREV
+ done
+}
+
+check_one () {
+ REV=$(get_rev $1)
+ [ $? -ne 0 ] && return 9
+ TREV=$(get_trev $1)
+ if [ $? -ne 0 ] ; then
+ echo "$1: N/A -> $REV"
+ return 2
+ fi
+
+ local RET=0
+ if [ ! "$TREV" = "$REV" ] ; then
+ RET=1
+ echo "$1: $TREV -> $REV"
+ if [ "$do_diff" ] ; then
+ print_diff $1 "$(get_trev $1 all)" $REV
+ echo
+ fi
+ fi
+ return $RET
+}
+
+do_check () {
+ local RESULT=0
+ if [ -n "$file" ] ; then
+ check_one $file
+ RESULT=$?
+ else
+ for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
+ check_one $file
+ [ $? -eq 1 ] && RESULT=1
+ done
+ fi
+ [ $RESULT -ne 1 ] && echo "No updates found"
+}
+
+update_revdata () {
+ cp $rev_file $rev_file~
+ egrep -v "^$1" $rev_file~ >$rev_file
+
+ # Keep the last three revisions in $rev_file
+ local REV
+ local counter=1
+ echo -n "$1" >>$rev_file
+ for REV in $2; do
+ echo -en "\t$REV" >>$rev_file
+ counter=$(($counter + 1))
+ [ $counter -gt 3 ] && break
+ done
+ echo >>$rev_file
+ echo " Revision updated"
+}
+
+update_one () {
+ local file=$1
+ check_one $file
+ if [ $? -eq 1 ] ; then
+ update_revdata $1 "$REV $(get_trev $1 all)"
+ fi
+}
+
+do_update () {
+ if [ -n "$file" ] ; then
+ update_one $file
+ else
+ for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
+ update_one $file
+ done
+ fi
+}
+
+do_add_one () {
+ if egrep "^$file" $rev_file ; then
+ echo "Error: revision data already has '$file'"
+ exit 1
+ fi
+
+ REV=$(get_rev $1)
+ [ $? -ne 0 ] && exit 1
+
+ echo -e "$file\t$REV" >>$rev_file
+}
+
+do_add_all () {
+ for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
+ if [ -f $rev_file ] && egrep "^$file" $rev_file ; then
+ continue
+ fi
+
+ REV=$(get_rev $file)
+ [ $? -ne 0 ] && continue
+
+ echo -e "$file\t$REV" >>$rev_file
+ echo "Added '$file' at $REV"
+ done
+}
+
+do_convert () {
+ for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
+ if [ -f ./$lang/$file ]; then
+ REV="$(egrep '^<\!--[[:space:]]*original version:' ./$lang/$file | \
+ sed 's/^.*original version:[[:space:]]*//' | cut -d " " -f 1)"
+ if [ -z "$REV" ] ; then
+ echo "Warning: no revision comment found for './$lang/$file'"
+ else
+ echo -e "$file\t$REV" >>$rev_file
+ fi
+ else
+ echo "Warning: file './$lang/$file' not found"
+ fi
+ done
+}
+
+
+## MAINLINE
+
+[ -d ./po/revdata ] || exit 1
+
+parse_opts "$@"
+rev_file=./po/revdata/$lang.dat
+
+if [ "$command" = "convert" ] || \
+ ( [ "$command" = "add" ] && [ "$do_all" ] ) ; then
+ if [ -s $rev_file ] ; then
+ echo "Error: file with revision data already exists"
+ exit 1
+ fi
+else
+ if [ ! -s $rev_file ] ; then
+ echo "Error: file with revision data does not exist"
+ exit 1
+ fi
+fi
+
+case $command in
+ check)
+ do_check
+ ;;
+ update)
+ do_update
+ ;;
+ add)
+ [ "$do_all" ] && do_add_all || do_add_one
+ ;;
+ convert)
+ do_convert
+ ;;
+esac
+
+exit 0