| author | insilmaril | 
| Wed, 25 Apr 2007 16:02:54 +0000 | |
| changeset 460 | 12e763c3e486 | 
| parent 147 | 40de292411b6 | 
| child 612 | 316e9237794c | 
| permissions | -rwxr-xr-x | 
| insilmaril@147 | 1 | #! /bin/bash | 
| insilmaril@147 | 2 | # | 
| insilmaril@147 | 3 | |
| insilmaril@147 | 4 | set -e # abort on errors | 
| insilmaril@147 | 5 | shopt -s nullglob # file globs that don't match expand | 
| insilmaril@147 | 6 | # to nothing | 
| insilmaril@147 | 7 | |
| insilmaril@147 | 8 | # | 
| insilmaril@147 | 9 | # Check if $EDITOR is set, otherwise set to "vi". | 
| insilmaril@147 | 10 | # | 
| insilmaril@147 | 11 | : ${EDITOR:=vi}
 | 
| insilmaril@147 | 12 | |
| insilmaril@147 | 13 | # | 
| insilmaril@147 | 14 | # Check for -f option () | 
| insilmaril@147 | 15 | # | 
| insilmaril@147 | 16 | if [ "$1" = -f ]; then | 
| insilmaril@147 | 17 | retry_lock=1 | 
| insilmaril@147 | 18 | shift | 
| insilmaril@147 | 19 | fi | 
| insilmaril@147 | 20 | |
| insilmaril@147 | 21 | # | 
| insilmaril@147 | 22 | # Detect the name of the file to edit | 
| insilmaril@147 | 23 | # | 
| insilmaril@147 | 24 | unset FILE | 
| insilmaril@147 | 25 | |
| insilmaril@147 | 26 | if [ -n "$1" ]; then | 
| insilmaril@147 | 27 | if [ -f "$1" ]; then | 
| insilmaril@147 | 28 | FILE=$1 | 
| insilmaril@147 | 29 | else | 
| insilmaril@147 | 30 | if [ -d "$1" ]; then | 
| insilmaril@147 | 31 | cd $1 | 
| insilmaril@147 | 32 | else | 
| insilmaril@147 | 33 | FILE=$(package_name $1).changelog | 
| insilmaril@147 | 34 | fi | 
| insilmaril@147 | 35 | fi | 
| insilmaril@147 | 36 | fi | 
| insilmaril@147 | 37 | |
| insilmaril@147 | 38 | if [ -z "$FILE" ]; then | 
| insilmaril@147 | 39 | for f in *.changelog; do | 
| insilmaril@147 | 40 | if [ -n "$FILE" ]; then | 
| insilmaril@147 | 41 | FILE= | 
| insilmaril@147 | 42 | break | 
| insilmaril@147 | 43 | fi | 
| insilmaril@147 | 44 | FILE=$f | 
| insilmaril@147 | 45 | done | 
| insilmaril@147 | 46 | fi | 
| insilmaril@147 | 47 | |
| insilmaril@147 | 48 | if [ -z "$FILE" ]; then | 
| insilmaril@147 | 49 | for f in *.spec; do | 
| insilmaril@147 | 50 | if [ -n "$FILE" ]; then | 
| insilmaril@147 | 51 | FILE= | 
| insilmaril@147 | 52 | break | 
| insilmaril@147 | 53 | fi | 
| insilmaril@147 | 54 | FILE=$f | 
| insilmaril@147 | 55 | done | 
| insilmaril@147 | 56 | if [ -n "$FILE" ]; then | 
| insilmaril@147 | 57 | FILE=$(package_name $FILE).changelog | 
| insilmaril@147 | 58 | fi | 
| insilmaril@147 | 59 | fi | 
| insilmaril@147 | 60 | |
| insilmaril@147 | 61 | if [ -z "$FILE" ]; then | 
| insilmaril@147 | 62 |     echo "usage: ${0##*/} [filename[.changelog]|path [file_with_comment]]"
 | 
| insilmaril@147 | 63 | echo "If no <filename> is given, exactly one *.changelog or" | 
| insilmaril@147 | 64 | echo "*.spec file has to be in the cwd or in <path>." | 
| insilmaril@147 | 65 | echo | 
| insilmaril@147 | 66 | exit 1 | 
| insilmaril@147 | 67 | fi | 
| insilmaril@147 | 68 | |
| insilmaril@147 | 69 | user=`whoami` | 
| insilmaril@147 | 70 | |
| insilmaril@147 | 71 | |
| insilmaril@147 | 72 | COMMENT_FILE=$2 | 
| insilmaril@147 | 73 | |
| insilmaril@147 | 74 | # | 
| insilmaril@147 | 75 | # Create the lockfile and temporary file. | 
| insilmaril@147 | 76 | # | 
| insilmaril@147 | 77 | lockfile=.${FILE##*/}.lock
 | 
| insilmaril@147 | 78 | if [ "${FILE/\//}" != "$FILE" ]; then
 | 
| insilmaril@147 | 79 |     lockfile=${FILE%/*}/.$lockfile
 | 
| insilmaril@147 | 80 | fi | 
| insilmaril@147 | 81 | |
| insilmaril@147 | 82 | if [ ! -w "$(dirname "$FILE")" ]; then | 
| insilmaril@147 | 83 | echo "Write access to directory $(dirname "$FILE") required" >&2 | 
| insilmaril@147 | 84 | exit 1 | 
| insilmaril@147 | 85 | fi | 
| insilmaril@147 | 86 | |
| insilmaril@147 | 87 | if [ -e "$FILE" -a ! -w "$FILE" ]; then | 
| insilmaril@147 | 88 | echo "Write access to file $FILE required" >&2 | 
| insilmaril@147 | 89 | exit 1 | 
| insilmaril@147 | 90 | fi | 
| insilmaril@147 | 91 | |
| insilmaril@147 | 92 | set -o noclobber | 
| insilmaril@147 | 93 | while ! echo $$@$(hostname -f) 2> /dev/null > $lockfile; do | 
| insilmaril@147 | 94 | if [ -z "$retry_lock" ]; then | 
| insilmaril@147 | 95 | echo "$lockfile: Lock by process $(cat $lockfile)" >&2 | 
| insilmaril@147 | 96 | echo "Please remove stale lockfiles manually" >&2 | 
| insilmaril@147 | 97 | exit 1 | 
| insilmaril@147 | 98 | fi | 
| insilmaril@147 | 99 | echo "$lockfile: Waiting for process $(cat $lockfile) to release lock" >&2 | 
| insilmaril@147 | 100 | sleep 1 | 
| insilmaril@147 | 101 | done | 
| insilmaril@147 | 102 | set +o noclobber | 
| insilmaril@147 | 103 | |
| insilmaril@147 | 104 | tmpfile=$(mktemp /tmp/${0##*/}.XXXXXX)
 | 
| insilmaril@147 | 105 | trap "rm -f $lockfile $tmpfile" EXIT | 
| insilmaril@147 | 106 | |
| insilmaril@147 | 107 | # | 
| insilmaril@147 | 108 | # Prepare the working copy and start the editor | 
| insilmaril@147 | 109 | # | 
| insilmaril@147 | 110 | |
| insilmaril@147 | 111 | {   timestamp=$(LC_ALL=POSIX TZ=Europe/Berlin date)
 | 
| insilmaril@147 | 112 | echo "-------------------------------------------------------------------" | 
| insilmaril@147 | 113 | echo "$timestamp - $user" | 
| insilmaril@147 | 114 | echo | 
| insilmaril@147 | 115 | if [ -z "$COMMENT_FILE" ]; then | 
| insilmaril@147 | 116 | echo "- " | 
| insilmaril@147 | 117 | else | 
| insilmaril@147 | 118 | cat $COMMENT_FILE | 
| insilmaril@147 | 119 | fi | 
| insilmaril@147 | 120 | echo | 
| insilmaril@147 | 121 | if [ -f "$FILE" ]; then | 
| insilmaril@147 | 122 | cat $FILE | 
| insilmaril@147 | 123 | fi | 
| insilmaril@147 | 124 | } >> $tmpfile \ | 
| insilmaril@147 | 125 | || exit 1 | 
| insilmaril@147 | 126 | |
| insilmaril@147 | 127 | if [ -z "$COMMENT_FILE" ]; then | 
| insilmaril@147 | 128 | lines=1 | 
| insilmaril@147 | 129 |     CHKSUM_BEFORE=$(md5sum $tmpfile | awk '{print $1}')
 | 
| insilmaril@147 | 130 | else | 
| insilmaril@147 | 131 |     lines=$(wc -l $COMMENT_FILE | awk '{print $1}')
 | 
| insilmaril@147 | 132 | CHKSUM_BEFORE=has_changed | 
| insilmaril@147 | 133 | fi | 
| insilmaril@147 | 134 | |
| insilmaril@147 | 135 | $EDITOR +$((3+lines)) $tmpfile | 
| insilmaril@147 | 136 | |
| insilmaril@147 | 137 | if [ "$CHKSUM_BEFORE" = "$(md5sum $tmpfile | awk '{print $1}')" ]; then
 | 
| insilmaril@147 | 138 | exit 1 | 
| insilmaril@147 | 139 | fi | 
| insilmaril@147 | 140 | cat $tmpfile > $FILE |