]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remote rename/remove: handle branch.<name>.pushRemote config values
authorBert Wesarg <bert.wesarg@googlemail.com>
Mon, 27 Jan 2020 07:04:30 +0000 (08:04 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Feb 2020 18:52:10 +0000 (10:52 -0800)
When renaming or removing a remote with

    git remote rename X Y
    git remote remove X

Git already renames/removes any config values from

    branch.<name>.remote = X

to

    branch.<name>.remote = Y

As branch.<name>.pushRemote also names a remote, it now also renames
or removes these config values from

    branch.<name>.pushRemote = X

to

    branch.<name>.pushRemote = Y

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/remote.c
t/t5505-remote.sh

index 9ee44c9f6c337a9d20cd69cce990d7c2f49039b0..a2379a14bf988942e7b7011a0eed26e819f887b3 100644 (file)
@@ -250,6 +250,7 @@ struct branch_info {
        char *remote_name;
        struct string_list merge;
        enum rebase_type rebase;
+       char *push_remote_name;
 };
 
 static struct string_list branch_list = STRING_LIST_INIT_NODUP;
@@ -267,7 +268,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
        char *name;
        struct string_list_item *item;
        struct branch_info *info;
-       enum { REMOTE, MERGE, REBASE } type;
+       enum { REMOTE, MERGE, REBASE, PUSH_REMOTE } type;
        size_t key_len;
 
        if (!starts_with(key, "branch."))
@@ -280,6 +281,8 @@ static int config_read_branches(const char *key, const char *value, void *cb)
                type = MERGE;
        else if (strip_suffix(key, ".rebase", &key_len))
                type = REBASE;
+       else if (strip_suffix(key, ".pushremote", &key_len))
+               type = PUSH_REMOTE;
        else
                return 0;
        name = xmemdupz(key, key_len);
@@ -315,6 +318,11 @@ static int config_read_branches(const char *key, const char *value, void *cb)
                 */
                info->rebase = rebase_parse_value(value);
                break;
+       case PUSH_REMOTE:
+               if (info->push_remote_name)
+                       warning(_("more than one %s"), orig_key);
+               info->push_remote_name = xstrdup(value);
+               break;
        default:
                BUG("unexpected type=%d", type);
        }
@@ -682,6 +690,11 @@ static int mv(int argc, const char **argv)
                        strbuf_addf(&buf, "branch.%s.remote", item->string);
                        git_config_set(buf.buf, rename.new_name);
                }
+               if (info->push_remote_name && !strcmp(info->push_remote_name, rename.old_name)) {
+                       strbuf_reset(&buf);
+                       strbuf_addf(&buf, "branch.%s.pushremote", item->string);
+                       git_config_set(buf.buf, rename.new_name);
+               }
        }
 
        if (!refspec_updated)
@@ -783,6 +796,13 @@ static int rm(int argc, const char **argv)
                                        die(_("could not unset '%s'"), buf.buf);
                        }
                }
+               if (info->push_remote_name && !strcmp(info->push_remote_name, remote->name)) {
+                       strbuf_reset(&buf);
+                       strbuf_addf(&buf, "branch.%s.pushremote", item->string);
+                       result = git_config_set_gently(buf.buf, NULL);
+                       if (result && result != CONFIG_NOTHING_SET)
+                               die(_("could not unset '%s'"), buf.buf);
+               }
        }
 
        /*
index 883b32efa024d97ac74e9ae5763dc8a218251675..082042b05aeccd1bfe481447d1aa15c81f747822 100755 (executable)
@@ -737,12 +737,14 @@ test_expect_success 'rename a remote' '
        git clone one four &&
        (
                cd four &&
+               git config branch.master.pushRemote origin &&
                git remote rename origin upstream &&
                test -z "$(git for-each-ref refs/remotes/origin)" &&
                test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
                test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
                test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
-               test "$(git config branch.master.remote)" = "upstream"
+               test "$(git config branch.master.remote)" = "upstream" &&
+               test "$(git config branch.master.pushRemote)" = "upstream"
        )
 '
 
@@ -784,6 +786,18 @@ test_expect_success 'rename succeeds with existing remote.<target>.prune' '
        git -C four.four remote rename origin upstream
 '
 
+test_expect_success 'remove a remote' '
+       git clone one four.five &&
+       (
+               cd four.five &&
+               git config branch.master.pushRemote origin &&
+               git remote remove origin &&
+               test -z "$(git for-each-ref refs/remotes/origin)" &&
+               test_must_fail git config branch.master.remote &&
+               test_must_fail git config branch.master.pushRemote
+       )
+'
+
 cat >remotes_origin <<EOF
 URL: $(pwd)/one
 Push: refs/heads/master:refs/heads/upstream