Git.pm: Handle failed commands' output
[gitweb.git] / git-parse-remote.sh
index 63f22818e6aa36b5f101af996941b0471ce3cbf3..187f0883c9136772677088ddf61228291d4b41d1 100755 (executable)
@@ -8,9 +8,12 @@ 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"
+               token=$(expr "z$1" : 'z\([^/]*\)/')
+               remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
+               if test "$(git-repo-config --get "remote.$token.url")"
+               then
+                       echo config-partial
+               elif test -f "$GIT_DIR/branches/$token"
                then
                        echo branches-partial
                else
@@ -18,7 +21,10 @@ get_data_source () {
                fi
                ;;
        *)
-               if test -f "$GIT_DIR/remotes/$1"
+               if test "$(git-repo-config --get "remote.$1.url")"
+               then
+                       echo config
+               elif test -f "$GIT_DIR/remotes/$1"
                then
                        echo remotes
                elif test -f "$GIT_DIR/branches/$1"
@@ -35,6 +41,15 @@ get_remote_url () {
        case "$data_source" in
        '')
                echo "$1" ;;
+       config-partial)
+               token=$(expr "z$1" : 'z\([^/]*\)/')
+               remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
+               url=$(git-repo-config --get "remote.$token.url")
+               echo "$url/$remainder"
+               ;;
+       config)
+               git-repo-config --get "remote.$1.url"
+               ;;
        remotes)
                sed -ne '/^URL: */{
                        s///p
@@ -43,8 +58,8 @@ get_remote_url () {
        branches)
                sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;;
        branches-partial)
-               token=$(expr "$1" : '\([^/]*\)/')
-               remainder=$(expr "$1" : '[^/]*/\(.*\)')
+               token=$(expr "z$1" : 'z\([^/]*\)/')
+               remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
                url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token")
                echo "$url/$remainder"
                ;;
@@ -56,8 +71,10 @@ get_remote_url () {
 get_remote_default_refs_for_push () {
        data_source=$(get_data_source "$1")
        case "$data_source" in
-       '' | branches | branches-partial)
+       '' | config-partial | branches | branches-partial)
                ;; # no default push mapping, just send matching refs.
+       config)
+               git-repo-config --get-all "remote.$1.push" ;;
        remotes)
                sed -ne '/^Push: */{
                        s///p
@@ -77,13 +94,13 @@ canon_refs_list_for_fetch () {
                force=
                case "$ref" in
                +*)
-                       ref=$(expr "$ref" : '\+\(.*\)')
+                       ref=$(expr "z$ref" : 'z+\(.*\)')
                        force=+
                        ;;
                esac
-               expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
-               remote=$(expr "$ref" : '\([^:]*\):')
-               local=$(expr "$ref" : '[^:]*:\(.*\)')
+               expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
+               remote=$(expr "z$ref" : 'z\([^:]*\):')
+               local=$(expr "z$ref" : 'z[^:]*:\(.*\)')
                case "$remote" in
                '') remote=HEAD ;;
                refs/heads/* | refs/tags/* | refs/remotes/*) ;;
@@ -97,7 +114,7 @@ canon_refs_list_for_fetch () {
                *) local="refs/heads/$local" ;;
                esac
 
-               if local_ref_name=$(expr "$local" : 'refs/\(.*\)')
+               if local_ref_name=$(expr "z$local" : 'zrefs/\(.*\)')
                then
                   git-check-ref-format "$local_ref_name" ||
                   die "* refusing to create funny ref '$local_ref_name' locally"
@@ -111,8 +128,11 @@ canon_refs_list_for_fetch () {
 get_remote_default_refs_for_fetch () {
        data_source=$(get_data_source "$1")
        case "$data_source" in
-       '' | branches-partial)
+       '' | config-partial | branches-partial)
                echo "HEAD:" ;;
+       config)
+               canon_refs_list_for_fetch \
+                       $(git-repo-config --get-all "remote.$1.fetch") ;;
        branches)
                remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
                case "$remote_branch" in '') remote_branch=master ;; esac
@@ -171,7 +191,7 @@ get_remote_refs_for_fetch () {
 
 resolve_alternates () {
        # original URL (xxx.git)
-       top_=`expr "$1" : '\([^:]*:/*[^/]*\)/'`
+       top_=`expr "z$1" : 'z\([^:]*:/*[^/]*\)/'`
        while read path
        do
                case "$path" in