#!/bin/sh

fail() { [ $# -eq 0 ] || echo "$@" 1>&2; exit 1; }

Usage() {
   cat <<EOF
Usage: debian/${0##*/} trunk-BZR-branch [ upstream-ver ]

  revno is the revision in *this* branch that correlates
  with the last upstream release.
EOF
}

[ $# -lt 1 ] && { Usage; exit 1; }
tb=$1
upstream_ver=$2
pname="sync-to-trunk.patch"

if [ -z "$2" ]; then
   upstream_ver=$(head -n 1 debian/changelog |
      sed -e 's,[^(]*(\([^)]*\)).*,\1,' -e 's,-.*,,')
   [ -n "$upstream_ver" ] || fail "failed to get upstream_ver"
   upstream_ver="tag:${upstream_ver}"
fi

if [ "${upstream_ver#tag:}" != "${upstream_ver}" ]; then
   out=$( cd "${tb}" && bzr log -r "${upstream_ver}" --line) &&
      tag_revno=${out%%:*} ||
      fail "failed to get revision number for ${upstream_ver} from ${tb}"
else
   tag_revno=${upstream_ver}
fi

tag_plus1=$(($tag_revno+1))
end=$( cd "${tb}" && bzr revno)

tmpd=$(mktemp -d)
trap "rm -Rf $tmpd" EXIT


( cd "${tb}" && bzr log "-r$tag_plus1..$end" &&
   bzr diff -p1 -r $tag_revno..$end ) > "${tmpd}/raw" 
ret=$?
[ $ret -eq 0 -o $ret -eq 1 ] || fail "getting diff failed"

echo "Patch created with '${0} ${*}'" > "${tmpd}/${pname}"
filterdiff --exclude "*/debian/*" < "${tmpd}/raw" >> "${tmpd}/${pname}" ||
   fail "failed to filterdiff"

if quilt applied; then
   quilt pop -a ||
      fail "failed to pop patches in quilt queue"
fi

if quilt series | grep ^${pname} ; then
   quilt delete -r "${pname}" ||
      fail "failed patch ${pname}"
fi

quilt import "${tmpd}/${pname}" ||
   fail "failed to import"

quilt push "${pname}" || fail "failed to push to ${pname}"

if [ -e .bzr ]; then
   for f in $(quilt files); do
       # bzr used to store patches applied. We do not want that for git.
       bzr add "$f" || fail "failed to bzr add $f"
   done
else
   git add debian/patches/$pname debian/patches/series
   quilt pop
fi

echo "refreshed ${pname}"
echo "you may need to quilt push -a now if you had other changes"
