Michal Marek f1ef36
#!/bin/bash
Michal Marek 0a417c
#############################################################################
Michal Marek 0a417c
# Copyright (c) 2009 Novell, Inc.
Michal Marek 0a417c
# All Rights Reserved.
Michal Marek 0a417c
#
Michal Marek 0a417c
# This program is free software; you can redistribute it and/or
Michal Marek 0a417c
# modify it under the terms of version 2 of the GNU General Public License as
Michal Marek 0a417c
# published by the Free Software Foundation.
Michal Marek 0a417c
#
Michal Marek 0a417c
# This program is distributed in the hope that it will be useful,
Michal Marek 0a417c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Michal Marek 0a417c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
Michal Marek 0a417c
# GNU General Public License for more details.
Michal Marek 0a417c
#
Michal Marek 0a417c
# You should have received a copy of the GNU General Public License
Michal Marek 0a417c
# along with this program; if not, contact Novell, Inc.
Michal Marek 0a417c
#
Michal Marek 0a417c
# To contact Novell about this file by physical or electronic mail,
Michal Marek 0a417c
# you may find current contact information at www.novell.com
Michal Marek 0a417c
#############################################################################
Michal Marek f1ef36
#
Michal Marek f1ef36
# Apply the patch series to a linux git repository. Note that the generated
Michal Marek f1ef36
# branch will differ each time, it is only meant as an alternative to quilt
Michal Marek f1ef36
# annotate and friends, it should not be pushed anywhere.
Michal Marek f1ef36
Michal Marek f1ef36
usage()
Michal Marek f1ef36
{
Michal Marek c71409
	echo "Usage: $0 -g <mainline kernel git> [-b <branch>] [-v] [-f] [-s|-n] [-a] [-X]"
Michal Marek f1ef36
	echo "branch is $branch by default"
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
die()
Michal Marek f1ef36
{
Michal Marek f1ef36
	echo "$@" >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
# perform a git command in linux-2.6 git tree
Michal Marek f1ef36
l_git()
Michal Marek f1ef36
{
Michal Marek f1ef36
	(cd "$git"; command git "$@")
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek 23e95a
. scripts/wd-functions.sh
Michal Marek f1ef36
branch="suse/$(get_branch_name)"
Michal Marek f1ef36
if test "$branch" = "suse/"; then
Michal Marek f1ef36
	branch="suse/unknown"
Michal Marek f1ef36
fi
Michal Marek f1ef36
git=
Michal Marek f1ef36
verbose=false
Michal Marek f1ef36
force=false
Michal Marek 091dda
skip=true
Michal Marek 091dda
use_applied=false
Michal Marek 462ff7
skip_xen=false
Michal Marek 091dda
last_patch=
Michal Marek 23e95a
. rpm/config.sh
Michal Marek 091dda
# sles10 doesn't use pristine stable patches
Michal Marek 23e95a
case "$IBS_PROJECT" in
Michal Marek 23e95a
SUSE:SLE-10*)
Michal Marek 091dda
	skip=false
Michal Marek 091dda
esac
Hannes Reinecke ace88d
options=$(getopt -n "$0" -o ab:g:vsnS:Xfh --long branch:,git:,verbose,use-applied,force,skip,no-skip,no-xen,symbols:,help -- "$@")
Michal Marek f1ef36
if test $? != 0; then
Michal Marek f1ef36
	usage >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
fi
Michal Marek f1ef36
eval set -- "$options"
Michal Marek f1ef36
while test $# -gt 0; do
Michal Marek f1ef36
	case "$1" in
Michal Marek f1ef36
	-b | --branch)
Michal Marek f1ef36
		branch=$2
Michal Marek f1ef36
		shift 2
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	-g | --git)
Michal Marek f1ef36
		git=$2
Michal Marek f1ef36
		shift 2
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	-v | --verbose)
Michal Marek f1ef36
		verbose=true
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	-f | --force)
Michal Marek f1ef36
		force=true
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		;;
Michal Marek 091dda
	-a | --use-applied)
Michal Marek 091dda
		use_applied=true
Michal Marek 091dda
		shift
Michal Marek 091dda
		;;
Michal Marek 091dda
	-s | --skip)
Michal Marek 091dda
		skip=true
Michal Marek 091dda
		shift
Michal Marek 091dda
		;;
Michal Marek 091dda
	-n | --no-skip)
Michal Marek 091dda
		skip=false
Michal Marek 091dda
		shift
Michal Marek 091dda
		;;
Michal Marek c71409
	-X | --no-xen)
Michal Marek c71409
		skip_xen=true
Michal Marek c71409
		shift
Michal Marek c71409
		;;
Hannes Reinecke ace88d
	-S | --symbols)
Hannes Reinecke ace88d
		EXTRA_SYMBOLS=$2
Hannes Reinecke 40e1d5
		shift 2
Hannes Reinecke ace88d
		;;
Michal Marek f1ef36
	-h | --help)
Michal Marek f1ef36
		usage
Michal Marek f1ef36
		exit 0
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	--)
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		break
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	esac
Michal Marek f1ef36
done
Michal Marek f1ef36
if test $# -gt 0; then
Michal Marek f1ef36
	echo "$0: too many arguments"
Michal Marek f1ef36
	usage >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
fi
Michal Marek f1ef36
if test -z "$git"; then
Michal Marek f1ef36
	usage >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
fi
Hannes Reinecke ace88d
if [ -s extra-symbols ] ; then
Hannes Reinecke ace88d
	EXTRA_SYMBOLS="$EXTRA_SYMBOLS $(cat extra-symbols)"
Hannes Reinecke ace88d
fi
Michal Marek f1ef36
Michal Marek 091dda
if ! $skip; then
Michal Marek 091dda
	base="$SRCVERSION"
Michal Marek f1ef36
else
Michal Marek 23e95a
	if test -x rpm/compute-PATCHVERSION.sh; then
Michal Marek 091dda
		base=$("$_")
Michal Marek 091dda
	else
Michal Marek 23e95a
		base=$(scripts/compute-PATCHVERSION.sh)
Michal Marek 091dda
	fi
Michal Marek 091dda
fi
Michal Marek 091dda
if $use_applied ; then
Michal Marek 091dda
	cur_branch=$(l_git branch | sed -n 's/^\* //p')
Michal Marek 091dda
	if test "$cur_branch" != "$branch"; then
Michal Marek 091dda
		echo "branch is $cur_branch, cannot use current branch"
Michal Marek 091dda
		use_applied=false
Michal Marek 091dda
	fi
Michal Marek f1ef36
fi
Michal Marek 091dda
if $use_applied ; then
Michal Marek 091dda
	last_patch=$(l_git show | sed -n 's/^ *Patch-name: //p')
Michal Marek 091dda
	if $force ; then
Michal Marek 091dda
		l_git reset --hard
Michal Marek 091dda
	fi
Michal Marek 091dda
else
Michal Marek 091dda
	args=(--git "$git")
Michal Marek 091dda
	$verbose && args[${#args[@]}]="--verbose"
Michal Marek 091dda
	$force   && args[${#args[@]}]="--force"
Michal Marek 091dda
	base_id=$("${0%/*}"/mainline-commit "${args[@]}" "$base") || exit
Michal Marek 091dda
	echo "base is $base (${base_id:0:7})"
Michal Marek f1ef36
Michal Marek 091dda
	# workaround "cannot delete branch which you are currently on" errors
Michal Marek 091dda
	l_git checkout -q HEAD^0 || exit
Michal Marek 091dda
	l_git branch -f "$branch" "$base_id" || exit
Michal Marek 091dda
	l_git checkout "$branch" || exit
Michal Marek 091dda
fi
Michal Marek af1abf
tmp=$(mktemp -d /dev/shm/series2git.XXXXXXXX) || exit
Michal Marek af1abf
trap 'rm -rf "$tmp"' EXIT
Michal Marek f1ef36
Michal Marek f1ef36
ex_hdr()
Michal Marek f1ef36
{
Michal Marek f1ef36
	local header=$1
Michal Marek f1ef36
	shift
Michal Marek f1ef36
	sed -n "s/^$header:  *//p; T; q" "$@"
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
apply_patch()
Michal Marek f1ef36
{
Michal Marek f1ef36
	local patch=$1
Michal Marek af1abf
Michal Marek af1abf
	rm -rf "$tmp/backup"
Michal Marek af1abf
	mkdir "$tmp/backup"
Michal Marek af1abf
	patch -d "$git" -s --backup --prefix="$tmp/backup/" -p1 --force -i "$PWD/$patch" || return
Michal Marek af1abf
	l_git add $(find "$tmp/backup" -type f -printf '%P\n')
Michal Marek af1abf
Michal Marek f1ef36
	local from=$(ex_hdr From "$patch")
Michal Marek bb2753
	if test -z "$from"; then
Michal Marek bb2753
		from=$(ex_hdr Author "$patch")
Michal Marek bb2753
	fi
Michal Marek bb2753
	if test -z "$from"; then
Michal Marek bb2753
		from="Unknown Hero <unknown@example.com>"
Michal Marek bb2753
	fi
Michal Marek f1ef36
	case "$from" in
Michal Marek f1ef36
	*"<"*@*">")
Michal Marek f1ef36
		GIT_AUTHOR_NAME=${from% <*}
Michal Marek f1ef36
		GIT_AUTHOR_EMAIL="<${from##*<}"
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	*@*)
Michal Marek f1ef36
		GIT_AUTHOR_NAME=${from%%@*}
Michal Marek f1ef36
		GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME#<}
Michal Marek f1ef36
		GIT_AUTHOR_EMAIL=$from
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	*)
Michal Marek f1ef36
		GIT_AUTHOR_NAME=$from
Michal Marek f1ef36
		GIT_AUTHOR_EMAIL=
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	esac
Takashi Iwai 3d0cc0
	local subject=$(ex_hdr Subject "$patch" | sed -es'/\[[^]]*\] //')
Michal Marek 9fd62c
	GIT_AUTHOR_DATE=$(ex_hdr Date "$patch")
Robert Richter 1a740a
	GIT_AUTHOR_DATE=$(ex_hdr Date "$patch" \
Robert Richter 1a740a
	    | perl -p -e 's/(\d\d:\d\d:\d\d) (\d{4})/$2 $1/;s/:$//')
Michal Marek f3c6f4
	if test -n "$GIT_AUTHOR_DATE"; then
Michal Marek 9fd62c
		GIT_AUTHOR_DATE=$(date -R -d"$GIT_AUTHOR_DATE" 2>/dev/null)
Michal Marek f3c6f4
	fi
Michal Marek f1ef36
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
Michal Marek f1ef36
	(
Michal Marek f1ef36
		echo "$subject"
Michal Marek f1ef36
		echo
Michal Marek f1ef36
		sed -r '/^(Subject|From|Date):/d; /^(---$|--- |diff |Index:)/ Q' "$patch"
Michal Marek f1ef36
		echo
Michal Marek f1ef36
		echo "Patch-name: $patch"
Michal Marek 91c33b
	) | git stripspace | l_git commit -n -q -F -
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek 23e95a
scripts/guards $EXTRA_SYMBOLS < series.conf | while read patch; do
Michal Marek f1ef36
	case "$patch" in
Michal Marek f1ef36
	patches.kernel.org/patch-2.6.*.*-rc*)
Michal Marek f1ef36
		;;
Michal Suchanek 79c578
	patches.kernel.org/*)
Michal Marek 091dda
		if $skip; then
Michal Marek 091dda
			echo "skipping $patch"
Michal Marek 091dda
			continue
Michal Marek 091dda
		fi
Michal Marek f1ef36
		;;
Michal Marek c71409
	patches.xen/*)
Michal Marek c71409
		if $skip_xen; then
Michal Marek c71409
			echo "skipping remaining Xen patches"
Michal Marek c71409
			break
Michal Marek c71409
		fi
Michal Marek c71409
		;;
Michal Marek f1ef36
	esac
Michal Marek 091dda
	if test -n "$last_patch"; then
Michal Marek 091dda
	    if test "$patch" != "$last_patch" ; then
Michal Marek 091dda
		echo "skipping $patch"
Michal Marek 091dda
		continue
Michal Marek 091dda
	    fi
Michal Marek 091dda
	    echo "skipping $patch"
Michal Marek 091dda
	    last_patch=
Michal Marek 091dda
	    continue
Michal Marek 091dda
	fi
Michal Marek f1ef36
	if $verbose; then
Michal Marek f1ef36
		echo "[ $patch ]"
Michal Marek f1ef36
	fi
Michal Marek f1ef36
	apply_patch "$patch" || die "*** $patch failed ***"
Michal Marek f1ef36
	if ! $verbose; then
Michal Marek f1ef36
		echo -n "."
Michal Marek f1ef36
	fi
Michal Marek f1ef36
done
Michal Marek f1ef36
echo
Michal Marek f1ef36
l_git checkout -f