Message ID | 9c2110eda64ab7bf0cb780dafe1f13b28fee5ca0.1579857394.git.bert.wesarg@googlemail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | remote rename/remove: improve handling of configuration values | expand |
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@googlemail.com> > > --- 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@example.com> 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@example.com> 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@pobox.com> > Cc: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > 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 > >
Dear Dscho, On 25.01.20 01:46, Johannes Schindelin wrote: > 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@googlemail.com> >> >> --- > > 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@example.com> > 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@example.com> > 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? please ensure that you have v4 of this patch. What you see was a bug in v3. Thanks. Bert > > Thanks, > Dscho >
Hi Bert, On Sat, 25 Jan 2020, Bert Wesarg wrote: > On 25.01.20 01:46, Johannes Schindelin wrote: > > 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@googlemail.com> > > > > > > --- > > > > 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: > > > > [...] > > > > Could you have a look to see whether the code or the test need to be > > adjusted? > > please ensure that you have v4 of this patch. What you see was a bug in v3. I was talking about the current state of what was merged into `pu`: https://github.com/gitgitgadget/git/commit/6f032056fd7534b8efd712994c02531d83ada957 (note the red X indicating the build failure). If you already fixed this, and Junio merely has to pick it up, all the better. Thanks, Dscho
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
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> --- Changes since v3: * handle also 'git remote remove' Cc: Junio C Hamano <gitster@pobox.com> Cc: Johannes Schindelin <johannes.schindelin@gmx.de> --- builtin/remote.c | 22 +++++++++++++++++++++- t/t5505-remote.sh | 16 +++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-)