branch --edit-description: protect against mistyped branch name

It is very easy to mistype the branch name when editing its description,
e.g.

	$ git checkout -b my-topic master
	: work work work
	: now we are at a good point to switch working something else
	$ git checkout master
	: ah, let's write it down before we forget what we were doing
	$ git branch --edit-description my-tpoic

The command does not notice that branch 'my-tpoic' does not exist.  It is
not lost (it becomes description of an unborn my-tpoic branch), but is not
very useful.  So detect such a case and error out to reduce the grief
factor from this common mistake.

This incidentally also errors out --edit-description when the HEAD points
at an unborn branch (immediately after "init", or "checkout --orphan"),
because at that point, you do not even have any commit that is part of
your history and there is no point in describing how this particular
branch is different from the branch it forked off of, which is the useful
bit of information the branch description is designed to capture.

We may want to special case the unborn case later, but that is outside the
scope of this patch to prevent more common mistakes before 1.7.9 series
gains too much widespread use.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2012-02-05 17:13:36 -08:00
parent 840c519d7e
commit c2d17ba3db
2 changed files with 52 additions and 4 deletions

View File

@ -768,6 +768,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
with_commit, argv); with_commit, argv);
else if (edit_description) { else if (edit_description) {
const char *branch_name; const char *branch_name;
struct strbuf branch_ref = STRBUF_INIT;
if (detached) if (detached)
die("Cannot give description to detached HEAD"); die("Cannot give description to detached HEAD");
if (!argc) if (!argc)
@ -776,6 +778,19 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
branch_name = argv[0]; branch_name = argv[0];
else else
usage_with_options(builtin_branch_usage, options); usage_with_options(builtin_branch_usage, options);
strbuf_addf(&branch_ref, "refs/heads/%s", branch_name);
if (!ref_exists(branch_ref.buf)) {
strbuf_release(&branch_ref);
if (!argc)
return error("No commit on branch '%s' yet.",
branch_name);
else
return error("No such branch '%s'.", branch_name);
}
strbuf_release(&branch_ref);
if (edit_branch_description(branch_name)) if (edit_branch_description(branch_name))
return 1; return 1;
} else if (rename) { } else if (rename) {

View File

@ -3,11 +3,8 @@
# Copyright (c) 2005 Amos Waterland # Copyright (c) 2005 Amos Waterland
# #
test_description='git branch --foo should not create bogus branch test_description='git branch assorted tests'
This test runs git branch --help and checks that the argument is properly
handled. Specifically, that a bogus branch is not created.
'
. ./test-lib.sh . ./test-lib.sh
test_expect_success \ test_expect_success \
@ -620,4 +617,40 @@ test_expect_success 'use set-upstream on the current branch' '
' '
test_expect_success 'use --edit-description' '
write_script editor <<-\EOF &&
echo "New contents" >"$1"
EOF
EDITOR=./editor git branch --edit-description &&
write_script editor <<-\EOF &&
git stripspace -s <"$1" >"EDITOR_OUTPUT"
EOF
EDITOR=./editor git branch --edit-description &&
echo "New contents" >expect &&
test_cmp EDITOR_OUTPUT expect
'
test_expect_success 'detect typo in branch name when using --edit-description' '
write_script editor <<-\EOF &&
echo "New contents" >"$1"
EOF
(
EDITOR=./editor &&
export EDITOR &&
test_must_fail git branch --edit-description no-such-branch
)
'
test_expect_success 'refuse --edit-description on unborn branch for now' '
write_script editor <<-\EOF &&
echo "New contents" >"$1"
EOF
git checkout --orphan unborn &&
(
EDITOR=./editor &&
export EDITOR &&
test_must_fail git branch --edit-description
)
'
test_done test_done