Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
Junio C Hamano | e8cc80d | 2005-11-23 23:46:13 -0800 | [diff] [blame] | 3 | # git-ls-remote could be called from outside a git managed repository; |
| 4 | # this would fail in that case and would issue an error message. |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 5 | GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) || :; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 6 | |
| 7 | get_data_source () { |
| 8 | case "$1" in |
| 9 | */*) |
Junio C Hamano | ea560e6 | 2006-12-22 15:37:48 -0800 | [diff] [blame] | 10 | echo '' |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 11 | ;; |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 12 | .) |
| 13 | echo self |
| 14 | ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 15 | *) |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 16 | if test "$(git config --get "remote.$1.url")" |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 17 | then |
| 18 | echo config |
| 19 | elif test -f "$GIT_DIR/remotes/$1" |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 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 | '') |
Junio C Hamano | ea560e6 | 2006-12-22 15:37:48 -0800 | [diff] [blame] | 35 | echo "$1" |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 36 | ;; |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 37 | self) |
| 38 | echo "$1" |
| 39 | ;; |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 40 | config) |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 41 | git config --get "remote.$1.url" |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 42 | ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 43 | remotes) |
| 44 | sed -ne '/^URL: */{ |
| 45 | s///p |
| 46 | q |
Junio C Hamano | ea560e6 | 2006-12-22 15:37:48 -0800 | [diff] [blame] | 47 | }' "$GIT_DIR/remotes/$1" |
| 48 | ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 49 | branches) |
Junio C Hamano | ea560e6 | 2006-12-22 15:37:48 -0800 | [diff] [blame] | 50 | sed -e 's/#.*//' "$GIT_DIR/branches/$1" |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 51 | ;; |
| 52 | *) |
| 53 | die "internal error: get-remote-url $1" ;; |
| 54 | esac |
| 55 | } |
| 56 | |
Santi Béjar | 648ad18 | 2006-09-23 12:05:43 +0200 | [diff] [blame] | 57 | get_default_remote () { |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 58 | curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') |
| 59 | origin=$(git config --get "branch.$curr_branch.remote") |
Santi Béjar | 648ad18 | 2006-09-23 12:05:43 +0200 | [diff] [blame] | 60 | echo ${origin:-origin} |
| 61 | } |
| 62 | |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 63 | get_remote_default_refs_for_push () { |
| 64 | data_source=$(get_data_source "$1") |
| 65 | case "$data_source" in |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 66 | '' | branches | self) |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 67 | ;; # no default push mapping, just send matching refs. |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 68 | config) |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 69 | git config --get-all "remote.$1.push" ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 70 | remotes) |
| 71 | sed -ne '/^Push: */{ |
| 72 | s///p |
| 73 | }' "$GIT_DIR/remotes/$1" ;; |
| 74 | *) |
| 75 | die "internal error: get-remote-default-ref-for-push $1" ;; |
| 76 | esac |
| 77 | } |
| 78 | |
Junio C Hamano | 5677882 | 2006-11-22 23:15:00 -0800 | [diff] [blame] | 79 | # Called from canon_refs_list_for_fetch -d "$remote", which |
| 80 | # is called from get_remote_default_refs_for_fetch to grok |
| 81 | # refspecs that are retrieved from the configuration, but not |
| 82 | # from get_remote_refs_for_fetch when it deals with refspecs |
| 83 | # supplied on the command line. $ls_remote_result has the list |
| 84 | # of refs available at remote. |
Junio C Hamano | fbc9012 | 2006-12-31 17:44:37 -0800 | [diff] [blame] | 85 | # |
| 86 | # The first token returned is either "explicit" or "glob"; this |
| 87 | # is to help prevent randomly "globbed" ref from being chosen as |
| 88 | # a merge candidate |
Junio C Hamano | 5677882 | 2006-11-22 23:15:00 -0800 | [diff] [blame] | 89 | expand_refs_wildcard () { |
Julian Phillips | 9533991 | 2007-02-13 01:21:40 +0000 | [diff] [blame] | 90 | echo "$ls_remote_result" | |
| 91 | git fetch--tool expand-refs-wildcard "-" "$@" |
Junio C Hamano | 5677882 | 2006-11-22 23:15:00 -0800 | [diff] [blame] | 92 | } |
| 93 | |
Junio C Hamano | 05dd8e2 | 2005-09-25 22:54:23 -0700 | [diff] [blame] | 94 | # Subroutine to canonicalize remote:local notation. |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 95 | canon_refs_list_for_fetch () { |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 96 | # If called from get_remote_default_refs_for_fetch |
| 97 | # leave the branches in branch.${curr_branch}.merge alone, |
| 98 | # or the first one otherwise; add prefix . to the rest |
Junio C Hamano | 05dd8e2 | 2005-09-25 22:54:23 -0700 | [diff] [blame] | 99 | # to prevent the secondary branches to be merged by default. |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 100 | merge_branches= |
Josef Weidendorfer | 62b339a | 2006-12-09 02:28:26 +0100 | [diff] [blame] | 101 | curr_branch= |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 102 | if test "$1" = "-d" |
| 103 | then |
| 104 | shift ; remote="$1" ; shift |
Junio C Hamano | ae9c6ff | 2007-01-25 21:50:49 -0800 | [diff] [blame] | 105 | set $(expand_refs_wildcard "$remote" "$@") |
Junio C Hamano | fbc9012 | 2006-12-31 17:44:37 -0800 | [diff] [blame] | 106 | is_explicit="$1" |
Junio C Hamano | d41cb27 | 2006-12-21 22:39:09 -0800 | [diff] [blame] | 107 | shift |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 108 | if test "$remote" = "$(get_default_remote)" |
| 109 | then |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 110 | curr_branch=$(git symbolic-ref -q HEAD | \ |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 111 | sed -e 's|^refs/heads/||') |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 112 | merge_branches=$(git config \ |
Junio C Hamano | 9e11554 | 2006-12-21 22:10:56 -0800 | [diff] [blame] | 113 | --get-all "branch.${curr_branch}.merge") |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 114 | fi |
Junio C Hamano | fbc9012 | 2006-12-31 17:44:37 -0800 | [diff] [blame] | 115 | if test -z "$merge_branches" && test $is_explicit != explicit |
| 116 | then |
| 117 | merge_branches=..this.will.never.match.any.ref.. |
| 118 | fi |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 119 | fi |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 120 | for ref |
| 121 | do |
Junio C Hamano | efe9bf0 | 2005-08-22 22:52:43 -0700 | [diff] [blame] | 122 | force= |
| 123 | case "$ref" in |
| 124 | +*) |
Junio C Hamano | dfdcb55 | 2006-04-13 19:05:38 -0700 | [diff] [blame] | 125 | ref=$(expr "z$ref" : 'z+\(.*\)') |
Junio C Hamano | efe9bf0 | 2005-08-22 22:52:43 -0700 | [diff] [blame] | 126 | force=+ |
| 127 | ;; |
| 128 | esac |
Mark Wooding | f327dbc | 2006-04-13 22:01:24 +0000 | [diff] [blame] | 129 | expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:" |
| 130 | remote=$(expr "z$ref" : 'z\([^:]*\):') |
| 131 | local=$(expr "z$ref" : 'z[^:]*:\(.*\)') |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 132 | dot_prefix=. |
| 133 | if test -z "$merge_branches" |
| 134 | then |
| 135 | merge_branches=$remote |
| 136 | dot_prefix= |
| 137 | else |
| 138 | for merge_branch in $merge_branches |
| 139 | do |
Junio C Hamano | 756373d | 2007-02-03 16:23:38 -0800 | [diff] [blame] | 140 | [ "$remote" = "$merge_branch" ] && |
| 141 | dot_prefix= && break |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 142 | done |
| 143 | fi |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 144 | case "$remote" in |
Santi Béjar | 153e98d | 2007-01-30 10:36:24 +0100 | [diff] [blame] | 145 | '' | HEAD ) remote=HEAD ;; |
Alex Riesen | 96f12b5 | 2007-05-11 22:35:22 +0200 | [diff] [blame] | 146 | refs/*) ;; |
Eric Wong | 687b8be | 2006-03-10 04:19:07 -0800 | [diff] [blame] | 147 | heads/* | tags/* | remotes/* ) remote="refs/$remote" ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 148 | *) remote="refs/heads/$remote" ;; |
| 149 | esac |
| 150 | case "$local" in |
| 151 | '') local= ;; |
Alex Riesen | 96f12b5 | 2007-05-11 22:35:22 +0200 | [diff] [blame] | 152 | refs/*) ;; |
Eric Wong | 687b8be | 2006-03-10 04:19:07 -0800 | [diff] [blame] | 153 | heads/* | tags/* | remotes/* ) local="refs/$local" ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 154 | *) local="refs/heads/$local" ;; |
| 155 | esac |
Junio C Hamano | d8a1dee | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 156 | |
Mark Wooding | f327dbc | 2006-04-13 22:01:24 +0000 | [diff] [blame] | 157 | if local_ref_name=$(expr "z$local" : 'zrefs/\(.*\)') |
Junio C Hamano | d8a1dee | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 158 | then |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 159 | git check-ref-format "$local_ref_name" || |
Junio C Hamano | d8a1dee | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 160 | die "* refusing to create funny ref '$local_ref_name' locally" |
| 161 | fi |
Junio C Hamano | 05dd8e2 | 2005-09-25 22:54:23 -0700 | [diff] [blame] | 162 | echo "${dot_prefix}${force}${remote}:${local}" |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 163 | done |
| 164 | } |
| 165 | |
| 166 | # Returns list of src: (no store), or src:dst (store) |
| 167 | get_remote_default_refs_for_fetch () { |
| 168 | data_source=$(get_data_source "$1") |
| 169 | case "$data_source" in |
Junio C Hamano | ea560e6 | 2006-12-22 15:37:48 -0800 | [diff] [blame] | 170 | '') |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 171 | echo "HEAD:" ;; |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 172 | self) |
| 173 | canon_refs_list_for_fetch -d "$1" \ |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 174 | $(git for-each-ref --format='%(refname):') |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 175 | ;; |
Johannes Schindelin | 73136b2 | 2006-05-03 15:20:21 +0200 | [diff] [blame] | 176 | config) |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 177 | canon_refs_list_for_fetch -d "$1" \ |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 178 | $(git config --get-all "remote.$1.fetch") ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 179 | branches) |
| 180 | remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1") |
| 181 | case "$remote_branch" in '') remote_branch=master ;; esac |
| 182 | echo "refs/heads/${remote_branch}:refs/heads/$1" |
| 183 | ;; |
| 184 | remotes) |
Santi Béjar | 5372806 | 2006-09-23 22:53:04 +0200 | [diff] [blame] | 185 | canon_refs_list_for_fetch -d "$1" $(sed -ne '/^Pull: */{ |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 186 | s///p |
| 187 | }' "$GIT_DIR/remotes/$1") |
| 188 | ;; |
| 189 | *) |
Paolo Bonzini | 9debc32 | 2007-03-15 09:23:20 +0100 | [diff] [blame] | 190 | die "internal error: get-remote-default-ref-for-fetch $1" ;; |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 191 | esac |
| 192 | } |
| 193 | |
| 194 | get_remote_refs_for_push () { |
| 195 | case "$#" in |
| 196 | 0) die "internal error: get-remote-refs-for-push." ;; |
| 197 | 1) get_remote_default_refs_for_push "$@" ;; |
| 198 | *) shift; echo "$@" ;; |
| 199 | esac |
| 200 | } |
| 201 | |
| 202 | get_remote_refs_for_fetch () { |
| 203 | case "$#" in |
| 204 | 0) |
| 205 | die "internal error: get-remote-refs-for-fetch." ;; |
| 206 | 1) |
| 207 | get_remote_default_refs_for_fetch "$@" ;; |
| 208 | *) |
| 209 | shift |
| 210 | tag_just_seen= |
| 211 | for ref |
| 212 | do |
| 213 | if test "$tag_just_seen" |
| 214 | then |
| 215 | echo "refs/tags/${ref}:refs/tags/${ref}" |
| 216 | tag_just_seen= |
| 217 | continue |
| 218 | else |
| 219 | case "$ref" in |
| 220 | tag) |
Junio C Hamano | efe9bf0 | 2005-08-22 22:52:43 -0700 | [diff] [blame] | 221 | tag_just_seen=yes |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 222 | continue |
| 223 | ;; |
| 224 | esac |
| 225 | fi |
Junio C Hamano | efe9bf0 | 2005-08-22 22:52:43 -0700 | [diff] [blame] | 226 | canon_refs_list_for_fetch "$ref" |
Junio C Hamano | ac4b0cf | 2005-08-20 02:52:24 -0700 | [diff] [blame] | 227 | done |
| 228 | ;; |
| 229 | esac |
| 230 | } |
Junio C Hamano | 4447bad | 2005-09-17 11:56:41 -0700 | [diff] [blame] | 231 | |
| 232 | resolve_alternates () { |
| 233 | # original URL (xxx.git) |
Mark Wooding | f327dbc | 2006-04-13 22:01:24 +0000 | [diff] [blame] | 234 | top_=`expr "z$1" : 'z\([^:]*:/*[^/]*\)/'` |
Junio C Hamano | 4447bad | 2005-09-17 11:56:41 -0700 | [diff] [blame] | 235 | while read path |
| 236 | do |
| 237 | case "$path" in |
| 238 | \#* | '') |
| 239 | continue ;; |
| 240 | /*) |
| 241 | echo "$top_$path/" ;; |
| 242 | ../*) |
| 243 | # relative -- ugly but seems to work. |
| 244 | echo "$1/objects/$path/" ;; |
| 245 | *) |
| 246 | # exit code may not be caught by the reader. |
| 247 | echo "bad alternate: $path" |
| 248 | exit 1 ;; |
| 249 | esac |
| 250 | done |
| 251 | } |
Uwe Kleine-König | 5dee29a | 2007-01-25 05:45:39 +0100 | [diff] [blame] | 252 | |
| 253 | get_uploadpack () { |
| 254 | data_source=$(get_data_source "$1") |
| 255 | case "$data_source" in |
| 256 | config) |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 257 | uplp=$(git config --get "remote.$1.uploadpack") |
Uwe Kleine-König | 5dee29a | 2007-01-25 05:45:39 +0100 | [diff] [blame] | 258 | echo ${uplp:-git-upload-pack} |
| 259 | ;; |
| 260 | *) |
| 261 | echo "git-upload-pack" |
| 262 | ;; |
| 263 | esac |
| 264 | } |