#!/usr/bin/bash

TMPDIR=${TMPDIR:-/tmp}

function usage() {
	echo $0 '[-r <references>] <destination> [git arguments]'
	echo '<references>      append "References:" line with this argument'
	echo '<destination>     destination directory (can be user@machine:dir)'
	echo "<git arguments>   what's passed to git"
	echo
	echo Examples:
	echo $0 '-r bnc#12345 /tmp -1 0ea859964fcba'
	echo $0 'krtek@machine.org:/tmp v0.1..v0.2'
	exit 1
}

if [ $# -lt 1 ]; then
	usage
fi

AUTO_MAINLINE=
MAINLINE_FORCE=
GITREPO=0
PATCHES="$TMPDIR/patches"

declare -a GITARGS=( '-o' "$PATCHES" '-s' '-k' '--no-renames' )

rm -rf "$PATCHES"

while getopts "g:m:r:s:" OPT; do
	case "$OPT" in
		g) GITREPO=1
		   GITARGS+=( '--add-header' "Git-repo: $OPTARG" )
		;;
		m) MAINLINE_FORCE="$OPTARG"
		;;
		r) GITARGS+=( '--add-header' "References: $OPTARG" )
		;;
		s) GITARGS+=( '--start-number' "$OPTARG" )
		;;
		*) usage
		;;
	esac
done

shift $(($OPTIND-1))
MACHINE="$1"
shift

GITARGS+=( '--add-header' "Patch-mainline: ${MAINLINE_FORCE:-no}" )

git format-patch "${GITARGS[@]}" "$@" || exit 1

function get_next_tag() {
	local LATEST="`git describe --tags --abbrev=0 linus/master`"
	if [[ "$LATEST" =~ -rc ]]; then
		echo "${LATEST%-rc*}"
	else
		let NEXT_MINOR="${LATEST#*.}"+1
		echo "${LATEST%%.*}.${NEXT_MINOR}-rc1"
	fi
}

for patch in "$PATCHES"/*; do
	SHA=`sed -n '1 s/^From \([0-9a-fA-F]*\) .*$/\1/ p' "$patch"`
	sed -i "1 d" "$patch"
	if [ -z "$MAINLINE_FORCE" ]; then
		AUTO_MAINLINE="`git name-rev --refs=refs/tags/v[2-9].* "$SHA"|sed 's@^.*tags/v*\([a-zA-Z0-9\.-]*\).*$@\1@'`"
		if echo "$AUTO_MAINLINE" | grep -q undefined; then
			CONTAINED_IN="`git branch -r --contains "$SHA" linus/master next/master|head -1`"
			if [ "$CONTAINED_IN" = "  linus/master" ]; then
				AUTO_MAINLINE="`get_next_tag`"
			elif [ "$CONTAINED_IN" = "  next/master" ]; then
				AUTO_MAINLINE="Queued in subsystem maintainer repository"
			else
				AUTO_MAINLINE=""
			fi
		fi
	fi
	if [ -n "$AUTO_MAINLINE" ]; then
		sed -i "s/^Patch-mainline: no$/Git-commit: $SHA\nPatch-mainline: $AUTO_MAINLINE/" "$patch"
	elif [[ $GITREPO -eq 1 || "$MAINLINE_FORCE" =~ ^v[0-9] ]]; then
		sed -i "s/^Patch-mainline: .*$/Git-commit: $SHA\n&/" "$patch"
	fi
done

if [ "$MACHINE" != "nop" ]; then
	scp -o StrictHostKeyChecking=no -C "$PATCHES"/* "$MACHINE" || exit 1
	echo Copied to $MACHINE

	rm -rf "$PATCHES"
fi
