diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-24 01:06:29 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-24 01:43:50 +0100 |
commit | 05db7ab051736bb106467e7f83b9e45684dd227c (patch) | |
tree | 6966a7c098c3eb6e3b9d54ca37094b36b4cbd01e /absurd | |
parent | 5c10d34a99f5c4c1eac28aca58d5d7e414fd91f2 (diff) |
Import: Use absurd `git apply' emulation if gbp pq import fails
gbp import can fail due to git apply not understanding patches.
This is #841867 (against dgit).
The underlying problem is #841866 (in gbp pq) which exposes things
like #841865 and #829067 (in git). I imagine there are other lurking
incompatibilities between git-apply and dpkg-source.
We could in principle reimplement the gbp patch metadata extraction.
But that would be quite tiresome and have its own compatibility
problems.
The real problem is just `git apply'. (Indeed gbp already tries git
apply without, and then with, a whitespace fix option.) We work
around the trouble by providing our own implementation of `git apply'.
Specifically:
We try to do things the sane way (just running gbp pq import) first.
If that works, great. If it doesn't, we put /usr/share/dgit/absurd on
the PATH. That contains only a sh script called `git'. This sh
script figures out whether the caller is trying to invoke `git apply'.
If not, it runs the real git.
If the caller wanted git-apply, the absurd git script emulates it
using dpkg-source --before-build. Conveniently, we know that the
series file will not be touched by patches. So we can write just the
patch we care about into the series file, and run --before-build,
which applies just that one patch.
The results are committed (minus the .pc), and for the next patch,
dpkg-source sees again a tree with simply a single patch to apply.
We try ordinary gbp pq first because our absurd approach is very slow
on a big tree. Also we would like to maximise our chances of the
import working. If git and/or gbp ever work better by themselves, all
of this craziness will simply not happen.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Diffstat (limited to 'absurd')
-rwxr-xr-x | absurd/git | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/absurd/git b/absurd/git new file mode 100755 index 0000000..039bbf0 --- /dev/null +++ b/absurd/git @@ -0,0 +1,70 @@ +#!/bin/sh +set -e + +fail () { + echo >&2 "DGIT ABSURD GIT APPLY - FAILED: $*" + exit 127 +} + +self=${0%/*} +npath=${PATH#$self:} +if test "x$PATH" = "x$npath"; then + fail "PATH FILTER FAIL ($0 $self $PATH)" +fi + +bypass=true +for arg in "$@"; do + case "$arg" in + apply) bypass=false; break ;; + -*) ;; + *) bypass=true; break ;; + esac +done + +if $bypass; then + PATH=$npath + exec git "$@" +fi + +echo >&2 "DGIT ABSURD GIT APPLY - NO BYPASS: $*" + +#exec >/dev/tty 2>&1 + +index=0 +noo=0 + +for arg in "$@"; do + case "$noo.$arg" in + 1.--index) + index=1 + continue + ;; + ?.-*) + fail "UNKNOWN OPTION $arg ($*)" + ;; + 0.apply) + ;; + 1.*) patch="$arg" + ;; + *) + fail "BAD USAGE $arg ($noo $*)" + esac + noo=$(( $noo + 1 )) +done + +if [ $noo != 2 ]; then + fail "NO PATCH ($*)" +fi + +pwd=`pwd` +patch=${patch#$pwd/debian/patches/} +printf "%s\n" "$patch" >debian/patches/series + +dpkg-source --before-build . + +rm -rf .pc +git checkout debian/patches/series +git add -Af . + +echo >&2 "DGIT ABSURD GIT APPLY - APPLIED $patch" +#printf 'APPLIED '; date --iso-8601=ns |