From: Junio C Hamano Date: Wed, 29 May 2013 21:20:25 +0000 (-0700) Subject: Merge branch 'js/transport-helper-error-reporting-fix' X-Git-Tag: v1.8.4-rc0~256 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/1ccb22d524e4809d5a8282603f0d5433cf2cbb8c?hp=766f0f8ef755eeb7a79b87af9bc348a1ba824589 Merge branch 'js/transport-helper-error-reporting-fix' Finishing touches to fc/transport-helper-error-reporting topic. * js/transport-helper-error-reporting-fix: git-remote-testgit: build it to run under $SHELL_PATH git-remote-testgit: further remove some bashisms git-remote-testgit: avoid process substitution --- diff --git a/.gitignore b/.gitignore index 6669bf0c6c..10aee94760 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,7 @@ /git-remote-ftps /git-remote-fd /git-remote-ext +/git-remote-testgit /git-remote-testpy /git-remote-testsvn /git-repack diff --git a/Makefile b/Makefile index 0f931a2030..5f424a7e19 100644 --- a/Makefile +++ b/Makefile @@ -460,6 +460,7 @@ SCRIPT_SH += git-mergetool.sh SCRIPT_SH += git-pull.sh SCRIPT_SH += git-quiltimport.sh SCRIPT_SH += git-rebase.sh +SCRIPT_SH += git-remote-testgit.sh SCRIPT_SH += git-repack.sh SCRIPT_SH += git-request-pull.sh SCRIPT_SH += git-stash.sh diff --git a/git-remote-testgit b/git-remote-testgit deleted file mode 100755 index 2b865deeb1..0000000000 --- a/git-remote-testgit +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2012 Felipe Contreras - -alias=$1 -url=$2 - -dir="$GIT_DIR/testgit/$alias" -prefix="refs/testgit/$alias" - -default_refspec="refs/heads/*:${prefix}/heads/*" - -refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}" - -test -z "$refspec" && prefix="refs" - -export GIT_DIR="$url/.git" - -mkdir -p "$dir" - -if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS" -then - gitmarks="$dir/git.marks" - testgitmarks="$dir/testgit.marks" - test -e "$gitmarks" || >"$gitmarks" - test -e "$testgitmarks" || >"$testgitmarks" - testgitmarks_args=( "--"{import,export}"-marks=$testgitmarks" ) -fi - -while read line -do - case $line in - capabilities) - echo 'import' - echo 'export' - test -n "$refspec" && echo "refspec $refspec" - if test -n "$gitmarks" - then - echo "*import-marks $gitmarks" - echo "*export-marks $gitmarks" - fi - test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags" - echo - ;; - list) - git for-each-ref --format='? %(refname)' 'refs/heads/' - head=$(git symbolic-ref HEAD) - echo "@$head HEAD" - echo - ;; - import*) - # read all import lines - while true - do - ref="${line#* }" - refs="$refs $ref" - read line - test "${line%% *}" != "import" && break - done - - if test -n "$gitmarks" - then - echo "feature import-marks=$gitmarks" - echo "feature export-marks=$gitmarks" - fi - - if test -n "$GIT_REMOTE_TESTGIT_FAILURE" - then - echo "feature done" - exit 1 - fi - - echo "feature done" - git fast-export "${testgitmarks_args[@]}" $refs | - sed -e "s#refs/heads/#${prefix}/heads/#g" - echo "done" - ;; - export) - if test -n "$GIT_REMOTE_TESTGIT_FAILURE" - then - # consume input so fast-export doesn't get SIGPIPE; - # git would also notice that case, but we want - # to make sure we are exercising the later - # error checks - while read line; do - test "done" = "$line" && break - done - exit 1 - fi - - before=$(git for-each-ref --format='%(refname) %(objectname)') - - git fast-import "${testgitmarks_args[@]}" --quiet - - after=$(git for-each-ref --format='%(refname) %(objectname)') - - # figure out which refs were updated - join -e 0 -o '0 1.2 2.2' -a 2 <(echo "$before") <(echo "$after") | - while read ref a b - do - test $a == $b && continue - if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR" - then - echo "ok $ref" - else - echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR" - fi - done - - echo - ;; - '') - exit - ;; - esac -done diff --git a/git-remote-testgit.sh b/git-remote-testgit.sh new file mode 100755 index 0000000000..2109070d00 --- /dev/null +++ b/git-remote-testgit.sh @@ -0,0 +1,121 @@ +#!/bin/sh +# Copyright (c) 2012 Felipe Contreras + +alias=$1 +url=$2 + +dir="$GIT_DIR/testgit/$alias" +prefix="refs/testgit/$alias" + +default_refspec="refs/heads/*:${prefix}/heads/*" + +refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}" + +test -z "$refspec" && prefix="refs" + +export GIT_DIR="$url/.git" + +mkdir -p "$dir" + +if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS" +then + gitmarks="$dir/git.marks" + testgitmarks="$dir/testgit.marks" + test -e "$gitmarks" || >"$gitmarks" + test -e "$testgitmarks" || >"$testgitmarks" +fi + +while read line +do + case $line in + capabilities) + echo 'import' + echo 'export' + test -n "$refspec" && echo "refspec $refspec" + if test -n "$gitmarks" + then + echo "*import-marks $gitmarks" + echo "*export-marks $gitmarks" + fi + test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags" + echo + ;; + list) + git for-each-ref --format='? %(refname)' 'refs/heads/' + head=$(git symbolic-ref HEAD) + echo "@$head HEAD" + echo + ;; + import*) + # read all import lines + while true + do + ref="${line#* }" + refs="$refs $ref" + read line + test "${line%% *}" != "import" && break + done + + if test -n "$gitmarks" + then + echo "feature import-marks=$gitmarks" + echo "feature export-marks=$gitmarks" + fi + + if test -n "$GIT_REMOTE_TESTGIT_FAILURE" + then + echo "feature done" + exit 1 + fi + + echo "feature done" + git fast-export \ + ${testgitmarks:+"--import-marks=$testgitmarks"} \ + ${testgitmarks:+"--export-marks=$testgitmarks"} \ + $refs | + sed -e "s#refs/heads/#${prefix}/heads/#g" + echo "done" + ;; + export) + if test -n "$GIT_REMOTE_TESTGIT_FAILURE" + then + # consume input so fast-export doesn't get SIGPIPE; + # git would also notice that case, but we want + # to make sure we are exercising the later + # error checks + while read line; do + test "done" = "$line" && break + done + exit 1 + fi + + before=$(git for-each-ref --format=' %(refname) %(objectname) ') + + git fast-import \ + ${testgitmarks:+"--import-marks=$testgitmarks"} \ + ${testgitmarks:+"--export-marks=$testgitmarks"} \ + --quiet + + # figure out which refs were updated + git for-each-ref --format='%(refname) %(objectname)' | + while read ref a + do + case "$before" in + *" $ref $a "*) + continue ;; # unchanged + esac + if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR" + then + echo "ok $ref" + else + echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR" + fi + done + + echo + ;; + '') + exit + ;; + esac +done diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh index 16faa23154..4899af3f7a 100755 --- a/t/t5801-remote-helpers.sh +++ b/t/t5801-remote-helpers.sh @@ -8,11 +8,6 @@ test_description='Test remote-helper import and export commands' . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh -if ! type "${BASH-bash}" >/dev/null 2>&1; then - skip_all='skipping remote-testgit tests, bash not available' - test_done -fi - compare_refs() { git --git-dir="$1/.git" rev-parse --verify $2 >expect && git --git-dir="$3/.git" rev-parse --verify $4 >actual &&