From ac4b0cff00b7629657e61a1d6e1f1a1250d03198 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 20 Aug 2005 02:52:24 -0700 Subject: [PATCH] Start adding the $GIT_DIR/remotes/ support. All the necessary parsing code is in git-parse-remote-script; update git-push-script to use it. Signed-off-by: Junio C Hamano --- git-parse-remote-script | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100755 git-parse-remote-script (limited to 'git-parse-remote-script') diff --git a/git-parse-remote-script b/git-parse-remote-script new file mode 100755 index 000000000..2da7ae847 --- /dev/null +++ b/git-parse-remote-script @@ -0,0 +1,144 @@ +#!/bin/sh + +. git-sh-setup-script || die "Not a git archive" + +get_data_source () { + case "$1" in + */*) + # Not so fast. This could be the partial URL shorthand... + token=$(expr "$1" : '\([^/]*\)/') + remainder=$(expr "$1" : '[^/]*/\(.*\)') + if test -f "$GIT_DIR/branches/$token" + then + echo branches-partial + else + echo '' + fi + ;; + *) + if test -f "$GIT_DIR/remotes/$1" + then + echo remotes + elif test -f "$GIT_DIR/branches/$1" + then + echo branches + else + echo '' + fi ;; + esac +} + +get_remote_url () { + data_source=$(get_data_source "$1") + case "$data_source" in + '') + echo "$1" ;; + remotes) + sed -ne '/^URL: */{ + s///p + q + }' "$GIT_DIR/remotes/$1" ;; + branches) + sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;; + branches-partial) + token=$(expr "$1" : '\([^/]*\)/') + remainder=$(expr "$1" : '[^/]*/\(.*\)') + url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token") + echo "$url/$remainder" + ;; + *) + die "internal error: get-remote-url $1" ;; + esac +} + +get_remote_default_refs_for_push () { + data_source=$(get_data_source "$1") + case "$data_source" in + '' | branches | branches-partial) + ;; # no default push mapping, just send matching refs. + remotes) + sed -ne '/^Push: */{ + s///p + }' "$GIT_DIR/remotes/$1" ;; + *) + die "internal error: get-remote-default-ref-for-push $1" ;; + esac +} + +# Subroutine to canonicalize remote:local notation +canon_refs_list_for_fetch () { + for ref + do + expr "$ref" : '.*:' >/dev/null || ref="${ref}:" + remote=$(expr "$ref" : '\([^:]*\):') + local=$(expr "$ref" : '[^:]*:\(.*\)') + case "$remote" in + '') remote=HEAD ;; + *) remote="refs/heads/$remote" ;; + esac + case "$local" in + '') local= ;; + *) local="refs/heads/$local" ;; + esac + echo "${remote}:${local}" + done +} + +# Returns list of src: (no store), or src:dst (store) +get_remote_default_refs_for_fetch () { + data_source=$(get_data_source "$1") + case "$data_source" in + '' | branches-partial) + echo "HEAD:" ;; + branches) + remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1") + case "$remote_branch" in '') remote_branch=master ;; esac + echo "refs/heads/${remote_branch}:refs/heads/$1" + ;; + remotes) + canon_refs_list_for_fetch $(sed -ne '/^Pull: */{ + s///p + }' "$GIT_DIR/remotes/$1") + ;; + *) + die "internal error: get-remote-default-ref-for-push $1" ;; + esac +} + +get_remote_refs_for_push () { + case "$#" in + 0) die "internal error: get-remote-refs-for-push." ;; + 1) get_remote_default_refs_for_push "$@" ;; + *) shift; echo "$@" ;; + esac +} + +get_remote_refs_for_fetch () { + case "$#" in + 0) + die "internal error: get-remote-refs-for-fetch." ;; + 1) + get_remote_default_refs_for_fetch "$@" ;; + *) + shift + tag_just_seen= + for ref + do + if test "$tag_just_seen" + then + echo "refs/tags/${ref}:refs/tags/${ref}" + tag_just_seen= + continue + else + case "$ref" in + tag) + tag_just_seen=yes + continue + ;; + esac + fi + canon_refs_list_for_fetch "$ref" + done + ;; + esac +} -- cgit v1.2.1