#!/bin/bash
#
# Convert a patch-queue branch into a patch series in debian/patches and vice
# versa.
#
# assumes you have your quilt patch queue for $branch on patch-queue/$branch
#
# See: https://honk.sigxcpu.org/piki/development/debian_packages_in_git/

is_patch_queue()
{
    local branch=$1

    case $branch in
        patch-queue/*)
            return 0
            ;;
        *)
            return 1
            ;;
    esac
}

run_git()
{
    set -e
    git "$@"
    set +e
}

pq_export()
{
   local branch=$1
   local pq="patch-queue/$branch"

    if is_patch_queue $branch; then
        branch="${branch//patch-queue\/}"
        pq="patch-queue/$branch"
        echo "On \"$pq\", switching to \"$branch\"."
        run_git checkout $branch
    fi

    rm -f debian/patches/*
    PATCHES=`git format-patch -N -o debian/patches $branch...$pq`
    if [ -n "$PATCHES" ]; then
        echo "Regenerating patch queue in \"debian/patches\"."
        > debian/patches/series
        for PATCH in $PATCHES; do
	    # delete the first line (from sha1) and last two lines (git version
	    # info) of the patch file
            sed -i -e '1d' -e 'N;$!P;$!D;$d' $PATCH
            sed -i -e 's/^-- \n[0-9\.]+$//' $PATCH
            echo $PATCH | sed -e 's%debian/patches/%%' >> debian/patches/series
        done
        run_git status -- debian/patches
    else
        echo "No patches on \"$pq\" - nothing to do."
    fi
}

pq_rebase()
{
    local branch=$1
    local pq="patch-queue/$branch"

    if ! is_patch_queue $branch; then
	echo "Switching to \"$pq\""
        run_git checkout $pq
    else
        echo "Already on \"$branch\""
    fi
    run_git rebase "$branch"
}

pq_import()
{
    local branch=$1
    local pq="patch-queue/$branch"
    local patches=debian/patches/


    if is_patch_queue $branch; then
        echo "Already on a patch-queue branch \"$branch\" - doing nothing."
        return 1
    fi

    if ! git checkout -b $pq; then
        echo "Cannot create patch-queue branch \"$pq\". Try \"rebase\" instead."
	return 1
    fi

    if [ ! -r ${patches}series ]; then
        echo "Found no series file at \"$patches\". No patches to add to patch-queue branch."
        return 0
    fi

    maintainer="$(sed -n -e 's/Maintainer: \+\(.*\)/\1/p' debian/control)"
    QUILT_PATCHES=$patches run_git quiltimport --author "$maintainer"
}

pq_drop()
{
    local branch=$1
    local pq="patch-queue/$branch"

    if is_patch_queue $branch; then
        echo "On a patch-queue branch, can't drop it."
        return 1
    else
	run_git branch -D "${pq}"
	echo "Dropped ${pq}."
    fi
}

usage ()
{
    cat <<EOF
$0 [ACTION]

Options:
	export		Export the patch queue associated to the current branch
			into a quilt patch series in debian/patches/ and update the
			series file.

	import		Create a patch queue branch from quilt patches in debian/patches.

	rebase		Switch to patch queue branch associated to the current
			branch and rebase against current branch.

	drop		Drop (delete) the patch queue associated to the current branch.
EOF
}

branch=$(run_git branch --no-color | awk '/^\*/ { print $2 }')

case "$1" in
    export)
        pq_export $branch
        ;;
    import)
	pq_import $branch
	;;
    rebase)
        pq_rebase $branch
        ;;
    drop)
	pq_drop $branch
	;;
    *)
	usage
	exit 1
	;;
esac

