|
Jeff Mahoney |
170983 |
#! /bin/bash
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
#############################################################################
|
|
Michal Marek |
7f1bb6 |
# Copyright (c) 2004-2006,2008-2010 Novell, Inc.
|
|
Michal Marek |
7f1bb6 |
# All Rights Reserved.
|
|
Michal Marek |
7f1bb6 |
#
|
|
Michal Marek |
7f1bb6 |
# This program is free software; you can redistribute it and/or
|
|
Michal Marek |
7f1bb6 |
# modify it under the terms of version 2 of the GNU General Public License as
|
|
Michal Marek |
7f1bb6 |
# published by the Free Software Foundation.
|
|
Michal Marek |
7f1bb6 |
#
|
|
Michal Marek |
7f1bb6 |
# This program is distributed in the hope that it will be useful,
|
|
Michal Marek |
7f1bb6 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Michal Marek |
7f1bb6 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Michal Marek |
7f1bb6 |
# GNU General Public License for more details.
|
|
Michal Marek |
7f1bb6 |
#
|
|
Michal Marek |
7f1bb6 |
# You should have received a copy of the GNU General Public License
|
|
Michal Marek |
7f1bb6 |
# along with this program; if not, contact Novell, Inc.
|
|
Michal Marek |
7f1bb6 |
#
|
|
Michal Marek |
7f1bb6 |
# To contact Novell about this file by physical or electronic mail,
|
|
Michal Marek |
7f1bb6 |
# you may find current contact information at www.novell.com
|
|
Michal Marek |
7f1bb6 |
#############################################################################
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
# git commit wrapper, generates unified commit messages from patch headers
|
|
Michal Marek |
7f1bb6 |
|
|
Benjamin Poirier |
82873f |
_libdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
log_entry() {
|
|
Michal Marek |
7f1bb6 |
local entry=$1
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7835b2 |
echo "$entry" | fmt --width 65 | sed -e '1s/^/- /' -e '2,$s/^/ /'
|
|
Michal Marek |
7f1bb6 |
}
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
patch_meta() {
|
|
Michal Marek |
7f1bb6 |
local patch=$1
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
subject=$(formail -c -x Subject < "$patch" \
|
|
Michal Marek |
7f1bb6 |
| sed -e 's, *\[[#/ A-Za-z0-9-]*\],,')
|
|
Jeff Mahoney |
7f09b5 |
subject=${subject##:}
|
|
Michal Marek |
7f1bb6 |
subject=${subject## }
|
|
Michal Marek |
7f1bb6 |
subject=${subject%.}
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
9289fd |
# allow one blank line before the References: header
|
|
Michal Marek |
9289fd |
set -- $(awk '
|
|
Michal Marek |
5f2c56 |
/^References:/ { sub(/^References:/, ""); print; exit }
|
|
Michal Marek |
9289fd |
/^$/ { if (++blank > 1) exit }' "$patch")
|
|
Michal Marek |
7f1bb6 |
references="$*"
|
|
Michal Marek |
890bb7 |
case "$references" in
|
|
Michal Marek |
890bb7 |
None | none)
|
|
Michal Marek |
890bb7 |
references=
|
|
Michal Marek |
890bb7 |
esac
|
|
Michal Marek |
7f1bb6 |
}
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
patch_log_entry() {
|
|
Michal Marek |
7f1bb6 |
local patch=$1 subject references old_subj old_ref old_patch="$tmpdir/old"
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
git show "HEAD:$patch" >"$old_patch" 2>/dev/null
|
|
Michal Marek |
7f1bb6 |
patch_meta "$old_patch"
|
|
Michal Marek |
7f1bb6 |
old_subj="$subject"
|
|
Michal Marek |
7f1bb6 |
old_ref="$references"
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
7f1bb6 |
patch_meta "$patch"
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
834b1e |
if test -z "$subject"; then
|
|
Michal Marek |
834b1e |
# should not happen
|
|
Michal Marek |
834b1e |
log_entry "$patch: ${references:+($references).}"
|
|
Michal Marek |
834b1e |
elif test "$subject" != "$old_subj"; then
|
|
Michal Marek |
834b1e |
log_entry "$subject${references:+ ($references)}."
|
|
Michal Marek |
7f1bb6 |
elif test "$references" != "$old_ref"; then
|
|
Michal Marek |
834b1e |
# a new bugzilla reference suggest a non-trivial change
|
|
Michal Marek |
834b1e |
log_entry "Update $patch${references:+ ($references)}."
|
|
Michal Marek |
7f1bb6 |
else
|
|
Michal Marek |
834b1e |
log_entry "Refresh $patch."
|
|
Michal Marek |
7f1bb6 |
fi
|
|
Michal Marek |
7f1bb6 |
}
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
afdba6 |
# Print log entries for given added/modified files
|
|
Michal Marek |
afdba6 |
log_entries()
|
|
Michal Marek |
914943 |
{
|
|
Michal Marek |
afdba6 |
local file configs_updated=false symvers_updated=false
|
|
Michal Marek |
d2fbda |
|
|
Michal Marek |
afdba6 |
for file in "$@"; do
|
|
Michal Marek |
914943 |
case "$file" in
|
|
Michal Marek |
914943 |
config/*)
|
|
Michal Marek |
afdba6 |
if ! $configs_updated; then
|
|
Michal Marek |
afdba6 |
log_entry "Update config files."
|
|
Michal Marek |
afdba6 |
configs_updated=true
|
|
Michal Marek |
914943 |
fi
|
|
Michal Marek |
914943 |
;;
|
|
Michal Marek |
914943 |
patches.*)
|
|
Michal Marek |
afdba6 |
patch_log_entry "$file"
|
|
Michal Marek |
914943 |
;;
|
|
Michal Marek |
914943 |
kabi/*/symvers-* | kabi/*/symtypes-* | kabi/*/symsets-* )
|
|
Michal Marek |
afdba6 |
if ! $symvers_updated; then
|
|
Michal Marek |
afdba6 |
log_entry "Update kabi files."
|
|
Michal Marek |
afdba6 |
symvers_updated=true
|
|
Michal Marek |
914943 |
fi
|
|
Michal Marek |
914943 |
;;
|
|
Michal Marek |
914943 |
series.conf)
|
|
Michal Marek |
914943 |
# don't log changes in there
|
|
Michal Marek |
914943 |
;;
|
|
Michal Marek |
914943 |
*)
|
|
Michal Marek |
afdba6 |
log_entry "$file: "
|
|
Michal Marek |
914943 |
;;
|
|
Michal Marek |
914943 |
esac
|
|
Michal Marek |
914943 |
done
|
|
Michal Marek |
afdba6 |
}
|
|
Michal Marek |
afdba6 |
|
|
Michal Marek |
afdba6 |
do_commit()
|
|
Michal Marek |
afdba6 |
{
|
|
Michal Marek |
afdba6 |
local message edit=--edit
|
|
Michal Marek |
afdba6 |
|
|
Michal Marek |
afdba6 |
if test -z "${added[*]}${modified[*]}${deleted[*]}"; then
|
|
Michal Marek |
afdba6 |
echo "No modified files" >&2
|
|
Michal Marek |
afdba6 |
exit 1
|
|
Michal Marek |
afdba6 |
fi
|
|
Michal Marek |
afdba6 |
if test "$1" = "--no-edit"; then
|
|
Michal Marek |
afdba6 |
edit=
|
|
Michal Marek |
afdba6 |
fi
|
|
Michal Marek |
afdba6 |
message=$tmpdir/message
|
|
Michal Marek |
afdba6 |
echo >"$message"
|
|
Michal Marek |
afdba6 |
log_entries "${added[@]}" "${modified[@]}" >>"$message"
|
|
Michal Marek |
914943 |
for file in "${deleted[@]}"; do
|
|
Michal Marek |
7835b2 |
log_entry "Delete $file." >>"$message"
|
|
Michal Marek |
914943 |
done
|
|
Michal Marek |
914943 |
|
|
Michal Marek |
0f60bf |
# If there is only one entry, remove the "-" bullet to make the git log
|
|
Michal Marek |
0f60bf |
# prettier. If there are multiple entries, we give up, because
|
|
Michal Marek |
0f60bf |
# scripts/gitlog2changes wouldn't know where to insert the bullets again
|
|
Michal Marek |
0f60bf |
if test $(grep -c '^- ' "$message") = 1; then
|
|
Michal Marek |
0f60bf |
sed -i 's/^[- ] //' "$message"
|
|
Michal Marek |
914943 |
fi
|
|
Michal Marek |
7f1bb6 |
|
|
Michal Marek |
d2fbda |
if test -n "$edit" -a -e "$tmpdir/notice"; then
|
|
Michal Marek |
89c232 |
cat "$_" >>"$message"
|
|
Michal Marek |
89c232 |
fi
|
|
Michal Marek |
d2fbda |
git commit "$@" -F $message $edit
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
|
|
Michal Marek |
89c232 |
# Check if series.conf contains only patch additions and print the
|
|
Michal Marek |
89c232 |
# added patches in order of appearance.
|
|
Michal Marek |
89c232 |
check_series_diff()
|
|
Michal Marek |
89c232 |
{
|
|
Michal Marek |
89c232 |
awk '
|
|
Michal Marek |
89c232 |
/^\+\+\+ / {
|
|
Michal Marek |
89c232 |
body = 1
|
|
Michal Marek |
89c232 |
next
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
!body || # ignore the patch header
|
|
Michal Marek |
89c232 |
/^[@ ]/ || # ignore line numbers and context
|
|
Michal Marek |
89c232 |
/^[-+][[:blank:]]*(#.*)?$/ { # ignore whitespace and comments
|
|
Michal Marek |
89c232 |
next
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
# added unguarded patches are OK
|
|
Michal Marek |
89c232 |
/^\+[[:blank:]]*patches\.[^[:blank:]]*\// {
|
|
Michal Marek |
89c232 |
print $2
|
|
Michal Marek |
89c232 |
next
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
# anything else is a problem
|
|
Michal Marek |
89c232 |
#{ print >"/dev/stderr" }
|
|
Michal Marek |
89c232 |
{ exit 1 }
|
|
Michal Marek |
89c232 |
'
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
|
|
Michal Marek |
cac3af |
# Check whether we are only adding new patches and possibly updating
|
|
Michal Marek |
cac3af |
# configs. At least one patch must be added.
|
|
Michal Marek |
89c232 |
only_patches()
|
|
Michal Marek |
89c232 |
{
|
|
Michal Marek |
cac3af |
local file have_patches=false
|
|
Michal Marek |
89c232 |
|
|
Michal Marek |
cac3af |
for file in "${modified[@]}"; do
|
|
Michal Marek |
cac3af |
case "$file" in
|
|
Michal Marek |
c465cf |
series.conf | config/* | supported.conf | blacklist.conf | kabi/severities)
|
|
Michal Marek |
cac3af |
;;
|
|
Michal Marek |
cac3af |
*)
|
|
Michal Marek |
cac3af |
return 1
|
|
Michal Marek |
cac3af |
esac
|
|
Michal Marek |
cac3af |
done
|
|
Michal Marek |
89c232 |
if test -n "${deleted[*]}"; then
|
|
Michal Marek |
89c232 |
return 1
|
|
Michal Marek |
89c232 |
fi
|
|
Michal Marek |
89c232 |
for file in "${added[@]}"; do
|
|
Michal Marek |
89c232 |
case "$file" in
|
|
Michal Marek |
89c232 |
patches.*/*)
|
|
Michal Marek |
cac3af |
have_patches=true
|
|
Michal Marek |
89c232 |
;;
|
|
Michal Marek |
89c232 |
*)
|
|
Michal Marek |
89c232 |
return 1
|
|
Michal Marek |
89c232 |
esac
|
|
Michal Marek |
89c232 |
done
|
|
Michal Marek |
cac3af |
if ! $have_patches; then
|
|
Michal Marek |
cac3af |
return 1
|
|
Michal Marek |
cac3af |
fi
|
|
Michal Marek |
89c232 |
git diff HEAD -- series.conf | check_series_diff >/dev/null || return
|
|
Michal Marek |
89c232 |
return 0
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
trim() {
|
|
Benjamin Poirier |
4a3b64 |
local var="$*"
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
# remove leading whitespace characters
|
|
Benjamin Poirier |
4a3b64 |
var="${var#"${var%%[![:space:]]*}"}"
|
|
Benjamin Poirier |
4a3b64 |
# remove trailing whitespace characters
|
|
Benjamin Poirier |
4a3b64 |
var="${var%"${var##*[![:space:]]}"}"
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
echo -n "$var"
|
|
Benjamin Poirier |
4a3b64 |
}
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
# Insert part of the content added to a new series file back into the old
|
|
Benjamin Poirier |
4a3b64 |
# series file
|
|
Benjamin Poirier |
4a3b64 |
# splice_series <patch name> 3
|
|
Benjamin Poirier |
4a3b64 |
splice_series()
|
|
Michal Marek |
89c232 |
{
|
|
Benjamin Poirier |
4a3b64 |
local patch=$1
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
local old new old_eof new_eof
|
|
Benjamin Poirier |
4a3b64 |
local state="matching"
|
|
Benjamin Poirier |
4a3b64 |
|
|
Benjamin Poirier |
4a3b64 |
IFS=
|
|
Benjamin Poirier |
4a3b64 |
while true; do
|
|
Benjamin Poirier |
4a3b64 |
if [ $state = "matching" ]; then
|
|
Benjamin Poirier |
4a3b64 |
read -r -u 3 old || old_eof=1
|
|
Benjamin Poirier |
4a3b64 |
read -r -u 4 new || new_eof=1
|
|
Benjamin Poirier |
4a3b64 |
if [ -z "$old_eof" -a "$new_eof" ]; then
|
|
Benjamin Poirier |
4a3b64 |
echo "Error: new series does not contain all" \
|
|
Benjamin Poirier |
4a3b64 |
"lines from old series." > /dev/stderr
|
|
Benjamin Poirier |
4a3b64 |
return 1
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
echo "$new"
|
|
Benjamin Poirier |
4a3b64 |
if [ "$old_eof" -a "$new_eof" ]; then
|
|
Benjamin Poirier |
4a3b64 |
break
|
|
Benjamin Poirier |
4a3b64 |
elif [ "$old_eof" -o "$new" != "$old" ]; then
|
|
Benjamin Poirier |
4a3b64 |
if [ "$(trim "$new")" = "$patch" ]; then
|
|
Benjamin Poirier |
4a3b64 |
state="just after patch"
|
|
Benjamin Poirier |
4a3b64 |
else
|
|
Benjamin Poirier |
4a3b64 |
state="diff"
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
elif [ $state = "diff" ]; then
|
|
Benjamin Poirier |
4a3b64 |
read -r -u 4 new || new_eof=1
|
|
Benjamin Poirier |
4a3b64 |
if [ "$new_eof" ]; then
|
|
Benjamin Poirier |
4a3b64 |
echo "Error: new series does not contain all" \
|
|
Benjamin Poirier |
4a3b64 |
"lines from old series." > /dev/stderr
|
|
Benjamin Poirier |
4a3b64 |
return 1
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
echo "$new"
|
|
Benjamin Poirier |
4a3b64 |
if [ ! "$old_eof" -a "$new" = "$old" ]; then
|
|
Benjamin Poirier |
4a3b64 |
state="matching"
|
|
Benjamin Poirier |
4a3b64 |
elif [ "$(trim "$new")" = "$patch" ]; then
|
|
Benjamin Poirier |
4a3b64 |
state="just after patch"
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
elif [ $state = "just after patch" ]; then
|
|
Benjamin Poirier |
4a3b64 |
read -r -u 4 new || new_eof=1
|
|
Benjamin Poirier |
4a3b64 |
if [ "$new_eof" ]; then
|
|
Benjamin Poirier |
4a3b64 |
break
|
|
Benjamin Poirier |
dae2e8 |
elif [ ! "$old_eof" -a "$new" = "$old" ]; then
|
|
Benjamin Poirier |
4a3b64 |
echo "$old"
|
|
Benjamin Poirier |
4a3b64 |
state="after patch"
|
|
Benjamin Poirier |
4a3b64 |
elif [ -z "$(trim "$new")" ]; then
|
|
Benjamin Poirier |
4a3b64 |
echo "$new"
|
|
Benjamin Poirier |
dae2e8 |
state="whitespace seen"
|
|
Benjamin Poirier |
dae2e8 |
fi
|
|
Benjamin Poirier |
dae2e8 |
elif [ $state = "whitespace seen" ]; then
|
|
Benjamin Poirier |
dae2e8 |
read -r -u 4 new || new_eof=1
|
|
Benjamin Poirier |
dae2e8 |
if [ "$new_eof" ]; then
|
|
Benjamin Poirier |
dae2e8 |
break
|
|
Benjamin Poirier |
dae2e8 |
elif [ ! "$old_eof" -a "$new" = "$old" ]; then
|
|
Benjamin Poirier |
dae2e8 |
echo "$old"
|
|
Benjamin Poirier |
dae2e8 |
state="after patch"
|
|
Benjamin Poirier |
dae2e8 |
elif [ -z "$(trim "$new")" ]; then
|
|
Benjamin Poirier |
dae2e8 |
echo "$new"
|
|
Benjamin Poirier |
dae2e8 |
else
|
|
Benjamin Poirier |
dae2e8 |
state="after whitespace"
|
|
Benjamin Poirier |
dae2e8 |
fi
|
|
Benjamin Poirier |
dae2e8 |
elif [ $state = "after whitespace" ]; then
|
|
Benjamin Poirier |
dae2e8 |
read -r -u 4 new || new_eof=1
|
|
Benjamin Poirier |
dae2e8 |
if [ "$new_eof" ]; then
|
|
Benjamin Poirier |
dae2e8 |
break
|
|
Benjamin Poirier |
dae2e8 |
elif [ ! "$old_eof" -a "$new" = "$old" ]; then
|
|
Benjamin Poirier |
dae2e8 |
echo "$old"
|
|
Benjamin Poirier |
dae2e8 |
state="after patch"
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
elif [ $state = "after patch" ]; then
|
|
Benjamin Poirier |
dae2e8 |
#echo "@@ state $state old <$old> eof <$old_eof> new <$new> eof <$new_eof>" > /dev/stderr
|
|
Benjamin Poirier |
f6fb30 |
cat <&3
|
|
Benjamin Poirier |
f6fb30 |
break
|
|
Benjamin Poirier |
4a3b64 |
fi
|
|
Benjamin Poirier |
4a3b64 |
done
|
|
Michal Marek |
89c232 |
|
|
Benjamin Poirier |
4a3b64 |
if [ $state = "matching" ]; then
|
|
Benjamin Poirier |
4a3b64 |
echo "Error: patch \"$patch\" not found in series." > /dev/stderr
|
|
Benjamin Poirier |
4a3b64 |
return 1
|
|
Michal Marek |
89c232 |
fi
|
|
Michal Marek |
89c232 |
}
|
|
Michal Marek |
89c232 |
|
|
Michal Marek |
89c232 |
# Commit patches one by one for better bisectability
|
|
Michal Marek |
89c232 |
commit_single_patches()
|
|
Michal Marek |
89c232 |
{
|
|
Michal Marek |
89c232 |
local saved_index=$(git write-tree) patch series
|
|
Michal Suchanek |
990531 |
local file added=() modified_aux=() deleted=()
|
|
Benjamin Poirier |
5845ab |
git cat-file blob HEAD:series.conf > "$tmpdir"/old_series
|
|
Benjamin Poirier |
5845ab |
cp series.conf "$tmpdir"/new_series
|
|
Michal Marek |
89c232 |
|
|
Michal Marek |
cac3af |
for file in "${modified[@]}"; do
|
|
Michal Marek |
cac3af |
case "$file" in
|
|
Michal Marek |
c465cf |
config/* | supported.conf | blacklist.conf | kabi/severities)
|
|
Michal Marek |
afdba6 |
modified_aux=("${modified_aux[@]}" "$file")
|
|
Michal Marek |
cac3af |
esac
|
|
Michal Marek |
cac3af |
done
|
|
Michal Marek |
cac3af |
local modified=()
|
|
Michal Marek |
89c232 |
# reset the index
|
|
Michal Marek |
89c232 |
git read-tree HEAD
|
|
Michal Marek |
89c232 |
set -- $(git diff HEAD -- series.conf | check_series_diff)
|
|
Michal Marek |
cadbf0 |
if test $# -gt 1; then
|
|
Michal Marek |
cadbf0 |
# Fix the author date so that scripts/gitlog2changes can group
|
|
Michal Marek |
cadbf0 |
# the commits into a single rpm changelog entry
|
|
Michal Marek |
cadbf0 |
export GIT_AUTHOR_DATE=$(date -R)
|
|
Michal Marek |
afdba6 |
log_entries "$@" "${modified_aux[@]}"
|
|
Michal Marek |
d2fbda |
read -p 'Commit with these changelog messages? [Yn] '
|
|
Michal Marek |
d2fbda |
case "$REPLY" in
|
|
Michal Marek |
d2fbda |
"" | [Yy] | [Yy][Ee][Ss])
|
|
Michal Marek |
d2fbda |
no_edit=--no-edit
|
|
Michal Marek |
d2fbda |
esac
|
|
Michal Marek |
cadbf0 |
fi
|
|
Michal Marek |
cac3af |
# Commit patches except the last one
|
|
Michal Marek |
cac3af |
while test $# -gt 1; do
|
|
Michal Marek |
89c232 |
patch=$1
|
|
Michal Marek |
89c232 |
shift
|
|
Michal Marek |
89c232 |
# add a series.conf with a single new patch to the index
|
|
Benjamin Poirier |
5845ab |
series=$(splice_series "$patch" \
|
|
Benjamin Poirier |
5845ab |
3<"$tmpdir"/old_series 4<"$tmpdir"/new_series | \
|
|
Benjamin Poirier |
4a3b64 |
git hash-object -w --stdin)
|
|
Michal Marek |
89c232 |
git read-tree $(git ls-tree HEAD | \
|
|
Michal Marek |
89c232 |
sed -r "s/(.*)\\<[0-9a-f]{40}\\>(.*\\
|
|
Michal Marek |
89c232 |
| git mktree)
|
|
Michal Marek |
89c232 |
git add "$patch"
|
|
Michal Marek |
89c232 |
added=("$patch")
|
|
Michal Marek |
cac3af |
cat >"$tmpdir/notice" <
|
|
Michal Marek |
d2fbda |
|
|
Michal Marek |
89c232 |
# Patches are being committed one by one for better bisectability.
|
|
Michal Marek |
89c232 |
# There are $# more patches to commit.
|
|
Michal Marek |
89c232 |
EOF
|
|
Benjamin Poirier |
0f98cc |
if ! do_commit $no_edit --no-verify; then
|
|
Michal Marek |
89c232 |
# restore the index so that the user does not need to git add
|
|
Michal Marek |
89c232 |
# the patches again
|
|
Michal Marek |
89c232 |
git read-tree "$saved_index"
|
|
Michal Marek |
89c232 |
return 1
|
|
Michal Marek |
89c232 |
fi
|
|
Michal Marek |
89c232 |
done
|
|
Michal Marek |
cac3af |
rm -f "$tmpdir/notice"
|
|
Michal Marek |
cac3af |
# commit the last patch and possible config update together
|
|
Michal Marek |
cac3af |
patch=$1
|
|
Michal Marek |
cac3af |
git add "$patch"
|
|
Michal Marek |
cac3af |
added=("$patch")
|
|
Michal Marek |
afdba6 |
modified=("${modified_aux[@]}")
|
|
Michal Marek |
17c40e |
if test -n "${modified[*]}"; then
|
|
Michal Marek |
17c40e |
no_edit=
|
|
Michal Marek |
17c40e |
fi
|
|
Benjamin Poirier |
0f98cc |
if ! do_commit $no_edit --no-verify -a; then
|
|
Michal Marek |
cac3af |
git read-tree "$saved_index"
|
|
Michal Marek |
cac3af |
return 1
|
|
Michal Marek |
cac3af |
fi
|
|
Michal Marek |
914943 |
}
|
|
Michal Marek |
914943 |
|
|
Benjamin Poirier |
82873f |
# do not run "main" code if script is being sourced rather than executed
|
|
Benjamin Poirier |
82873f |
[[ $0 != "$BASH_SOURCE" ]] && return
|
|
Benjamin Poirier |
82873f |
|
|
Benjamin Poirier |
82873f |
. "$_libdir"/wd-functions.sh
|
|
Benjamin Poirier |
82873f |
|
|
Benjamin Poirier |
82873f |
if ! $using_git; then
|
|
Benjamin Poirier |
82873f |
echo "ERROR: not in a git working directory."
|
|
Benjamin Poirier |
82873f |
exit 1
|
|
Benjamin Poirier |
82873f |
fi
|
|
Benjamin Poirier |
82873f |
|
|
Benjamin Poirier |
82873f |
"$_libdir"/check-cvs-add || exit 1
|
|
Benjamin Poirier |
82873f |
|
|
Michal Suchanek |
990531 |
while [ -n "$1" ] ; do
|
|
Michal Suchanek |
990531 |
case "$1" in
|
|
Michal Suchanek |
990531 |
--no-edit) no_edit=--no-edit
|
|
Michal Suchanek |
990531 |
;;
|
|
Takashi Iwai |
38eaa4 |
--amend) amend=yes
|
|
Takashi Iwai |
38eaa4 |
;;
|
|
Michal Suchanek |
990531 |
*) echo Unknown argument "$1" >&2
|
|
Michal Suchanek |
990531 |
;;
|
|
Michal Suchanek |
990531 |
esac
|
|
Michal Suchanek |
990531 |
shift
|
|
Michal Suchanek |
990531 |
done
|
|
Michal Suchanek |
990531 |
|
|
Takashi Iwai |
38eaa4 |
if [ -n "$amend" ]; then
|
|
Takashi Iwai |
38eaa4 |
if [ $(git rev-list HEAD^.. | wc -l) -gt 1 ]; then
|
|
Takashi Iwai |
38eaa4 |
echo "ERROR: cannot use --amend option on the merge commit HEAD."
|
|
Takashi Iwai |
38eaa4 |
exit 1
|
|
Takashi Iwai |
38eaa4 |
fi
|
|
Takashi Iwai |
38eaa4 |
git reset --soft HEAD^
|
|
Takashi Iwai |
38eaa4 |
fi
|
|
Takashi Iwai |
38eaa4 |
|
|
Benjamin Poirier |
82873f |
trap 'rm -rf "$tmpdir"' EXIT
|
|
Benjamin Poirier |
82873f |
tmpdir=$(mktemp -d /tmp/${0##*/}.XXXXXX)
|
|
Benjamin Poirier |
82873f |
|
|
Michal Marek |
cac26c |
if test -e "$(git rev-parse --git-dir)/MERGE_HEAD"; then
|
|
Michal Marek |
cac26c |
# Do not try to fabricate a commit message for merge commits, git itself
|
|
Michal Marek |
cac26c |
# does it better
|
|
Michal Marek |
cac26c |
git commit -a
|
|
Michal Marek |
cac26c |
exit
|
|
Michal Marek |
cac26c |
fi
|
|
Michal Marek |
cac26c |
|
|
Michal Marek |
914943 |
added=($(git diff --name-only --diff-filter=A HEAD))
|
|
Michal Marek |
914943 |
modified=($(git diff --name-only --diff-filter=MT HEAD))
|
|
Michal Marek |
914943 |
deleted=($(git diff --name-only --diff-filter=D HEAD))
|
|
Michal Marek |
7f1bb6 |
|
|
Jeff Mahoney |
23674d |
scripts/check-patch-dirs "${added[@]}" "${modified[@]}" || exit 1
|
|
Jeff Mahoney |
23674d |
|
|
Michal Marek |
89c232 |
if only_patches; then
|
|
Takashi Iwai |
90691b |
git add -u
|
|
Benjamin Poirier |
0f98cc |
"$_libdir"/git-pre-commit || exit
|
|
Michal Marek |
89c232 |
commit_single_patches || exit
|
|
Michal Marek |
89c232 |
else
|
|
Michal Marek |
89c232 |
# FIXME: -a should not be the default
|
|
Michal Marek |
89c232 |
do_commit -a || exit
|
|
Michal Marek |
89c232 |
fi
|
|
Michal Marek |
e6c3a3 |
|
|
Michal Marek |
e6c3a3 |
branch=$(get_branch_name)
|
|
Michal Marek |
e6c3a3 |
case "$branch" in
|
|
Michal Marek |
b26b17 |
master | stable | vanilla | linux-next | openSUSE-??.? | \
|
|
Matthias Brugger |
fa0677 |
SLE?? | SLE*-ARM| SLE??-SP? | SLE*-RT | SLE*-TD | SLE*-LTSS | \
|
|
Matthias Brugger |
fa0677 |
cve/linux-* | packaging | scripts)
|
|
Benjamin Poirier |
775690 |
remote=$(get_git_remote "$branch")
|
|
Benjamin Poirier |
775690 |
user=$(get_git_user "$remote")
|
|
Michal Marek |
e6c3a3 |
echo "after testing your changes, run"
|
|
Benjamin Poirier |
775690 |
echo " git push $remote HEAD:users/$user/$branch/for-next"
|
|
Michal Marek |
e6c3a3 |
esac
|
|
Michal Marek |
914943 |
|
|
Michal Marek |
914943 |
# vim: et:sts=4:sw=4
|