Blame log.sh

Bernhard M. Wiedemann 6ebc4a
#! /bin/bash
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
# log.sh - Automate insertion of patches into a kernel rpm tree managed
Bernhard M. Wiedemann 6ebc4a
# with series.conf
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# Usage example:
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# osc branch openSUSE:11.3/kernel-source
Bernhard M. Wiedemann 6ebc4a
# osc co home:philipsb:branches:openSUSE:11.3:Update:Test/kernel-source
Bernhard M. Wiedemann 6ebc4a
# mv ~/linux-2.6/driver-fix-for-something.patch .
Bernhard M. Wiedemann 6ebc4a
# echo -e "\tpatches.drivers/driver-fix-for-something.patch" >> series.conf
Bernhard M. Wiedemann 6ebc4a
# ./log.sh
Bernhard M. Wiedemann 6ebc4a
# osc commit
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
#############################################################################
Bernhard M. Wiedemann 6ebc4a
# Copyright (c) 2004-2006,2008-2010 Novell, Inc.
Bernhard M. Wiedemann 6ebc4a
# All Rights Reserved.
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# This program is free software; you can redistribute it and/or
Bernhard M. Wiedemann 6ebc4a
# modify it under the terms of version 2 of the GNU General Public License as
Bernhard M. Wiedemann 6ebc4a
# published by the Free Software Foundation.
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# This program is distributed in the hope that it will be useful,
Bernhard M. Wiedemann 6ebc4a
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Bernhard M. Wiedemann 6ebc4a
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
Bernhard M. Wiedemann 6ebc4a
# GNU General Public License for more details.
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# You should have received a copy of the GNU General Public License
Bernhard M. Wiedemann 6ebc4a
# along with this program; if not, contact Novell, Inc.
Bernhard M. Wiedemann 6ebc4a
#
Bernhard M. Wiedemann 6ebc4a
# To contact Novell about this file by physical or electronic mail,
Bernhard M. Wiedemann 6ebc4a
# you may find current contact information at www.novell.com
Bernhard M. Wiedemann 6ebc4a
#############################################################################
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
# Construct a changes entry and commit log from a patch.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
CHANGES=kernel-source.changes
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
trap 'rm -rf "$tmpdir"' EXIT
Bernhard M. Wiedemann 6ebc4a
tmpdir=$(mktemp -d /tmp/${0##*/}.XXXXXX)
Bernhard M. Wiedemann 6ebc4a
message=$tmpdir/message
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
log_entry() {
Bernhard M. Wiedemann 6ebc4a
    local entry=$1
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    echo "$entry" \
Bernhard M. Wiedemann 6ebc4a
    | fmt --width 65 \
Bernhard M. Wiedemann 6ebc4a
    | sed -e '1s/^/- /' -e '2,$s/^/  /' \
Bernhard M. Wiedemann 6ebc4a
    >> $message
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
patch_meta() {
Bernhard M. Wiedemann 6ebc4a
    local patch=$1
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    subject=$(formail -c -x Subject < "$patch" \
Bernhard M. Wiedemann 6ebc4a
             | sed -e 's, *\[[#/ A-Za-z0-9-]*\],,')
Bernhard M. Wiedemann 6ebc4a
    subject=${subject## }
Bernhard M. Wiedemann 6ebc4a
    subject=${subject%.}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    set -- $(formail -c -x References -x Reference < "$patch")
Bernhard M. Wiedemann 6ebc4a
    references="$*"
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
patch_log_entry() {
Bernhard M. Wiedemann 6ebc4a
    local patch=$1 subject references old_subj old_ref old_patch="$tmpdir/old"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    git show "HEAD:$patch" >"$old_patch" 2>/dev/null
Bernhard M. Wiedemann 6ebc4a
    patch_meta "$old_patch"
Bernhard M. Wiedemann 6ebc4a
    old_subj="$subject"
Bernhard M. Wiedemann 6ebc4a
    old_ref="$references"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    patch_meta "$patch"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    local msg
Bernhard M. Wiedemann 6ebc4a
    if test -z "$subject" -o "$subject" != "$old_subj"; then
Bernhard M. Wiedemann 6ebc4a
        msg="$subject${references:+ ($references)}" 
Bernhard M. Wiedemann 6ebc4a
    elif test "$references" != "$old_ref"; then
Bernhard M. Wiedemann 6ebc4a
        if test -n "$references"; then
Bernhard M. Wiedemann 6ebc4a
            msg="Update references ($references)"
Bernhard M. Wiedemann 6ebc4a
        fi
Bernhard M. Wiedemann 6ebc4a
    else
Bernhard M. Wiedemann 6ebc4a
        msg="Refresh"
Bernhard M. Wiedemann 6ebc4a
    fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    log_entry "$patch: $msg${msg:+.}"
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
find_patches() {
Bernhard M. Wiedemann 6ebc4a
       osc diff series.conf \
Bernhard M. Wiedemann 6ebc4a
       | sed -n "s/^+\s*\(patches.*\)/\1/p"
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
for file in  "$@" $(find_patches); do
Bernhard M. Wiedemann 6ebc4a
    dirname=$(dirname $file)
Bernhard M. Wiedemann 6ebc4a
    basename=$(basename $file)
Bernhard M. Wiedemann 6ebc4a
    archive=$dirname.tar.bz2
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    if [ ! -f $basename ]; then
Bernhard M. Wiedemann 6ebc4a
        echo "ERROR: $basename added to series.conf but doesn't exist in $PWD"
Bernhard M. Wiedemann 6ebc4a
        exit 1
Bernhard M. Wiedemann 6ebc4a
    fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    if [ ! -d $dirname ]; then
Bernhard M. Wiedemann 6ebc4a
        tar xvf $archive
Bernhard M. Wiedemann 6ebc4a
    fi
Bernhard M. Wiedemann 6ebc4a
    
Bernhard M. Wiedemann 6ebc4a
    mv $basename $dirname
Bernhard M. Wiedemann 6ebc4a
    rm $archive
Bernhard M. Wiedemann 6ebc4a
    tar cfj $archive $dirname
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    files[${#files[@]}]=$file
Bernhard M. Wiedemann 6ebc4a
done 
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if [ ${#files[@]} -eq 0 ]; then
Bernhard M. Wiedemann 6ebc4a
    echo "No modified files" >&2
Bernhard M. Wiedemann 6ebc4a
    exit 1
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
for file in "${files[@]}"; do
Bernhard M. Wiedemann 6ebc4a
    if [ "${file:0:1}" = - ]; then
Bernhard M. Wiedemann 6ebc4a
	log_entry "${file:1}: Delete."
Bernhard M. Wiedemann 6ebc4a
    else
Bernhard M. Wiedemann 6ebc4a
	case "$file" in
Bernhard M. Wiedemann 6ebc4a
	    config/*)
Bernhard M. Wiedemann 6ebc4a
		if [ -z "$configs_updated" ]; then
Bernhard M. Wiedemann 6ebc4a
		    log_entry "Update config files."
Bernhard M. Wiedemann 6ebc4a
		    configs_updated=1
Bernhard M. Wiedemann 6ebc4a
		fi
Bernhard M. Wiedemann 6ebc4a
		;;
Bernhard M. Wiedemann 6ebc4a
		
Bernhard M. Wiedemann 6ebc4a
	    patches.*)
Bernhard M. Wiedemann 6ebc4a
		patch_log_entry "$file"
Bernhard M. Wiedemann 6ebc4a
		;;
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
	    kabi/*/symvers-* | kabi/*/symtypes-* | kabi/*/symsets-* )
Bernhard M. Wiedemann 6ebc4a
		if [ -z "$symvers_updated" ]; then
Bernhard M. Wiedemann 6ebc4a
		    log_entry "Update reference module symbol versions."
Bernhard M. Wiedemann 6ebc4a
		    symvers_updated=1
Bernhard M. Wiedemann 6ebc4a
		fi
Bernhard M. Wiedemann 6ebc4a
	    	;;
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
	    series.conf)
Bernhard M. Wiedemann 6ebc4a
		# don't log changes in there
Bernhard M. Wiedemann 6ebc4a
		;;
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
	    *)
Bernhard M. Wiedemann 6ebc4a
		log_entry "$file: "
Bernhard M. Wiedemann 6ebc4a
		;;
Bernhard M. Wiedemann 6ebc4a
	esac
Bernhard M. Wiedemann 6ebc4a
    fi
Bernhard M. Wiedemann 6ebc4a
done
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if [ ! -s $message ]; then
Bernhard M. Wiedemann 6ebc4a
    echo "- " >> $message
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if osc vc $CHANGES $message; then
Bernhard M. Wiedemann 6ebc4a
    entry=$(sed -ne '1,2d' -e '/^--*$/!p' -e '/^--*$/q' $CHANGES)
Bernhard M. Wiedemann 6ebc4a
    entry=${entry##$'\n'}
Bernhard M. Wiedemann 6ebc4a
    entry=${entry%%$'\n'}
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
for c in *.changes; do
Bernhard M. Wiedemann 6ebc4a
    [ $c = $CHANGES ] && continue
Bernhard M. Wiedemann 6ebc4a
    cp $CHANGES $c
Bernhard M. Wiedemann 6ebc4a
done