Hi Bert, On Fri, 24 Jan 2020, Bert Wesarg wrote: > 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@xxxxxxxxxxxxxx> > > --- This commit seems to cause a failure in t5505: https://dev.azure.com/gitgitgadget/git/_build/results?buildId=27833&view=ms.vss-test-web.build-test-results-tab Here is the excerpt of the log: -- snip -- [...] expecting success of 5505.15 'show': ( cd test && git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream && git fetch && git checkout -b ahead origin/master && echo 1 >>file && test_tick && git commit -m update file && git checkout master && git branch --track octopus origin/master && git branch --track rebase origin/master && git branch -d -r origin/master && git config --add remote.two.url ../two && git config --add remote.two.pushurl ../three && git config branch.rebase.rebase true && git config branch.octopus.merge "topic-a topic-b topic-c" && ( cd ../one && echo 1 >file && test_tick && git commit -m update file ) && git config --add remote.origin.push : && git config --add remote.origin.push refs/heads/master:refs/heads/upstream && git config --add remote.origin.push +refs/tags/lastbackup && git config --add remote.two.push +refs/heads/ahead:refs/heads/master && git config --add remote.two.push refs/heads/master:refs/heads/another && git remote show origin two >output && git branch -d rebase octopus && test_i18ncmp expect output ) + cd test + git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream + git fetch >From /home/virtualbox/git/t/trash directory.t5505-remote/one * [new branch] master -> upstream + git checkout -b ahead origin/master Switched to a new branch 'ahead' Branch 'ahead' set up to track remote branch 'master' from 'origin'. + echo 1 + test_tick + test -z + test_tick=1112911993 + GIT_COMMITTER_DATE=1112911993 -0700 + GIT_AUTHOR_DATE=1112911993 -0700 + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE + git commit -m update file [ahead 847549e] update Author: A U Thor <author@xxxxxxxxxxx> 1 file changed, 1 insertion(+) + git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. + git branch --track octopus origin/master Branch 'octopus' set up to track remote branch 'master' from 'origin'. + git branch --track rebase origin/master Branch 'rebase' set up to track remote branch 'master' from 'origin'. + git branch -d -r origin/master Deleted remote-tracking branch origin/master (was 9d34b14). + git config --add remote.two.url ../two + git config --add remote.two.pushurl ../three + git config branch.rebase.rebase true + git config branch.octopus.merge topic-a topic-b topic-c + cd ../one + echo 1 + test_tick + test -z set + test_tick=1112912053 + GIT_COMMITTER_DATE=1112912053 -0700 + GIT_AUTHOR_DATE=1112912053 -0700 + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE + git commit -m update file [master 6329a3c] update Author: A U Thor <author@xxxxxxxxxxx> 1 file changed, 1 insertion(+) + git config --add remote.origin.push : + git config --add remote.origin.push refs/heads/master:refs/heads/upstream + git config --add remote.origin.push +refs/tags/lastbackup + git config --add remote.two.push +refs/heads/ahead:refs/heads/master + git config --add remote.two.push refs/heads/master:refs/heads/another + git remote show origin two error: src refspec refs/tags/lastbackup does not match any + git branch -d rebase octopus Deleted branch rebase (was 9d34b14). Deleted branch octopus (was 9d34b14). + test_i18ncmp expect output + test_have_prereq C_LOCALE_OUTPUT + save_IFS= + IFS=, + set -- C_LOCALE_OUTPUT + IFS= + total_prereq=0 + ok_prereq=0 + missing_prereq= + negative_prereq= + total_prereq=1 + satisfied_this_prereq=t + ok_prereq=1 + test 1 = 1 + test_cmp expect output + diff -u expect output --- expect 2020-01-25 00:44:41.496720000 +0000 +++ output 2020-01-25 00:44:43.513861900 +0000 @@ -5,13 +5,6 @@ Remote branches: master new (next fetch will store in remotes/origin) side tracked - Local branches configured for 'git pull': - ahead merges with remote master - master merges with remote master - octopus merges with remote topic-a - and with remote topic-b - and with remote topic-c - rebase rebases onto remote master Local refs configured for 'git push': master pushes to master (local out of date) master pushes to upstream (create) error: last command exited with $?=1 not ok 15 - show # # ( # cd test && # git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream && # git fetch && # git checkout -b ahead origin/master && # echo 1 >>file && # test_tick && # git commit -m update file && # git checkout master && # git branch --track octopus origin/master && # git branch --track rebase origin/master && # git branch -d -r origin/master && # git config --add remote.two.url ../two && # git config --add remote.two.pushurl ../three && # git config branch.rebase.rebase true && # git config branch.octopus.merge "topic-a topic-b topic-c" && # ( # cd ../one && # echo 1 >file && # test_tick && # git commit -m update file # ) && # git config --add remote.origin.push : && # git config --add remote.origin.push refs/heads/master:refs/heads/upstream && # git config --add remote.origin.push +refs/tags/lastbackup && # git config --add remote.two.push +refs/heads/ahead:refs/heads/master && # git config --add remote.two.push refs/heads/master:refs/heads/another && # git remote show origin two >output && # git branch -d rebase octopus && # test_i18ncmp expect output # ) # -- snap -- Could you have a look to see whether the code or the test need to be adjusted? Thanks, Dscho > > Changes since v3: > > * handle also 'git remote remove' > > Cc: Junio C Hamano <gitster@xxxxxxxxx> > Cc: Johannes Schindelin <johannes.schindelin@xxxxxx> > --- > builtin/remote.c | 22 +++++++++++++++++++++- > t/t5505-remote.sh | 16 +++++++++++++++- > 2 files changed, 36 insertions(+), 2 deletions(-) > > diff --git a/builtin/remote.c b/builtin/remote.c > index 9ee44c9f6c..a2379a14bf 100644 > --- a/builtin/remote.c > +++ b/builtin/remote.c > @@ -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); > + } > } > > /* > diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh > index 883b32efa0..082042b05a 100755 > --- a/t/t5505-remote.sh > +++ b/t/t5505-remote.sh > @@ -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 > -- > 2.24.1.497.g9abd7b20b4.dirty > >