Blob Blame History Raw
#! /bin/bash
# vim: et:sts=4:sw=4

#############################################################################
# Copyright (c) 2004-2006,2008,2009 Novell, Inc.
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, contact Novell, Inc.
#
# To contact Novell about this file by physical or electronic mail,
# you may find current contact information at www.novell.com
#############################################################################

if test -x "${0}2" -a ! -e kernel-source.changes; then
	# hand over to scripts/log2
	exec "${0}2" "$@"
fi

# Construct a changes entry and commit log from a patch.

. ${0%/*}/wd-functions.sh

if ! $using_git; then
    echo "ERROR: not in a git working directory."
    exit 1
fi

scripts/check-cvs-add || exit 1

CHANGES=kernel-source.changes

trap 'rm -rf "$tmpdir"' EXIT
tmpdir=$(mktemp -d /tmp/${0##*/}.XXXXXX)
message=$tmpdir/message

log_entry() {
    local entry=$1

    echo "$entry" \
    | fmt --width 65 \
    | sed -e '1s/^/- /' -e '2,$s/^/  /' \
    >> $message
}

patch_meta() {
    local patch=$1

    subject=$(formail -c -x Subject < "$patch" \
             | sed -e 's, *\[[#/ A-Za-z0-9-]*\],,')
    subject=${subject##:}
    subject=${subject## }
    subject=${subject%.}

    # allow one blank line before the References: header
    set -- $(awk '
	/^References:/ { sub(/^References:/, ""); print; exit }
	/^$/ { if (++blank > 1) exit }' "$patch")
    references="$*"
    case "$references" in
    None | none)
        references=
    esac
}

patch_log_entry() {
    local patch=$1 subject references old_subj old_ref old_patch="$tmpdir/old"

    git show "HEAD:$patch" >"$old_patch" 2>/dev/null
    patch_meta "$old_patch"
    old_subj="$subject"
    old_ref="$references"

    patch_meta "$patch"

    local msg
    if test -z "$subject" -o "$subject" != "$old_subj"; then
        msg="$subject${references:+ ($references)}"
    elif test "$references" != "$old_ref"; then
        if test -n "$references"; then
            msg="Update references ($references)"
        fi
    else
        msg="Refresh"
    fi

    log_entry "$patch: $msg${msg:+.}"
}

for file in "$@" $(scripts/cvs-touched-files); do
    [ "${file:(-8)}" = ".changes" ] && continue
    files[${#files[@]}]=$file
done

if [ ${#files[@]} -eq 0 ]; then
    echo "No modified files" >&2
    exit 1
fi

for file in "${files[@]}"; do
    if [ "${file:0:1}" = - ]; then
	log_entry "${file:1}: Delete."
    else
	case "$file" in
	    config/*)
		if [ -z "$configs_updated" ]; then
		    log_entry "Update config files."
		    configs_updated=1
		fi
		;;
		
	    patches.*)
		patch_log_entry "$file"
		;;

	    kabi/*/symvers-* | kabi/*/symtypes-* | kabi/*/symsets-* )
		if [ -z "$symvers_updated" ]; then
		    log_entry "Update reference module symbol versions."
		    symvers_updated=1
		fi
	    	;;

	    series.conf)
		# don't log changes in there
		;;

	    *)
		log_entry "$file: "
		;;
	esac
    fi
done

if [ ! -s $message ]; then
    echo "- " >> $message
fi

if [ -z "$VC" ]; then
    VC=vc
    for search in $HOME/bin /work/src/bin scripts; do
	if [ -x $search/$VC ]; then
	    VC=$search/$VC
	    break
	fi
    done
fi

if $VC $CHANGES $message; then
    entry=$(sed -ne '1,2d' -e '/^--*$/!p' -e '/^--*$/q' $CHANGES)
    entry=${entry##$'\n'}
    entry=${entry%%$'\n'}
    echo "$entry" > $message

    while :; do
	echo
	sed -e 's:^:| :' $message
	echo
	echo -n "Commit with the above changelog entry: ([y]es), [n]o, [e]dit? "
	read yesno && \
	case "$yesno" in
	    "" | [yY] | yes)
                git add $CHANGES
                # XXX don't commit -a?
                git commit -a -F $message || exit
                branch=$(get_branch_name)
                case "$branch" in
                master | stable | vanilla | linux-next | openSUSE-??.? | \
                SLE?? | SLE*-ARM | SLE??-SP? | SLE*-RT | SLE*-TD | SLE*-LTSS | \
                cve/linux-* | packaging | scripts)
                    remote=$(get_git_remote "$branch")
                    user=$(get_git_user "$remote")
                    echo "after testing your changes, run"
                    echo "    git push $remote HEAD:users/$user/$branch/for-next"
                esac
		break ;;
	    [nN] | no)
		break ;;
	    [eE] | edit)
		${EDITOR:-vi} $message
		;;
	esac
    done
fi