summaryrefslogtreecommitdiff
path: root/absurd
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2016-10-24 01:06:29 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2016-10-24 01:43:50 +0100
commit05db7ab051736bb106467e7f83b9e45684dd227c (patch)
tree6966a7c098c3eb6e3b9d54ca37094b36b4cbd01e /absurd
parent5c10d34a99f5c4c1eac28aca58d5d7e414fd91f2 (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-xabsurd/git70
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