#! /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