From 752db4254c940bb6ceeb96a265b50830b4cb10b3 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Sat, 27 Apr 2013 21:13:13 +0200 Subject: git-remote-testgit: avoid process substitution The implementation of bash on Windows does not offer process substitution. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- git-remote-testgit | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/git-remote-testgit b/git-remote-testgit index 5fd09f965..643e4aeb1 100755 --- a/git-remote-testgit +++ b/git-remote-testgit @@ -86,17 +86,18 @@ do exit 1 fi - before=$(git for-each-ref --format='%(refname) %(objectname)') + 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 + git for-each-ref --format='%(refname) %(objectname)' | + while read ref a do - test $a == $b && continue + case "$before" in + *" $ref $a "*) + continue ;; # unchanged + esac echo "ok $ref" done -- cgit v1.2.1 From 85d501ce63d3c3b1331f9e51252c128c95e0adf1 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Thu, 25 Apr 2013 12:59:41 +0200 Subject: git-remote-testgit: further remove some bashisms Signed-off-by: Johannes Sixt --- git-remote-testgit | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/git-remote-testgit b/git-remote-testgit index 643e4aeb1..b5289493e 100755 --- a/git-remote-testgit +++ b/git-remote-testgit @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh # Copyright (c) 2012 Felipe Contreras alias=$1 @@ -23,7 +23,6 @@ then testgitmarks="$dir/testgit.marks" test -e "$gitmarks" || >"$gitmarks" test -e "$testgitmarks" || >"$testgitmarks" - testgitmarks_args=( "--"{import,export}"-marks=$testgitmarks" ) fi while read line @@ -69,7 +68,10 @@ do fi echo "feature done" - git fast-export "${testgitmarks_args[@]}" $refs | + git fast-export \ + ${testgitmarks:+"--import-marks=$testgitmarks"} \ + ${testgitmarks:+"--export-marks=$testgitmarks"} \ + $refs | sed -e "s#refs/heads/#${prefix}/heads/#g" echo "done" ;; @@ -88,7 +90,10 @@ do before=$(git for-each-ref --format=' %(refname) %(objectname) ') - git fast-import "${testgitmarks_args[@]}" --quiet + 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)' | -- cgit v1.2.1 From 709a957d9493cbdd457d02bfada067c9b3ccc253 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 26 Apr 2013 16:30:40 -0700 Subject: git-remote-testgit: build it to run under $SHELL_PATH Just like all the other shell scripts, replace the shebang line to make sure it runs under the shell the user specified. As this no longer depends on bashisms, t5801 does not have to say bash must be available somewhere on the system. Signed-off-by: Junio C Hamano --- .gitignore | 1 + Makefile | 1 + git-remote-testgit | 115 ---------------------------------------------- git-remote-testgit.sh | 115 ++++++++++++++++++++++++++++++++++++++++++++++ t/t5801-remote-helpers.sh | 5 -- 5 files changed, 117 insertions(+), 120 deletions(-) delete mode 100755 git-remote-testgit create mode 100755 git-remote-testgit.sh diff --git a/.gitignore b/.gitignore index 6669bf0c6..10aee9476 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 0f931a203..5f424a7e1 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 b5289493e..000000000 --- a/git-remote-testgit +++ /dev/null @@ -1,115 +0,0 @@ -#!/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 - 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 - echo "ok $ref" - done - - echo - ;; - '') - exit - ;; - esac -done diff --git a/git-remote-testgit.sh b/git-remote-testgit.sh new file mode 100755 index 000000000..b5289493e --- /dev/null +++ b/git-remote-testgit.sh @@ -0,0 +1,115 @@ +#!/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 + 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 + echo "ok $ref" + done + + echo + ;; + '') + exit + ;; + esac +done diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh index c956abd86..0a83db887 100755 --- a/t/t5801-remote-helpers.sh +++ b/t/t5801-remote-helpers.sh @@ -7,11 +7,6 @@ test_description='Test remote-helper import and export commands' . ./test-lib.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 && -- cgit v1.2.1