X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=absurd%2Fgit;h=d9e2d4ee66a2d8398a7c090514cc894767fa048e;hb=193cfa37a544a2c44f9252b83da54ca1af01c01f;hp=d65a558f1f6b971466f7d8f37f5dbe1c905abd79;hpb=38f6b086d867555316d1065dd7c00c309bb0415d;p=dgit.git diff --git a/absurd/git b/absurd/git index d65a558f..d9e2d4ee 100755 --- a/absurd/git +++ b/absurd/git @@ -1,7 +1,16 @@ #!/bin/sh set -e +case "$DGIT_ABSURD_DEBUG" in +''|0) exec 3>/dev/null ;; +1) exec 3>>../../gbp-pq-output ;; +*) exec 3>>../../gbp-pq-output 2>&3 ;; +esac + +exec 4>>../../absurd-apply-warnings + log () { + echo >&3 "DGIT ABSURD GIT APPLY (DEBUG) $*" echo >&2 "DGIT ABSURD GIT APPLY (STDERR) $*" } @@ -16,22 +25,57 @@ if test "x$PATH" = "x$npath"; then fail "PATH FILTER FAIL ($0 $self $PATH)" fi +filter_path () { + PATH=$npath +} + +squash_author () { + author_vars='NAME EMAIL DATE' + for var in in $author_vars; do + eval "GIT_AUTHOR_$var=\$GIT_COMMITTER_$var" + done +} + +try_commit () { git commit-tree "$try_commit_obj" /dev/null; } + +maybe_squash_author () { + if (set -e; filter_path; try_commit); then return; fi + if ! (set -e; filter_path; squash_author; try_commit); then return; fi + read last <../../absurd-apply-applied + echo >&4 \ + "dgit: warning: suppressed corrupted metadata! ($last)" + squash_author +} + bypass=true for arg in "$@"; do case "$arg" in apply) bypass=false; break ;; + commit-tree) + # Work around #950446 in gbp + echo >&3 "DGIT ABSURD GIT APPLY - COMMIT-TREE: $*" + try_commit_obj="$2" + maybe_squash_author + bypass=true; break + ;; -*) ;; *) bypass=true; break ;; esac done if $bypass; then - PATH=$npath + filter_path + echo >&3 "DGIT ABSURD GIT APPLY - BYPASS: $*" exec git "$@" fi log "NO BYPASS: $*" +case "$DGIT_ABSURD_DEBUG" in +''|0|1) ;; +*) set -x ;; +esac + #exec >/dev/tty 2>&1 index=0 @@ -43,6 +87,9 @@ for arg in "$@"; do index=1 continue ;; + 1.--whitespace=fix) + continue + ;; ?.-*) fail "UNKNOWN OPTION $arg ($*)" ;; @@ -63,13 +110,38 @@ fi pwd=`pwd` patch=${patch#$pwd/debian/patches/} rm -f debian/patches/series -printf "%s\n" "$patch" >debian/patches/series +# Work around #848611. +# We need a stunt filename which the source package must not +# contain. A trick is to use the commit hash of HEAD, whose +# hash value cannot appear in any file in its own tree. +omgwtf="dgit-omg-wtf-$(git rev-parse HEAD)" +cat <debian/patches/$omgwtf +--- +--- a/$omgwtf 2016-10-31 23:28:47.314155919 +0000 ++++ b/$omgwtf 2016-12-18 22:40:01.870058270 +0000 +@@ -0,0 +1 @@ ++: +END +printf "%s\n" "$omgwtf" >debian/patches/series +printf "%s\n" "$patch" >>debian/patches/series + +# Just in case some joker tries to patch .git/something +mv .git ../.git +set +e dpkg-source --before-build . +rc=$? +set -e +rm -rf .git +mv ../.git . +test $rc = 0 + +rm -f $omgwtf debian/patches/$omgwtf rm -rf .pc git checkout debian/patches/series git add -Af . log "APPLIED $patch" +printf >../../absurd-apply-applied '%s\n' "$patch" #printf 'APPLIED '; date --iso-8601=ns