remote: ignore failure to remove missing branch.<name>.merge

It is not all too unusual for a branch to use "branch.<name>.remote" without "branch.<name>.merge". You may be using the 'push.default' configuration set to 'current', for example, and do $ git checkout -b side colleague/side $ git config branch.side.remote colleague However, "git remote rm" to remove the remote used in such a manner fails with "fatal: could not unset 'branch.<name>.merge'" because it assumes that a branch that has .remote defined must also have .merge defined. Detect the "cannot unset because it is not set to begin with" case and ignore it. Signed-off-by: Ross Lagerwall <rosslagerwall@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ross Lagerwall committed Feb 18, 2017 at 00:23 UTC 20690b213975ad3e9b1bc851f434d818bd2d1de9
2 files changed +22 -1
builtin/remote.c
+3 -1
@@ -769,7 +769,9 @@ static int rm(int argc, const char **argv)
769 strbuf_reset(&buf);
770 strbuf_addf(&buf, "branch.%s.%s",
771 item->string, *k);
772 - git_config_set(buf.buf, NULL);
772 + result = git_config_set_gently(buf.buf, NULL);
773 + if (result && result != CONFIG_NOTHING_SET)
774 + die(_("could not unset '%s'"), buf.buf);
775 }
776 }
777 }
t/t5505-remote.sh
+19
@@ -153,6 +153,25 @@ test_expect_success 'remove errors out early when deleting non-existent branch'
153 )
154 '
155
156 +test_expect_success 'remove remote with a branch without configured merge' '
157 + test_when_finished "(
158 + git -C test checkout master;
159 + git -C test branch -D two;
160 + git -C test config --remove-section remote.two;
161 + git -C test config --remove-section branch.second;
162 + true
163 + )" &&
164 + (
165 + cd test &&
166 + git remote add two ../two &&
167 + git fetch two &&
168 + git checkout -b second two/master^0 &&
169 + git config branch.second.remote two &&
170 + git checkout master &&
171 + git remote rm two
172 + )
173 +'
174 +
175 test_expect_success 'rename errors out early when deleting non-existent branch' '
176 (
177 cd test &&