branch: add '--show-description' option
cover branch: add '--show-description' option
'git branch' has an option to edit a branch's description, but lacks the option to show that description. The last patch adds the option to do just that. The first three patches are while-at-it minor cleanups and fixes in the area.
SZEDER Gábor (4):
branch: '--edit-description' is incompatible with other options
t3200: fix a misindented line
t3200: restore branch after "unborn --edit-description" test
branch: add '--show-description' option
Documentation/git-branch.txt | 6 +++++- builtin/branch.c | 39 +++++++++++++++++++++++++++++++--- contrib/completion/git-completion.bash | 4 ++-- t/t3200-branch.sh | 26 ++++++++++++++++++++++- 4 files changed, 68 insertions(+), 7 deletions(-)
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7
PATCH 1/4 branch: '--edit-description' is incompatible with other options
'--edit-description' is incompatible with 'git branch's other options, but the check for conflicting options doesn't look for this option. As a result 'git branch' doesn't error out showing usage when '--edit-description' is used in combination with other options, but e.g. 'git branch --list --edit-description' lists all branches and doesn't edit any branch descriptions, while 'git branch --edit-description --list' edits the current branch's description but doesn't list the branches.
Look for '--edit-description', too, when looking for conflicting options.
--- builtin/branch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
builtin/branch.c +1 -1
@@ -662,7 +662,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) list =1 ;if (!!delete + !!rename + !!copy + !!new_upstream + - list + unset_upstream >1 ) + list + unset_upstream + edit_description >1 )usage_with_options (builtin_branch_usage, options);if (filter.abbrev ==-1 )
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7
PATCH 2/4 t3200: fix a misindented line
In reply to SZEDER Gábor--- t/t3200-branch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
t/t3200-branch.sh +1 -1
@@ -1215,7 +1215,7 @@ test_expect_success 'use --edit-description' ' echo "New contents" >"$1" EOF EDITOR=./editor git branch --edit-description && - write_script editor <<-\EOF && + write_script editor <<-\EOF && git stripspace -s <"$1" >"EDITOR_OUTPUT" EOF EDITOR=./editor git branch --edit-description &&
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7
PATCH 3/4 t3200: restore branch after "unborn --edit-description" test
In reply to SZEDER GáborThe test 'refuse --edit-description on unborn branch for now' switches to an orphan branch and leaves the test repository in that state. This might badly influence the subsequent test expecting 'git branch --merged' to error out, by hiding a potential regression with an error triggered by the unborn branch. Furthermore, a new test that will be added later in this series failed first because of this.
Use test_when_finished to switch back to the master branch at the end of the test in question.
--- t/t3200-branch.sh | 1 + 1 file changed, 1 insertion(+)
t/t3200-branch.sh +1 -0
@@ -1234,6 +1234,7 @@ test_expect_success 'refuse --edit-description on unborn branch for now' ' write_script editor <<-\EOF && echo "New contents" >"$1" EOF + test_when_finished git checkout master && git checkout --orphan unborn && test_must_fail env EDITOR=./editor git branch --edit-description '
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7
PATCH 4/4 branch: add '--show-description' option
In reply to SZEDER Gábor'git branch' has an option to edit a branch's description, but lacks the option to show that description.
Therefore, add a new '--show-description' option to do just that, as a more user-friendly alternative to 'git config --get branch.$branchname.description':
- it's shorter to type (both in the number of characters and the number of TABs if using completion),
- works on the current branch without explicitly naming it,
- hides the implementation detail that branch descriptions are stored in the config file, and
- errors out with a proper error message when the given branch doesn't exist (but exits quietly with an error code when the branch does exit but has no description, just like the 'git config' query does).
--- Documentation/git-branch.txt | 6 +++++- builtin/branch.c | 39 +++++++++++++++++++++++++++++++--- contrib/completion/git-completion.bash | 4 ++-- t/t3200-branch.sh | 23 ++++++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-)
Documentation/git-branch.txt +5 -1
@@ -20,7 +20,7 @@ SYNOPSIS 'git branch' (-m | -M) [<oldbranch>] <newbranch> 'git branch' (-c | -C) [<oldbranch>] <newbranch> 'git branch' (-d | -D) [-r] <branchname>... -'git branch' --edit-description [<branchname>] +'git branch' (--edit-description | --show-description) [<branchname>] DESCRIPTION -----------
@@ -226,6 +226,10 @@ start-point is either a local or remote-tracking branch. `request-pull`, and `merge` (if enabled)). Multi-line explanations may be used. +--show-description:: + Show the description of the branch previously set using + `--edit-description`. + --contains [<commit>]:: Only list branches which contain the specified commit (HEAD if not specified). Implies `--list`.
builtin/branch.c +36 -3
@@ -573,7 +573,7 @@ static int edit_branch_description(const char *branch_name)int cmd_branch (int argc,const char **argv,const char *prefix) {int delete =0 , rename =0 , copy =0 , force =0 , list =0 ; -int reflog =0 , edit_description =0 ; +int reflog =0 , edit_description =0 , show_description =0 ;int quiet =0 , unset_upstream =0 ;const char *new_upstream =NULL ;enum branch_track track;
@@ -615,6 +615,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)OPT_BOOL ('l' ,"create-reflog" , &reflog,N_ ("create the branch's reflog" )),OPT_BOOL (0 ,"edit-description" , &edit_description,N_ ("edit the description for the branch" )), +OPT_BOOL (0 ,"show-description" , &show_description, +N_ ("show the description for the branch" )),OPT__FORCE (&force,N_ ("force creation, move/rename, deletion" )),OPT_MERGED (&filter,N_ ("print only branches that are merged" )), OPT_NO_MERGED(&filter, N_("print only branches that are not merged")),
@@ -654,7 +656,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix) argc =parse_options (argc, argv, prefix, options, builtin_branch_usage,0 ); -if (!delete && !rename && !copy && !edit_description && !new_upstream && !unset_upstream && argc ==0 ) +if (!delete && !rename && !copy && + !edit_description && !show_description && + !new_upstream && !unset_upstream && argc ==0 ) list =1 ; if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr ||
@@ -662,7 +666,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) list =1 ;if (!!delete + !!rename + !!copy + !!new_upstream + - list + unset_upstream + edit_description >1 ) + list + unset_upstream + edit_description + show_description >1 )usage_with_options (builtin_branch_usage, options);if (filter.abbrev ==-1 )
@@ -737,6 +741,35 @@ int cmd_branch(int argc, const char **argv, const char *prefix)if (edit_branch_description (branch_name))return 1 ; + }else if (show_description) { +const char *branch_name; +struct strbuf buf =STRBUF_INIT ; +char *description =NULL ; + +if (!argc) { +if (filter.detached) +die (_ ("cannot show description on detached HEAD" )); + branch_name = head; + }else if (argc ==1 ) + branch_name = argv[0 ]; +else +die (_ ("cannot show description of more than one branch" )); + +strbuf_addf (&buf,"refs/heads/%s" , branch_name); +if (!ref_exists (buf.buf)) { +strbuf_release (&buf); +return error (_ ("no branch named '%s'" ), branch_name); + } +strbuf_reset (&buf); + +strbuf_addf (&buf,"branch.%s.description" , branch_name); +if (git_config_get_string (buf.buf, &description)) { +strbuf_release (&buf); +return 1 ; + } +printf ("%s" , description); +strbuf_release (&buf); +free (description); }else if (copy) {if (!argc)die (_ ("branch name required" ));
contrib/completion/git-completion.bash +2 -2
@@ -1203,8 +1203,8 @@ _git_branch () __gitcomp " --color --no-color --verbose --abbrev= --no-abbrev --track --no-track --contains --no-contains --merged --no-merged - --set-upstream-to= --edit-description --list - --unset-upstream --delete --move --copy --remotes + --set-upstream-to= --edit-description --show-description + --list --unset-upstream --delete --move --copy --remotes --column --no-column --sort= --points-at " ;;
t/t3200-branch.sh +23 -0
@@ -1239,6 +1239,29 @@ test_expect_success 'refuse --edit-description on unborn branch for now' ' test_must_fail env EDITOR=./editor git branch --edit-description ' +test_expect_success '--show-description' ' + echo "New contents" >expect && + git branch --show-description >actual && + test_cmp expect actual +' + +test_expect_success '--show-description on detached HEAD' ' + git checkout --detach && + test_when_finished git checkout master && + test_must_fail git branch --show-description +' + +test_expect_success '--show-description with no description errors quietly' ' + git config --unset branch.master.description && + test_must_fail git branch --show-description >actual 2>actual.err && + test_must_be_empty actual && + test_must_be_empty actual.err +' + +test_expect_success '--show-description on non-existing branch' ' + test_must_fail git branch --show-description no-such-branch +' + test_expect_success '--merged catches invalid object names' ' test_must_fail git branch --merged 0000000000000000000000000000000000000000 '
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7
Quoted 10 lines · SZEDER Gábor
'git branch' has an option to edit a branch's description, but lacks the option to show that description.
Therefore, add a new '--show-description' option to do just that, as a more user-friendly alternative to 'git config --get branch.$branchname.description':
[...]
- errors out with a proper error message when the given branch doesn't exist (but exits quietly with an error code when the branch does exit but has no description, just like the 'git config'
s/exit/exist/
Quoted 6 lines
query does).
Signed-off-by SZEDER Gábor <[email protected]>---
builtin/branch.c int cmd_branch(int argc, const char **argv, const char *prefix) · line 750
Quoted 10 lines
builtin/branch.c +10
-0@@ -737,6 +741,35 @@ int cmd_branch(int argc, const char **argv, const char *prefix) + }else if (show_description) { + [...] +if (!argc) { +if (filter.detached) +die (_ ("cannot show description on detached HEAD" )); + branch_name = head; + }else if (argc ==1 ) + branch_name = argv[0 ]; +else +die (_ ("cannot show description of more than one branch" ));
Aside from paralleling the single branch accepted by --edit-description, why this limitation? (Just curious; I don't feel strongly one way or the other.)
Quoted 3 lines · Eric Sunshine
On Mon, Jan 1, 2018 at 5:54 PM, SZEDER Gábor <[email protected]> wrote:
s/exit/exist/
Thanks.
Quoted 12 lines
Quoted 12 lines
query does).
Signed-off-by SZEDER Gábor <[email protected]>---
builtin/branch.c +6
-0@@ -737,6 +741,35 @@ int cmd_branch(int argc, const char **argv, const char *prefix) + }else if (show_description) { + [...] +if (!argc) { +if (filter.detached) +die (_ ("cannot show description on detached HEAD" )); + branch_name = head;
Quoted 8 lines
builtin/branch.c int cmd_branch(int argc, const char **argv, const char *prefix) · line 756
Quoted 4 lines
builtin/branch.c +4
-0+ }else if (argc ==1 ) + branch_name = argv[0 ]; +else +die (_ ("cannot show description of more than one branch" ));Aside from paralleling the single branch accepted by --edit-description, why this limitation? (Just curious; I don't feel strongly one way or the other.)
It's not just '--edit-description', most other options won't accept multiple branches either. As far as I can tell only deleting branches can deal with multiple branches in one go.
Furthermore, branch descriptions are likely more lines long, so we can't just dump them one after the other, but we we would have to separate the descriptions of different branches in the output. Considering that 'git branch' mostly works only with a single branch at a time, I didn't feel the need to do so.
Gábor
Am 01.01.2018 um 23:54 schrieb SZEDER Gábor:
Quoted 17 lines
'git branch' has an option to edit a branch's description, but lacks the option to show that description.
Therefore, add a new '--show-description' option to do just that, as a more user-friendly alternative to 'git config --get branch.$branchname.description':
- it's shorter to type (both in the number of characters and the number of TABs if using completion),
- works on the current branch without explicitly naming it,
- hides the implementation detail that branch descriptions are stored in the config file, and
- errors out with a proper error message when the given branch doesn't exist (but exits quietly with an error code when the branch does exit but has no description, just like the 'git config' query does).
t/t3200-branch.sh test_expect_success 'refuse --edit-description on unborn branch for now' ' · line 1259
Quoted 6 lines
t/t3200-branch.sh +6
-0+test_expect_success '--show-description with no description errors quietly' ' + git config --unset branch.master.description && + test_must_fail git branch --show-description >actual 2>actual.err && + test_must_be_empty actual && + test_must_be_empty actual.err +'
Checking the exact contents of stderr typically fails when tests are run under -x. Perhaps
test_i18ngrep ! "fatal: " actual.err &&" test_i18ngrep ! "error: " actual.err && test_i18ngrep ! "warning: " actual.err
Which makes me wonder: Why would --show-description have to error out silently? This is not 'git config' after all.
-- Hannes
Quoted 21 lines · Johannes Sixt
Am 01.01.2018 um 23:54 schrieb SZEDER Gábor:
Quoted 11 lines
- errors out with a proper error message when the given branch doesn't exist (but exits quietly with an error code when the branch does exit but has no description, just like the 'git config' query does).
+test_expect_success '--show-description with no description errors quietly' '
(quoted diff) +2
-0+ git config --unset branch.master.description && + test_must_fail git branch --show-description >actual 2>actual.err&&
t/t3200-branch.sh test_expect_success 'refuse --edit-description on unborn branch for now' ' · line 1259
Quoted 3 lines
t/t3200-branch.sh +3
-0+ test_must_be_empty actual && + test_must_be_empty actual.err +'Checking the exact contents of stderr typically fails when tests are run under -x. Perhaps
Quoted 6 lines
test_i18ngrep ! "fatal: " actual.err &&" test_i18ngrep ! "error: " actual.err && test_i18ngrep ! "warning: " actual.errWhich makes me wonder: Why would --show-description have to error out silently? This is not 'git config' after all.
I figured it would be beneficial if it were a drop-in replacement for the original 'git config' query.
I don't have a strong opinion about this, and certainly wouldn't mind adding an error message instead.
Gábor
Quoted 5 lines · Johannes Sixt
Quoted 2 lines
Which makes me wonder: Why would --show-description have to error out silently? This is not 'git config' after all.
I don't have a strong opinion about this, and certainly wouldn't mind adding an error message instead.
And it would look like this:
-- >8 --
Subject: [PATCH 4/4] branch: add '--show-description' option
'git branch' has an option to edit a branch's description, but lacks the option to show that description.
Therefore, add a new '--show-description' option to do just that, as a more user-friendly alternative to 'git config --get branch.$branchname.description':
- it's shorter to type (both in the number of characters and the number of TABs if using completion),
- works on the current branch without explicitly naming it,
- hides the implementation detail that branch descriptions are stored in the config file, and
- errors out with a proper error message when the given branch doesn't exist or has no description.
--- Documentation/git-branch.txt | 6 +++++- builtin/branch.c | 39 +++++++++++++++++++++++++++++++--- contrib/completion/git-completion.bash | 4 ++-- t/t3200-branch.sh | 21 ++++++++++++++++++ 4 files changed, 64 insertions(+), 6 deletions(-)
Documentation/git-branch.txt +5 -1
@@ -20,7 +20,7 @@ SYNOPSIS 'git branch' (-m | -M) [<oldbranch>] <newbranch> 'git branch' (-c | -C) [<oldbranch>] <newbranch> 'git branch' (-d | -D) [-r] <branchname>... -'git branch' --edit-description [<branchname>] +'git branch' (--edit-description | --show-description) [<branchname>] DESCRIPTION -----------
@@ -226,6 +226,10 @@ start-point is either a local or remote-tracking branch. `request-pull`, and `merge` (if enabled)). Multi-line explanations may be used. +--show-description:: + Show the description of the branch previously set using + `--edit-description`. + --contains [<commit>]:: Only list branches which contain the specified commit (HEAD if not specified). Implies `--list`.
builtin/branch.c +36 -3
@@ -573,7 +573,7 @@ static int edit_branch_description(const char *branch_name)int cmd_branch (int argc,const char **argv,const char *prefix) {int delete =0 , rename =0 , copy =0 , force =0 , list =0 ; -int reflog =0 , edit_description =0 ; +int reflog =0 , edit_description =0 , show_description =0 ;int quiet =0 , unset_upstream =0 ;const char *new_upstream =NULL ;enum branch_track track;
@@ -615,6 +615,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)OPT_BOOL ('l' ,"create-reflog" , &reflog,N_ ("create the branch's reflog" )),OPT_BOOL (0 ,"edit-description" , &edit_description,N_ ("edit the description for the branch" )), +OPT_BOOL (0 ,"show-description" , &show_description, +N_ ("show the description for the branch" )),OPT__FORCE (&force,N_ ("force creation, move/rename, deletion" )),OPT_MERGED (&filter,N_ ("print only branches that are merged" )), OPT_NO_MERGED(&filter, N_("print only branches that are not merged")),
@@ -654,7 +656,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix) argc =parse_options (argc, argv, prefix, options, builtin_branch_usage,0 ); -if (!delete && !rename && !copy && !edit_description && !new_upstream && !unset_upstream && argc ==0 ) +if (!delete && !rename && !copy && + !edit_description && !show_description && + !new_upstream && !unset_upstream && argc ==0 ) list =1 ; if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr ||
@@ -662,7 +666,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) list =1 ;if (!!delete + !!rename + !!copy + !!new_upstream + - list + unset_upstream + edit_description >1 ) + list + unset_upstream + edit_description + show_description >1 )usage_with_options (builtin_branch_usage, options);if (filter.abbrev ==-1 )
@@ -737,6 +741,35 @@ int cmd_branch(int argc, const char **argv, const char *prefix)if (edit_branch_description (branch_name))return 1 ; + }else if (show_description) { +const char *branch_name; +struct strbuf buf =STRBUF_INIT ; +char *description =NULL ; + +if (!argc) { +if (filter.detached) +die (_ ("cannot show description on detached HEAD" )); + branch_name = head; + }else if (argc ==1 ) + branch_name = argv[0 ]; +else +die (_ ("cannot show description of more than one branch" )); + +strbuf_addf (&buf,"refs/heads/%s" , branch_name); +if (!ref_exists (buf.buf)) { +strbuf_release (&buf); +return error (_ ("no branch named '%s'" ), branch_name); + } +strbuf_reset (&buf); + +strbuf_addf (&buf,"branch.%s.description" , branch_name); +if (git_config_get_string (buf.buf, &description)) { +strbuf_release (&buf); +return error (_ ("no description for branch '%s'" ), branch_name); + } +printf ("%s" , description); +strbuf_release (&buf); +free (description); }else if (copy) {if (!argc)die (_ ("branch name required" ));
contrib/completion/git-completion.bash +2 -2
@@ -1203,8 +1203,8 @@ _git_branch () __gitcomp " --color --no-color --verbose --abbrev= --no-abbrev --track --no-track --contains --no-contains --merged --no-merged - --set-upstream-to= --edit-description --list - --unset-upstream --delete --move --copy --remotes + --set-upstream-to= --edit-description --show-description + --list --unset-upstream --delete --move --copy --remotes --column --no-column --sort= --points-at " ;;
t/t3200-branch.sh +21 -0
@@ -1239,6 +1239,27 @@ test_expect_success 'refuse --edit-description on unborn branch for now' ' test_must_fail env EDITOR=./editor git branch --edit-description ' +test_expect_success '--show-description' ' + echo "New contents" >expect && + git branch --show-description >actual && + test_cmp expect actual +' + +test_expect_success '--show-description on detached HEAD' ' + git checkout --detach && + test_when_finished git checkout master && + test_must_fail git branch --show-description +' + +test_expect_success '--show-description with no description' ' + git config --unset branch.master.description && + test_must_fail git branch --show-description master +' + +test_expect_success '--show-description on non-existing branch' ' + test_must_fail git branch --show-description no-such-branch +' + test_expect_success '--merged catches invalid object names' ' test_must_fail git branch --merged 0000000000000000000000000000000000000000 '
Signature · 1 line
2.16.0.rc0.67.g3a46dbca7