#!/bin/bash

here=$(dirname $(readlink -f "$0"))

tag_prefix=`dpkg-parsechangelog -S Source | sed 's/linux-restricted-modules/Ubuntu/'`-

commit=:
no_update=false
master_version=
master_dir=
namespace=
while :
do
	if [ "$1" = "--commit" ]; then
		shift
		commit=

	elif [ "$1" = "--no-update" ]; then
		shift
		no_update=true

	elif [ "$1" = "--master-version" ]; then
		master_version="$2"
		shift 2

	elif [ "$1" = "--namespace" ]; then
		namespace="$2"
		shift 2

	else
		break
	fi
done

if [ "$master_version" = "" ]; then
	if [ "$#" -ne 1 ]; then
		echo "Usage: $0 <linux-source-directory>" 1>&2
		exit 1
	fi
	master_dir="$1"

	# Work out the master kernel version.
	if [ -f "$master_dir/debian/debian.env" ]; then
		branch=`sed -ne 's/DEBIAN=//p' <"$master_dir/debian/debian.env"`
		changelog="-l$branch/changelog"
	else
		changelog=""
	fi
	master_version=`(cd "$master_dir" && LC_ALL=C dpkg-parsechangelog -SVersion $changelog)`
else
	no_update=true
fi

# Work out our current version taking into account closed sections.
here_series=$( LC_ALL=C dpkg-parsechangelog -S Distribution )
if [ "$here_series" = "UNRELEASED" ]; then
	here_version=$( LC_ALL=C dpkg-parsechangelog -o 1 -S Version )
	here_series=$( LC_ALL=C dpkg-parsechangelog -c 1 -S Distribution )
else
	here_version=$( LC_ALL=C dpkg-parsechangelog -S Version )
fi

# Ensure we have the appropriate tag.
here_tagversion=$( echo "$tag_prefix$here_version" | sed -e 's/~/_/g' )
count=$( git for-each-ref "refs/tags/$here_tagversion" | wc -l )
if [ "$count" != 1 -a "$namespace" != "" ]; then
	here_tagversion=$( echo "$namespace$tag_prefix$here_version" | sed -e 's/~/_/g' )
	count=$( git for-each-ref "refs/tags/$here_tagversion" | wc -l )
fi
if [ "$count" != 1 ]; then
        echo "$0: $here_tagversion: tag not found" 1>&2
        exit 1
fi

update_file()
{
	local src="$1"
	local dst="$2"
	cp -p "$src" "$dst" || exit 1
	if ! git diff --exit-code -- "$dst" >/dev/null; then
		git commit -m "UBUNTU: $dst -- update from master" -s -- "$dst"
	else
		echo "$dst: no changes from master"
	fi
}

# Update things from the primary package.
if [ "$no_update" = 'false' ]; then
	update_file "$master_dir/$branch/tracking-bug" "debian/tracking-bug"
	"$here/update-dkms-versions" || exit 1
	for master_file in \
		debian/scripts/misc/git-ubuntu-log \
		debian/scripts/dkms-build \
		debian/scripts/dkms-build--nvidia-N \
		debian/scripts/fix-filenames.c
	do
		update_file "$master_dir/$master_file" "$master_file"
	done
fi
#echo "here_version<$here_version>"
#echo "master_version<$master_version>"

# Work out a sensible new version based on the primary kernel version.
if dpkg --compare-versions "$here_version" lt "$master_version"; then
	here_newversion="$master_version"

elif dpkg --compare-versions "$here_version" eq "$master_version"; then
	here_newversion="$master_version+1"
else
	minor=$(( ${here_version##*+} + 1 ))
	here_newversion="$master_version+$minor"
fi

# First insert any primary changes.
marker="__CHANGELOG_FRAGMENT_MARKER__"
dch --newversion "$here_newversion" "$marker"

# Prepare the blank changelog.
tmp="/tmp/$$.msg"

# Note we are being synced to the master version.
if dpkg --compare-versions "$here_version" lt "$master_version"; then
	echo "Updated to version: $master_version"
	[ -f "$tmp" ] && echo "" >>"$tmp"
	echo "  * Master version: $master_version" >>"$tmp"
fi

# Format any existing commits.
count=$( git log --oneline "$here_tagversion".. | wc -l )
if [ "$count" != 0 ]; then
        [ -f "$tmp" ] && echo "" >>"$tmp"
        git log "$here_tagversion".. | "debian/scripts/misc/git-ubuntu-log" >>"$tmp"
fi

# Insert official changelog fragment.
sed -i -e '/^  \* '"$marker"'/{
r '"$tmp"'
d
}' debian/changelog
rm -f "$tmp"

# Close this changelog entry.
dch --distribution "$here_series" --release ''

# Emit final closing commands.
echo "git commit -s -m 'UBUNTU: $tag_prefix$here_newversion' debian/changelog"
$commit git commit -s -m "UBUNTU: $tag_prefix$here_newversion" debian/changelog
here_tagversion=$( echo "$tag_prefix$here_newversion" | sed -e 's/~/_/g' )
echo "git tag -s -m '$tag_prefix$here_newversion' '$namespace$here_tagversion'"
$commit git tag -s -m "$tag_prefix$here_newversion" "$namespace$here_tagversion"
