Johannes Sixt | 85d501c | 2013-04-25 12:59:41 +0200 | [diff] [blame] | 1 | #!/bin/sh |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 2 | # Copyright (c) 2012 Felipe Contreras |
| 3 | |
Mike Hommey | 33cae54 | 2015-01-19 10:35:07 +0900 | [diff] [blame] | 4 | # The first argument can be a url when the fetch/push command was a url |
| 5 | # instead of a configured remote. In this case, use a generic alias. |
| 6 | if test "$1" = "testgit::$2"; then |
| 7 | alias=_ |
| 8 | else |
| 9 | alias=$1 |
| 10 | fi |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 11 | url=$2 |
| 12 | |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 13 | dir="$GIT_DIR/testgit/$alias" |
| 14 | prefix="refs/testgit/$alias" |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 15 | |
Felipe Contreras | ee10fbf | 2012-11-28 23:11:05 +0100 | [diff] [blame] | 16 | default_refspec="refs/heads/*:${prefix}/heads/*" |
| 17 | |
| 18 | refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}" |
| 19 | |
| 20 | test -z "$refspec" && prefix="refs" |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 21 | |
Elia Pinto | bed137d | 2014-05-23 03:15:31 -0700 | [diff] [blame] | 22 | GIT_DIR="$url/.git" |
| 23 | export GIT_DIR |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 24 | |
Felipe Contreras | 510fa6f | 2013-11-12 14:56:56 -0600 | [diff] [blame] | 25 | force= |
| 26 | |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 27 | mkdir -p "$dir" |
| 28 | |
Felipe Contreras | ee10fbf | 2012-11-28 23:11:05 +0100 | [diff] [blame] | 29 | if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS" |
| 30 | then |
| 31 | gitmarks="$dir/git.marks" |
| 32 | testgitmarks="$dir/testgit.marks" |
| 33 | test -e "$gitmarks" || >"$gitmarks" |
| 34 | test -e "$testgitmarks" || >"$testgitmarks" |
Felipe Contreras | ee10fbf | 2012-11-28 23:11:05 +0100 | [diff] [blame] | 35 | fi |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 36 | |
| 37 | while read line |
| 38 | do |
| 39 | case $line in |
| 40 | capabilities) |
| 41 | echo 'import' |
| 42 | echo 'export' |
Felipe Contreras | ee10fbf | 2012-11-28 23:11:05 +0100 | [diff] [blame] | 43 | test -n "$refspec" && echo "refspec $refspec" |
| 44 | if test -n "$gitmarks" |
| 45 | then |
| 46 | echo "*import-marks $gitmarks" |
| 47 | echo "*export-marks $gitmarks" |
| 48 | fi |
John Keeping | 0d957a4 | 2013-04-14 11:57:08 +0100 | [diff] [blame] | 49 | test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags" |
Matthieu Moy | 597b831 | 2013-09-03 17:45:14 +0200 | [diff] [blame] | 50 | test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update" |
Felipe Contreras | 510fa6f | 2013-11-12 14:56:56 -0600 | [diff] [blame] | 51 | echo 'option' |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 52 | echo |
| 53 | ;; |
| 54 | list) |
| 55 | git for-each-ref --format='? %(refname)' 'refs/heads/' |
| 56 | head=$(git symbolic-ref HEAD) |
| 57 | echo "@$head HEAD" |
| 58 | echo |
| 59 | ;; |
| 60 | import*) |
| 61 | # read all import lines |
| 62 | while true |
| 63 | do |
| 64 | ref="${line#* }" |
| 65 | refs="$refs $ref" |
| 66 | read line |
| 67 | test "${line%% *}" != "import" && break |
| 68 | done |
| 69 | |
Felipe Contreras | ee10fbf | 2012-11-28 23:11:05 +0100 | [diff] [blame] | 70 | if test -n "$gitmarks" |
| 71 | then |
| 72 | echo "feature import-marks=$gitmarks" |
| 73 | echo "feature export-marks=$gitmarks" |
| 74 | fi |
Felipe Contreras | 81d340d | 2013-04-10 17:15:52 -0400 | [diff] [blame] | 75 | |
| 76 | if test -n "$GIT_REMOTE_TESTGIT_FAILURE" |
| 77 | then |
| 78 | echo "feature done" |
| 79 | exit 1 |
| 80 | fi |
| 81 | |
Felipe Contreras | 1d3f9a3 | 2012-11-28 23:11:07 +0100 | [diff] [blame] | 82 | echo "feature done" |
Johannes Sixt | 85d501c | 2013-04-25 12:59:41 +0200 | [diff] [blame] | 83 | git fast-export \ |
| 84 | ${testgitmarks:+"--import-marks=$testgitmarks"} \ |
| 85 | ${testgitmarks:+"--export-marks=$testgitmarks"} \ |
| 86 | $refs | |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 87 | sed -e "s#refs/heads/#${prefix}/heads/#g" |
Felipe Contreras | 1d3f9a3 | 2012-11-28 23:11:07 +0100 | [diff] [blame] | 88 | echo "done" |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 89 | ;; |
| 90 | export) |
Felipe Contreras | 81d340d | 2013-04-10 17:15:52 -0400 | [diff] [blame] | 91 | if test -n "$GIT_REMOTE_TESTGIT_FAILURE" |
| 92 | then |
| 93 | # consume input so fast-export doesn't get SIGPIPE; |
| 94 | # git would also notice that case, but we want |
| 95 | # to make sure we are exercising the later |
| 96 | # error checks |
| 97 | while read line; do |
| 98 | test "done" = "$line" && break |
| 99 | done |
| 100 | exit 1 |
| 101 | fi |
| 102 | |
Johannes Sixt | 752db42 | 2013-04-27 21:13:13 +0200 | [diff] [blame] | 103 | before=$(git for-each-ref --format=' %(refname) %(objectname) ') |
Felipe Contreras | 93b5cf9 | 2012-11-28 23:11:06 +0100 | [diff] [blame] | 104 | |
Johannes Sixt | 85d501c | 2013-04-25 12:59:41 +0200 | [diff] [blame] | 105 | git fast-import \ |
Felipe Contreras | 510fa6f | 2013-11-12 14:56:56 -0600 | [diff] [blame] | 106 | ${force:+--force} \ |
Johannes Sixt | 85d501c | 2013-04-25 12:59:41 +0200 | [diff] [blame] | 107 | ${testgitmarks:+"--import-marks=$testgitmarks"} \ |
| 108 | ${testgitmarks:+"--export-marks=$testgitmarks"} \ |
| 109 | --quiet |
Felipe Contreras | 93b5cf9 | 2012-11-28 23:11:06 +0100 | [diff] [blame] | 110 | |
| 111 | # figure out which refs were updated |
Johannes Sixt | 752db42 | 2013-04-27 21:13:13 +0200 | [diff] [blame] | 112 | git for-each-ref --format='%(refname) %(objectname)' | |
| 113 | while read ref a |
Felipe Contreras | 93b5cf9 | 2012-11-28 23:11:06 +0100 | [diff] [blame] | 114 | do |
Johannes Sixt | 752db42 | 2013-04-27 21:13:13 +0200 | [diff] [blame] | 115 | case "$before" in |
| 116 | *" $ref $a "*) |
| 117 | continue ;; # unchanged |
| 118 | esac |
Felipe Contreras | 126aac5 | 2013-05-10 07:08:30 -0500 | [diff] [blame] | 119 | if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR" |
| 120 | then |
| 121 | echo "ok $ref" |
| 122 | else |
| 123 | echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR" |
| 124 | fi |
Felipe Contreras | 93b5cf9 | 2012-11-28 23:11:06 +0100 | [diff] [blame] | 125 | done |
| 126 | |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 127 | echo |
| 128 | ;; |
Felipe Contreras | 510fa6f | 2013-11-12 14:56:56 -0600 | [diff] [blame] | 129 | option\ *) |
| 130 | read cmd opt val <<-EOF |
| 131 | $line |
| 132 | EOF |
| 133 | case $opt in |
| 134 | force) |
| 135 | test $val = "true" && force="true" || force= |
| 136 | echo "ok" |
| 137 | ;; |
| 138 | *) |
| 139 | echo "unsupported" |
| 140 | ;; |
| 141 | esac |
| 142 | ;; |
Felipe Contreras | fc407f9 | 2012-11-28 23:11:01 +0100 | [diff] [blame] | 143 | '') |
| 144 | exit |
| 145 | ;; |
| 146 | esac |
| 147 | done |