[PATCH] New git-apply test cases for scanning forwards and backwards.
[git.git] / git-parse-remote-script
1 #!/bin/sh
2
3 . git-sh-setup-script || die "Not a git archive"
4
5 get_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
31 get_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
54 get_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
69 canon_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)
95 get_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
115 get_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
123 get_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 }