diff --git a/sync-upstream.sh b/sync-upstream.sh new file mode 100755 index 0000000..16f0a0d --- /dev/null +++ b/sync-upstream.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# Given a git source repo, generate a tarball from the desired branch, modify +# the spec file and upload it to lookaside cache if the tarball unpacks and +# gets patched cleanly. + +set -e + +# We want to sync from master by default. Change this if you want to sync from +# another branch. +branch=master + +# We can't do anything without an upstream repo +if [ $# -ne 1 ]; then + echo "Usage: $0 " 1>&2 + exit 1 +fi + +upstream=$1 + +srcdir=$(git --git-dir=$upstream/.git describe $branch) +cursrc=$(sed -ne 's/^%define glibcsrcdir \(.*\)/\1/p' glibc.spec) + +# Upstream has not moved forward since the last sync. +# TODO: Some time in the future, we might want to only sync when upstream has +# advanced more than a certain number of commits, say, 42. +if [ "$cursrc" = "$srcdir" ]; then + echo "+ Already in sync with upstream." + exit 0 +fi + +# Generate and gzip the tarball from the desired branch of the repository. +echo "+ Generating tarball." +git --git-dir="$upstream/.git" archive --prefix="$srcdir/" "$branch" \ + > "$srcdir.tar" +gzip -9 "$srcdir.tar" +echo "+ Created $srcdir.tar.gz" + +# Our changelog header +cldate=$(date +'%a %b %d %Y') +clname=$(git config --get user.name) +clemail=$(git config --get user.email | sed 's/@/\\@/') + +# Getting our version and release number from the spec file. +nv=$(perl -ne 's/^%define glibcversion (.+)/printf("%s-", $1)/e;' \ + -e 's/^%define glibcrelease ([0-9]+).*/printf("%d\n", $1 + 1)/e;' \ + glibc.spec) + +# Our changelog entry. +changelog="* $cldate $clname <$clemail> - $nv\n- Sync with upstream $branch\n" + +# Change the glibcsrcdir variable, bump up the release number and add an extra +# entry to the changelog. +echo "+ Updating spec file." +perl -pi \ + -e "s/^(%define glibcsrcdir ).+/\$1$srcdir/; + s/^(%define glibcrelease )(\d+)/print(\$1); print(\$2 + 1);'';/e; + s/^(%changelog)$/\$1\n$changelog/" \ + glibc.spec + +function prep_failed { + # fedpkg prep failed. + if [ $? -ne 0 ]; then + echo "+ Source prep failed." + echo "+ Check the output in $tmpfile and fix things before committing." + false + fi +} + +echo "+ Testing if fedpkg prep works." +tmpfile=$(mktemp fedpkg-prep.out-XXXX) + +trap prep_failed EXIT +fedpkg prep > "$tmpfile" 2>&1 +# Remove mess created by fedpkg prep +rm -f "$tmpfile" +rm -rf "$srcdir" +echo "+ Source prep is clean, so we're good to go." +fedpkg new-sources "$srcdir.tar.gz" +git commit -a -m \"Sync with upstream $branch\" +fedpkg push +fedpkg build +echo "+ Done!"