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