git-parse-remote-scripton commit Revert "Replace zero-length array decls with []." (2c04662)
   1#!/bin/sh
   2
   3. git-sh-setup-script || die "Not a git archive"
   4
   5get_data_source () {
   6        case "$1" in
   7        */*)
   8                # Not so fast.  This could be the partial URL shorthand...
   9                token=$(expr "$1" : '\([^/]*\)/')
  10                remainder=$(expr "$1" : '[^/]*/\(.*\)')
  11                if test -f "$GIT_DIR/branches/$token"
  12                then
  13                        echo branches-partial
  14                else
  15                        echo ''
  16                fi
  17                ;;
  18        *)
  19                if test -f "$GIT_DIR/remotes/$1"
  20                then
  21                        echo remotes
  22                elif test -f "$GIT_DIR/branches/$1"
  23                then
  24                        echo branches
  25                else
  26                        echo ''
  27                fi ;;
  28        esac
  29}
  30
  31get_remote_url () {
  32        data_source=$(get_data_source "$1")
  33        case "$data_source" in
  34        '')
  35                echo "$1" ;;
  36        remotes)
  37                sed -ne '/^URL: */{
  38                        s///p
  39                        q
  40                }' "$GIT_DIR/remotes/$1" ;;
  41        branches)
  42                sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;;
  43        branches-partial)
  44                token=$(expr "$1" : '\([^/]*\)/')
  45                remainder=$(expr "$1" : '[^/]*/\(.*\)')
  46                url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token")
  47                echo "$url/$remainder"
  48                ;;
  49        *)
  50                die "internal error: get-remote-url $1" ;;
  51        esac
  52}
  53
  54get_remote_default_refs_for_push () {
  55        data_source=$(get_data_source "$1")
  56        case "$data_source" in
  57        '' | branches | branches-partial)
  58                ;; # no default push mapping, just send matching refs.
  59        remotes)
  60                sed -ne '/^Push: */{
  61                        s///p
  62                }' "$GIT_DIR/remotes/$1" ;;
  63        *)
  64                die "internal error: get-remote-default-ref-for-push $1" ;;
  65        esac
  66}
  67
  68# Subroutine to canonicalize remote:local notation
  69canon_refs_list_for_fetch () {
  70        for ref
  71        do
  72                force=
  73                case "$ref" in
  74                +*)
  75                        ref=$(expr "$ref" : '\+\(.*\)')
  76                        force=+
  77                        ;;
  78                esac
  79                expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
  80                remote=$(expr "$ref" : '\([^:]*\):')
  81                local=$(expr "$ref" : '[^:]*:\(.*\)')
  82                case "$remote" in
  83                '') remote=HEAD ;;
  84                *) remote="refs/heads/$remote" ;;
  85                esac
  86                case "$local" in
  87                '') local= ;;
  88                *) local="refs/heads/$local" ;;
  89                esac
  90                echo "${force}${remote}:${local}"
  91        done
  92}
  93
  94# Returns list of src: (no store), or src:dst (store)
  95get_remote_default_refs_for_fetch () {
  96        data_source=$(get_data_source "$1")
  97        case "$data_source" in
  98        '' | branches-partial)
  99                echo "HEAD:" ;;
 100        branches)
 101                remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
 102                case "$remote_branch" in '') remote_branch=master ;; esac
 103                echo "refs/heads/${remote_branch}:refs/heads/$1"
 104                ;;
 105        remotes)
 106                canon_refs_list_for_fetch $(sed -ne '/^Pull: */{
 107                                                s///p
 108                                        }' "$GIT_DIR/remotes/$1")
 109                ;;
 110        *)
 111                die "internal error: get-remote-default-ref-for-push $1" ;;
 112        esac
 113}
 114
 115get_remote_refs_for_push () {
 116        case "$#" in
 117        0) die "internal error: get-remote-refs-for-push." ;;
 118        1) get_remote_default_refs_for_push "$@" ;;
 119        *) shift; echo "$@" ;;
 120        esac
 121}
 122
 123get_remote_refs_for_fetch () {
 124        case "$#" in
 125        0)
 126            die "internal error: get-remote-refs-for-fetch." ;;
 127        1)
 128            get_remote_default_refs_for_fetch "$@" ;;
 129        *)
 130            shift
 131            tag_just_seen=
 132            for ref
 133            do
 134                if test "$tag_just_seen"
 135                then
 136                    echo "refs/tags/${ref}:refs/tags/${ref}"
 137                    tag_just_seen=
 138                    continue
 139                else
 140                    case "$ref" in
 141                    tag)
 142                        tag_just_seen=yes
 143                        continue
 144                        ;;
 145                    esac
 146                fi
 147                canon_refs_list_for_fetch "$ref"
 148            done
 149            ;;
 150        esac
 151}