[PATCH] "git fetch --force".
[git/jrn.git] / git-parse-remote-script
blob2da7ae847072ee39a56c4103f4bd3eb5b994f228
1 #!/bin/sh
3 . git-sh-setup-script || die "Not a git archive"
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 ''
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
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
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"
50 die "internal error: get-remote-url $1" ;;
51 esac
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" ;;
64 die "internal error: get-remote-default-ref-for-push $1" ;;
65 esac
68 # Subroutine to canonicalize remote:local notation
69 canon_refs_list_for_fetch () {
70 for ref
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
87 # Returns list of src: (no store), or src:dst (store)
88 get_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"
98 remotes)
99 canon_refs_list_for_fetch $(sed -ne '/^Pull: */{
100 s///p
101 }' "$GIT_DIR/remotes/$1")
104 die "internal error: get-remote-default-ref-for-push $1" ;;
105 esac
108 get_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
116 get_remote_refs_for_fetch () {
117 case "$#" in
119 die "internal error: get-remote-refs-for-fetch." ;;
121 get_remote_default_refs_for_fetch "$@" ;;
123 shift
124 tag_just_seen=
125 for ref
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
138 esac
140 canon_refs_list_for_fetch "$ref"
141 done
143 esac