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.
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
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
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."
Siddhesh Poyarekar 9ede0d0
		echo "+ Check the output in $tmpfile and fix things before committing."
Siddhesh Poyarekar 9ede0d0
		false
Siddhesh Poyarekar 9ede0d0
	fi
Siddhesh Poyarekar 9ede0d0
}
Siddhesh Poyarekar 9ede0d0
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"
Siddhesh Poyarekar 3708995
git commit -a -m "Auto-sync with upstream $branch."
b2bf60e
exit 0
Siddhesh Poyarekar 9ede0d0
fedpkg push
Siddhesh Poyarekar 9ede0d0
fedpkg build
Siddhesh Poyarekar 9ede0d0
echo "+ Done!"