git-parse-remote-scripton commit [PATCH] Start adding the $GIT_DIR/remotes/ support. (ac4b0cf)
   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                expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
  73                remote=$(expr "$ref" : '\([^:]*\):')
  74                local=$(expr "$ref" : '[^:]*:\(.*\)')
  75                case "$remote" in
  76                '') remote=HEAD ;;
  77                *) remote="refs/heads/$remote" ;;
  78                esac
  79                case "$local" in
  80                '') local= ;;
  81                *) local="refs/heads/$local" ;;
  82                esac
  83                echo "${remote}:${local}"
  84        done
  85}
  86
  87# Returns list of src: (no store), or src:dst (store)
  88get_remote_default_refs_for_fetch () {
  89        data_source=$(get_data_source "$1")
  90        case "$data_source" in
  91        '' | branches-partial)
  92                echo "HEAD:" ;;
  93        branches)
  94                remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
  95                case "$remote_branch" in '') remote_branch=master ;; esac
  96                echo "refs/heads/${remote_branch}:refs/heads/$1"
  97                ;;
  98        remotes)
  99                canon_refs_list_for_fetch $(sed -ne '/^Pull: */{
 100                                                s///p
 101                                        }' "$GIT_DIR/remotes/$1")
 102                ;;
 103        *)
 104                die "internal error: get-remote-default-ref-for-push $1" ;;
 105        esac
 106}
 107
 108get_remote_refs_for_push () {
 109        case "$#" in
 110        0) die "internal error: get-remote-refs-for-push." ;;
 111        1) get_remote_default_refs_for_push "$@" ;;
 112        *) shift; echo "$@" ;;
 113        esac
 114}
 115
 116get_remote_refs_for_fetch () {
 117        case "$#" in
 118        0)
 119            die "internal error: get-remote-refs-for-fetch." ;;
 120        1)
 121            get_remote_default_refs_for_fetch "$@" ;;
 122        *)
 123            shift
 124            tag_just_seen=
 125            for ref
 126            do
 127                if test "$tag_just_seen"
 128                then
 129                    echo "refs/tags/${ref}:refs/tags/${ref}"
 130                    tag_just_seen=
 131                    continue
 132                else
 133                    case "$ref" in
 134                    tag)
 135                        tag_just_seen=yes
 136                        continue
 137                        ;;
 138                    esac
 139                fi
 140                canon_refs_list_for_fetch "$ref"
 141            done
 142            ;;
 143        esac
 144}