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}