git-remote-testgit.shon commit ewah: support platforms that require aligned reads (a201c20)
   1#!/bin/sh
   2# Copyright (c) 2012 Felipe Contreras
   3
   4alias=$1
   5url=$2
   6
   7dir="$GIT_DIR/testgit/$alias"
   8prefix="refs/testgit/$alias"
   9
  10default_refspec="refs/heads/*:${prefix}/heads/*"
  11
  12refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}"
  13
  14test -z "$refspec" && prefix="refs"
  15
  16export GIT_DIR="$url/.git"
  17
  18mkdir -p "$dir"
  19
  20if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS"
  21then
  22        gitmarks="$dir/git.marks"
  23        testgitmarks="$dir/testgit.marks"
  24        test -e "$gitmarks" || >"$gitmarks"
  25        test -e "$testgitmarks" || >"$testgitmarks"
  26fi
  27
  28while read line
  29do
  30        case $line in
  31        capabilities)
  32                echo 'import'
  33                echo 'export'
  34                test -n "$refspec" && echo "refspec $refspec"
  35                if test -n "$gitmarks"
  36                then
  37                        echo "*import-marks $gitmarks"
  38                        echo "*export-marks $gitmarks"
  39                fi
  40                test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags"
  41                test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update"
  42                echo
  43                ;;
  44        list)
  45                git for-each-ref --format='? %(refname)' 'refs/heads/'
  46                head=$(git symbolic-ref HEAD)
  47                echo "@$head HEAD"
  48                echo
  49                ;;
  50        import*)
  51                # read all import lines
  52                while true
  53                do
  54                        ref="${line#* }"
  55                        refs="$refs $ref"
  56                        read line
  57                        test "${line%% *}" != "import" && break
  58                done
  59
  60                if test -n "$gitmarks"
  61                then
  62                        echo "feature import-marks=$gitmarks"
  63                        echo "feature export-marks=$gitmarks"
  64                fi
  65
  66                if test -n "$GIT_REMOTE_TESTGIT_FAILURE"
  67                then
  68                        echo "feature done"
  69                        exit 1
  70                fi
  71
  72                echo "feature done"
  73                git fast-export \
  74                        ${testgitmarks:+"--import-marks=$testgitmarks"} \
  75                        ${testgitmarks:+"--export-marks=$testgitmarks"} \
  76                        $refs |
  77                sed -e "s#refs/heads/#${prefix}/heads/#g"
  78                echo "done"
  79                ;;
  80        export)
  81                if test -n "$GIT_REMOTE_TESTGIT_FAILURE"
  82                then
  83                        # consume input so fast-export doesn't get SIGPIPE;
  84                        # git would also notice that case, but we want
  85                        # to make sure we are exercising the later
  86                        # error checks
  87                        while read line; do
  88                                test "done" = "$line" && break
  89                        done
  90                        exit 1
  91                fi
  92
  93                before=$(git for-each-ref --format=' %(refname) %(objectname) ')
  94
  95                git fast-import \
  96                        ${testgitmarks:+"--import-marks=$testgitmarks"} \
  97                        ${testgitmarks:+"--export-marks=$testgitmarks"} \
  98                        --quiet
  99
 100                # figure out which refs were updated
 101                git for-each-ref --format='%(refname) %(objectname)' |
 102                while read ref a
 103                do
 104                        case "$before" in
 105                        *" $ref $a "*)
 106                                continue ;;     # unchanged
 107                        esac
 108                        if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR"
 109                        then
 110                                echo "ok $ref"
 111                        else
 112                                echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR"
 113                        fi
 114                done
 115
 116                echo
 117                ;;
 118        '')
 119                exit
 120                ;;
 121        esac
 122done