git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2] branch: do not fail a no-op --edit-desc

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 30, 2022, 01:27 UTC
Message-ID
<xmqq8rm1mz1d.fsf@gitster.g>
In-Reply-To
<xmqqczbftina.fsf@gitster.g>

Imagine running "git branch --edit-description" on a branch without a branch description, and then exit the editor after emptying the edit buffer, which is the way to tell the command that you changed your mind and you do not want the description after all.

The command should just happily oblige, adding no branch description for the current branch, and exit successfully. But it fails to do so:

    $ git init -b main
    $ git commit --allow-empty -m commit
    $ GIT_EDITOR=: git branch --edit-description
    fatal: could not unset 'branch.main.description'

The end result is OK in that the configuration variable does not exist in the resulting repository, but we should do better, by using git_config_set_gently() and ignoring only the specific error that is returned when removing a missing configuration variable.

A nice side effect is that it allows us to give a pair of messages that are tailored to the situation. Instead of reporting a failure to set or unset a configuration variable "branch.X.description", we can report that we failed to set or unset the description for branch X, allowing the user to be oblivious to the irrelevant detail that the branch description is implemented as a configuration variable.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * So, this is the "other" implementation.  It is a bit more code
   than the simpler one, but may be OK.  I labeled this as v2 but I
   do not mean I consider this one is an improved version of the
   other one.  They are merely alternatives.
 builtin/branch.c  | 13 ++++++++++++-
 t/t3200-branch.sh |  3 +++
 2 files changed, 15 insertions(+), 1 deletion(-)
diff --git c/builtin/branch.c w/builtin/branch.c
index 5d00d0b8d3..033d8bd29b 100644
--- c/builtin/branch.c
+++ w/builtin/branch.c
@@ -606,6 +606,7 @@ static int edit_branch_description(const char *branch_name)
 {
 	struct strbuf buf = STRBUF_INIT;
 	struct strbuf name = STRBUF_INIT;
+	int status;
 
 	read_branch_desc(&buf, branch_name);
 	if (!buf.len || buf.buf[buf.len-1] != '\n')
@@ -624,7 +625,17 @@ static int edit_branch_description(const char *branch_name)
 	strbuf_stripspace(&buf, 1);
 
 	strbuf_addf(&name, "branch.%s.description", branch_name);
-	git_config_set(name.buf, buf.len ? buf.buf : NULL);
+
+	status = git_config_set_gently(name.buf, buf.len ? buf.buf : NULL);
+	if (status && !(status == CONFIG_NOTHING_SET && !buf.len)) {
+		if (buf.len)
+			die(_("failed to set description for branch '%s'"), 
+			    branch_name);
+		else
+			die(_("failed to unset description for branch '%s'"), 
+			    branch_name);
+	}
+
 	strbuf_release(&name);
 	strbuf_release(&buf);
 
diff --git c/t/t3200-branch.sh w/t/t3200-branch.sh
index 9723c2827c..5f72fd7453 100755
--- c/t/t3200-branch.sh
+++ w/t/t3200-branch.sh
@@ -1381,6 +1381,9 @@ test_expect_success 'branch --delete --force removes dangling branch' '
 '
 
 test_expect_success 'use --edit-description' '
+	EDITOR=: git branch --edit-description &&
+	test_must_fail git config branch.main.description &&
+
 	write_script editor <<-\EOF &&
 		echo "New contents" >"$1"
 	EOF
Previous: Rubén JustoNext: Ævar Arnfjörð Bjarmason
Message 8 of 13 in “branch: do not fail a no-op --edit-desc”
  1. branch: do not fail a no-op --edit-descJunio C Hamano, Sep 28, 2022
  2. Rubén JustoSep 28, 2022
  3. Junio C HamanoSep 28, 2022
  4. Rubén JustoSep 29, 2022
  5. Junio C HamanoSep 29, 2022
  6. Rubén JustoSep 30, 2022
  7. Rubén JustoOct 1, 2022
  8. branch: do not fail a no-op --edit-descJunio C Hamano, Sep 30, 2022
  9. Ævar Arnfjörð BjarmasonSep 30, 2022
  10. Junio C HamanoSep 30, 2022
  11. Ævar Arnfjörð BjarmasonSep 30, 2022
  12. Junio C HamanoSep 30, 2022
  13. branch: do not fail a no-op --edit-descJunio C Hamano, Sep 30, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.