Siddhesh Poyarekar 9ede0d0
#!/bin/sh
Siddhesh Poyarekar 9ede0d0
# Given a git source repo, generate a tarball from the desired branch, modify
Siddhesh Poyarekar 9ede0d0
# the spec file and upload it to lookaside cache if the tarball unpacks and
Siddhesh Poyarekar 9ede0d0
# gets patched cleanly.
Siddhesh Poyarekar 8e19d63
#
Siddhesh Poyarekar 8e19d63
# Usage:
Siddhesh Poyarekar 8e19d63
#
Siddhesh Poyarekar 8e19d63
#     1. Invoke the script as follows:
Siddhesh Poyarekar 8e19d63
#
Siddhesh Poyarekar 8e19d63
#           ./sync-upstream.sh upstream-repo
Siddhesh Poyarekar 8e19d63
#
Siddhesh Poyarekar 8e19d63
#       where upstream-repo is the path to the synced upstream git repo.
Siddhesh Poyarekar 8e19d63
#
Siddhesh Poyarekar 8e19d63
#    2. Watch the script run.  If it proceeds to building the package, then
Siddhesh Poyarekar 8e19d63
#       everything seems good and you just need to test the build after it
Siddhesh Poyarekar 8e19d63
#       is complete.  If it exits before the build (you'll know if you read
Siddhesh Poyarekar 8e19d63
#       the output of the script) then manual intervention is required to
Siddhesh Poyarekar 8e19d63
#       complete the sync.  This will typically happen when a patch fails
Siddhesh Poyarekar 8e19d63
#       to apply on the new sources.
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# Development branch:
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# * As long as the branch is "master" the repository is treated as
Carlos O'Donell e5c3314
#   development and synchronization updates are fully automatic.
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# Stable branches:
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# * Once you branch to a stable Fedora release adjust branch.
Carlos O'Donell e5c3314
#   e.g. release/2.23/master
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# * Set branch_name to the name of the relase
Carlos O'Donell e5c3314
#   e.g. 2.23
Carlos O'Donell e5c3314
#
Carlos O'Donell e5c3314
# * The sync script will automatically stop before commit, push, build
Carlos O'Donell e5c3314
#   for production branches, so you have to review the results and then
Carlos O'Donell e5c3314
#   do those steps yourself.
Carlos O'Donell e5c3314
#
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
set -e
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# We want to sync from master by default.  Change this if you want to sync from
Siddhesh Poyarekar 9ede0d0
# another branch.
Siddhesh Poyarekar 9ede0d0
branch=master
Carlos O'Donell 99a6d4d
# Avoid slashes in branch name.
Carlos O'Donell 99a6d4d
branch_name=master
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# We can't do anything without an upstream repo
Siddhesh Poyarekar 9ede0d0
if [ $# -ne 1 ]; then
Siddhesh Poyarekar 9ede0d0
	echo "Usage: $0 <path-to-upstream-repo>" 1>&2
Siddhesh Poyarekar 9ede0d0
	exit 1
Siddhesh Poyarekar 9ede0d0
fi
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
upstream=$1
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
srcdir=$(git --git-dir=$upstream/.git describe $branch)
Siddhesh Poyarekar 9ede0d0
cursrc=$(sed -ne 's/^%define glibcsrcdir  \(.*\)/\1/p' glibc.spec)
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Upstream has not moved forward since the last sync.
Siddhesh Poyarekar 9ede0d0
# TODO: Some time in the future, we might want to only sync when upstream has
Siddhesh Poyarekar 9ede0d0
# advanced more than a certain number of commits, say, 42.
Siddhesh Poyarekar 9ede0d0
if [ "$cursrc" = "$srcdir" ]; then
Siddhesh Poyarekar 9ede0d0
	echo "+ Already in sync with upstream."
Siddhesh Poyarekar 9ede0d0
	exit 0
Siddhesh Poyarekar 9ede0d0
fi
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Generate and gzip the tarball from the desired branch of the repository.
Siddhesh Poyarekar 9ede0d0
echo "+ Generating tarball."
Siddhesh Poyarekar 9ede0d0
git --git-dir="$upstream/.git" archive --prefix="$srcdir/" "$branch" \
Siddhesh Poyarekar 9ede0d0
	> "$srcdir.tar"
Siddhesh Poyarekar 9ede0d0
gzip -9 "$srcdir.tar"
Siddhesh Poyarekar 9ede0d0
echo "+ Created $srcdir.tar.gz"
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Our changelog header
Siddhesh Poyarekar 9ede0d0
cldate=$(date +'%a %b %d %Y')
Siddhesh Poyarekar 9ede0d0
clname=$(git config --get user.name)
Siddhesh Poyarekar 9ede0d0
clemail=$(git config --get user.email | sed 's/@/\\@/')
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Getting our version and release number from the spec file.
Siddhesh Poyarekar 9ede0d0
nv=$(perl -ne 's/^%define glibcversion (.+)/printf("%s-", $1)/e;' \
Siddhesh Poyarekar 9ede0d0
	  -e 's/^%define glibcrelease ([0-9]+).*/printf("%d\n", $1 + 1)/e;' \
Siddhesh Poyarekar 9ede0d0
	  glibc.spec)
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Our changelog entry.
Siddhesh Poyarekar 3708995
changelog="* $cldate $clname <$clemail> - $nv\n- Auto-sync with upstream $branch.\n"
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
# Change the glibcsrcdir variable, bump up the release number and add an extra
Siddhesh Poyarekar 9ede0d0
# entry to the changelog.
Siddhesh Poyarekar 9ede0d0
echo "+ Updating spec file."
Siddhesh Poyarekar 9ede0d0
perl -pi \
Siddhesh Poyarekar 9ede0d0
	-e "s/^(%define glibcsrcdir  ).+/\$1$srcdir/;
Siddhesh Poyarekar 9ede0d0
	    s/^(%define glibcrelease )(\d+)/print(\$1); print(\$2 + 1);'';/e;
Siddhesh Poyarekar 9ede0d0
	    s/^(%changelog)$/\$1\n$changelog/" \
Siddhesh Poyarekar 9ede0d0
	glibc.spec
Siddhesh Poyarekar 9ede0d0
Carlos O'Donell fe4ad2a
function print_steps {
Carlos O'Donell fe4ad2a
	echo "+ (a) Updating sources e.g. fedpkg new-sources $srcdir.tar.gz"
Carlos O'Donell fe4ad2a
	echo "+ (b) Committing changes e.g. git commit -a"
Carlos O'Donell fe4ad2a
	echo "+ (c) Pushing to fedora e.g. fedpkg push"
Carlos O'Donell fe4ad2a
	echo "+ (d) Building fedora branch e.g. fedpkg build"
Carlos O'Donell fe4ad2a
}
Carlos O'Donell fe4ad2a
Siddhesh Poyarekar 9ede0d0
function prep_failed {
Siddhesh Poyarekar 9ede0d0
	# fedpkg prep failed.
Siddhesh Poyarekar 9ede0d0
	if [ $? -ne 0 ]; then
Siddhesh Poyarekar 9ede0d0
		echo "+ Source prep failed."
Carlos O'Donell fe4ad2a
		echo "+ The 'sources' file is unmodified. Manually use $srcdir.tar.gz."
Carlos O'Donell fe4ad2a
		echo "+ Check the output in $tmpfile and fix things before:"
Carlos O'Donell fe4ad2a
		print_steps
Siddhesh Poyarekar 9ede0d0
		false
Siddhesh Poyarekar 9ede0d0
	fi
Siddhesh Poyarekar 9ede0d0
}
Siddhesh Poyarekar 9ede0d0
Carlos O'Donell e5c3314
function build_failed {
Carlos O'Donell e5c3314
	# fedpkg build failed.
Carlos O'Donell e5c3314
	if [ $? -ne 0 ]; then
Carlos O'Donell e5c3314
		echo "+ Building the package failed (or was interrupted)."
Carlos O'Donell e5c3314
		echo "+ Check the koji logs for final status."
Carlos O'Donell e5c3314
		false
Carlos O'Donell e5c3314
	fi
Carlos O'Donell e5c3314
}
Carlos O'Donell e5c3314
Siddhesh Poyarekar 9ede0d0
echo "+ Testing if fedpkg prep works."
Siddhesh Poyarekar 9ede0d0
tmpfile=$(mktemp fedpkg-prep.out-XXXX)
Siddhesh Poyarekar 9ede0d0
Siddhesh Poyarekar 9ede0d0
trap prep_failed EXIT
Siddhesh Poyarekar 9ede0d0
fedpkg prep > "$tmpfile" 2>&1
Siddhesh Poyarekar 9ede0d0
# Remove mess created by fedpkg prep
Siddhesh Poyarekar 9ede0d0
rm -f "$tmpfile"
Siddhesh Poyarekar 9ede0d0
rm -rf "$srcdir"
Siddhesh Poyarekar 9ede0d0
echo "+ Source prep is clean, so we're good to go."
Siddhesh Poyarekar 9ede0d0
fedpkg new-sources "$srcdir.tar.gz"
Carlos O'Donell 99a6d4d
if [ $branch == "master" ]; then
Carlos O'Donell e5c3314
	git commit -a -m "Auto-sync with upstream $branch."
Carlos O'Donell e5c3314
	fedpkg push
Carlos O'Donell e5c3314
	trap build_failed EXIT
Carlos O'Donell e5c3314
	fedpkg build
Carlos O'Donell e5c3314
	echo "+ Done!"
Carlos O'Donell 99a6d4d
else
Carlos O'Donell e5c3314
	echo "+ This is a non-development branch."
Carlos O'Donell e5c3314
	echo "+ Please review the results of the sync."
Carlos O'Donell fe4ad2a
	echo "+ Once reviewed you need to:"
Carlos O'Donell fe4ad2a
	print_steps
Carlos O'Donell 99a6d4d
fi