1
0
Fork 0
flightgear/scripts/tools/fg-submit

149 lines
3.4 KiB
Text
Raw Normal View History

#!/bin/bash
#
# This script called in a CVS directory generates an archive in that
# same directory, which contains all locally added new files (except
# those rejected by the script) and a diff with all local changes.
# This archive can then be offered to one of the CVS maintainers for
# committing.
#
# Usage:
# $ cd $FG_ROOT/Aircraft/foo
# $ fg-submit # generates foo.tar.bz2 and foo.diff
#
# The archive contains a copy of the diff, which is only left for
# convenience and doesn't have to be submitted.
SELF=$(basename $0)
AIRCRAFT=$(basename $PWD)
CVS=/usr/bin/cvs
ARCHIVE=$AIRCRAFT.tar.bz2
DIFF=$AIRCRAFT.diff
function ERROR { echo -e "\e[31;1m$*\e[m"; }
function LOG { echo -e "\e[35m$*\e[m"; }
function ADD { echo -e "\e[32m\t+ $*\e[m"; }
function REJECT { echo -e "\e[31m\t- $*\e[m"; }
function diffstat {
# output diff statistics, similar to the "diffstat" utility
awk '
function out() {
if (bin) {
print "\t\tbinary\t\t"file;
} else {
print "\t+"a"\t-"r"\t!"c"\t"file
}
}
BEGIN {
print "\tadded___removed_changed___________________________________";
a = r = c = at = rt = ct = n = bin = 0;
}
/^Index: / { if (file) { out() } a = r = c = scan = bin = 0; file = $2; n += 1 }
/^@@/ { scan = 1 }
/^Binary/ { if (!scan) { bin = 1 } }
/^+/ { if (scan) { a += 1; at += 1 } }
/^-/ { if (scan) { r += 1; rt += 1 } }
/^!/ { if (scan) { c += 1; ct += 1 } }
END {
if (file) { out() }
print "\t-----------------------------------total------------------";
print "\t+"at"\t-"rt"\t!"ct"\tin "n" files"
}
' < $1
}
# create temporary dir that's automatcally removed on exit
TMP=$(mktemp -d /tmp/$SELF.$AIRCRAFT.XXXXXX) || (echo "$0: can't create temporary dir"; exit 1)
trap "rm -rf $TMP" 0 1 2 3 13 15
# move older archive or diff file out of the way
[ -f $DIFF ] && mv -i $DIFF $DIFF~
[ -f $ARCHIVE ] && mv -i $ARCHIVE $ARCHIVE~
LOG "updating and checking for changed and new files ..."
$CVS -q up -dP >$TMP/up
if grep "^C " $TMP/up &>/dev/null; then
ERROR "there are conflicts with the following files:"
grep "^C " $TMP/up
exit 1
fi
LOG "making diff ..."
if ! $CVS -q diff >$DIFF; then
LOG "diff statistics:"
diffstat $DIFF
# add diff file itself
echo $DIFF >> $TMP/include
# add changed binary files
awk '
/^Index: / { scan = 1; file = $2 }
/^@@/ { scan = 0 }
/^Binary/ { if (scan) { print file } }
' < $DIFF >>$TMP/include
else
rm -f $DIFF
fi
# write list of all files to add
LOG "adding to archive ..."
if [ -f $TMP/include ]; then
cat $TMP/include|while read i; do
ADD "$i"
echo $i >> $TMP/files
done
fi
grep "^? " $TMP/up|while read i; do
FILE=${i#? }
find $FILE -type f >> $TMP/files
done
# classify and filter files
if [ -f $TMP/files ]; then
for FILE in $(cat $TMP/files); do
case "$FILE" in
$ARCHIVE*|$DIFF*) # don't add files generated by the script
;;
*/.*|.*) # silently drop hidden files
;;
*~|*.bak|*.orig|*..)
REJECT "$FILE\t\t(backup file)"
;;
*CVS/*)
REJECT "$FILE\t\t(CVS file)"
;;
*.blend|*.blend[0-9]|*.blend[0-9][0-9])
REJECT "$FILE\t\t(blender file)"
;;
*.xcf|*.tga|*.bmp|*.BMP|*.png)
REJECT "$FILE\t\t(graphics file)"
;;
*)
ADD "$FILE"
echo "$FILE" >> $TMP/include
;;
esac
done
fi
if [ -f $TMP/include ]; then
LOG "creating archive $ARCHIVE"
tar -cjf $ARCHIVE --files-from $TMP/include
else
LOG "no changes or new files detected"
fi
exit 0