Merge branch 'js/remoteconfig' into next
authorJunio C Hamano <junkio@cox.net>
Tue, 2 May 2006 08:04:14 +0000 (01:04 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 2 May 2006 08:04:14 +0000 (01:04 -0700)
* js/remoteconfig:
fetch, pull: ask config for remote information
builtin-push: also ask config for remote information

builtin-push.c
git-parse-remote.sh
index 9a861b5afea701ddaa31fba902d535710afda13d..06d06ff310da61d71cc11bf0ac9245228a6cc10b 100644 (file)
@@ -115,6 +115,41 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
        return n;
 }
 
+static const char **config_uri;
+static const char *config_repo;
+static int config_repo_len;
+static int config_current_uri;
+static int config_get_refspecs;
+
+static int get_remote_config(const char* key, const char* value)
+{
+       if (!strncmp(key, "remote.", 7) &&
+           !strncmp(key + 7, config_repo, config_repo_len)) {
+               if (!strcmp(key + 7 + config_repo_len, ".url")) {
+                       if (config_current_uri < MAX_URI)
+                               config_uri[config_current_uri++] = strdup(value);
+                       else
+                               error("more than %d URL's specified, ignoring the rest", MAX_URI);
+               }
+               else if (config_get_refspecs &&
+                        !strcmp(key + 7 + config_repo_len, ".push"))
+                       add_refspec(strdup(value));
+       }
+       return 0;
+}
+
+static int get_config_remotes_uri(const char *repo, const char *uri[MAX_URI])
+{
+       config_repo_len = strlen(repo);
+       config_repo = repo;
+       config_current_uri = 0;
+       config_uri = uri;
+       config_get_refspecs = !refspec_nr;
+
+       git_config(get_remote_config);
+       return config_current_uri;
+}
+
 static int get_branches_uri(const char *repo, const char *uri[MAX_URI])
 {
        const char *slash = strchr(repo, '/');
@@ -162,6 +197,10 @@ static int read_config(const char *repo, const char *uri[MAX_URI])
                if (n > 0)
                        return n;
 
+               n = get_config_remotes_uri(repo, uri);
+               if (n > 0)
+                       return n;
+
                n = get_branches_uri(repo, uri);
                if (n > 0)
                        return n;
index c9b899e3d73152a92523ed460f4d90fdab3d6f33..8ce57c80fbcfae101d22fa3a6f2ebffa2ec01cc3 100755 (executable)
@@ -4,13 +4,43 @@
 # this would fail in that case and would issue an error message.
 GIT_DIR=$(git-rev-parse --git-dir 2>/dev/null) || :;
 
+if [ -d "$GIT_DIR"/remotes -a "$GIT_REWRITE_REMOTES" = true ]; then
+       echo "Rewriting $GIT_DIR/remotes" >&2
+       error=0
+       # rewrite into config
+       {
+               cd "$GIT_DIR"/remotes
+               ls | while read f; do
+                       name=$(echo -n "$f" | tr -c "A-Za-z0-9" ".")
+                       sed -n \
+                       -e "s/^URL: /remote.$name.url . /p" \
+                       -e "s/^Pull: /remote.$name.pull ^$ /p" \
+                       -e "s/^Push: /remote.$name.push ^$ /p" \
+                       < "$f"
+               done
+               echo done
+       } | while read key regex value; do
+               case $key in
+               done)
+                       if [ $error = 0 ]; then
+                               mv "$GIT_DIR"/remotes "$GIT_DIR"/remotes.old
+                       fi ;;
+               *)
+                       git-repo-config $key "$value" $regex || error=1 ;;
+               esac
+       done
+fi
+
 get_data_source () {
        case "$1" in
        */*)
                # Not so fast.  This could be the partial URL shorthand...
                token=$(expr "z$1" : 'z\([^/]*\)/')
                remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
-               if test -f "$GIT_DIR/branches/$token"
+               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 +48,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 +68,15 @@ get_remote_url () {
        case "$data_source" in
        '')
                echo "$1" ;;
+       config-partial)
+               token=$(expr "z$1" : '\([^/]*\)/')
+               remainder=$(expr "z$1" : '[^/]*/\(.*\)')
+               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
@@ -56,8 +98,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
@@ -111,8 +155,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.pull") ;;
        branches)
                remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
                case "$remote_branch" in '') remote_branch=master ;; esac