branch: support configuring --sort via .gitconfig

Add support for configuring default sort ordering for git branches. Command
line option will override this configured value, using the exact same
syntax.

Signed-off-by: Samuel Maftoul <samuel.maftoul@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Samuel Maftoul 2018-08-16 11:35:08 +02:00 committed by Junio C Hamano
parent 63749b2dea
commit 560ae1c164
4 changed files with 64 additions and 3 deletions

View file

@ -1039,6 +1039,12 @@ branch.autoSetupRebase::
branch to track another branch. branch to track another branch.
This option defaults to never. This option defaults to never.
branch.sort::
This variable controls the sort ordering of branches when displayed by
linkgit:git-branch[1]. Without the "--sort=<value>" option provided, the
value of this variable will be used as the default.
See linkgit:git-for-each-ref[1] field names for valid values.
branch.<name>.remote:: branch.<name>.remote::
When on branch <name>, it tells 'git fetch' and 'git push' When on branch <name>, it tells 'git fetch' and 'git push'
which remote to fetch from/push to. The remote to push to which remote to fetch from/push to. The remote to push to

View file

@ -268,10 +268,11 @@ start-point is either a local or remote-tracking branch.
order of the value. You may use the --sort=<key> option order of the value. You may use the --sort=<key> option
multiple times, in which case the last key becomes the primary multiple times, in which case the last key becomes the primary
key. The keys supported are the same as those in `git key. The keys supported are the same as those in `git
for-each-ref`. Sort order defaults to sorting based on the for-each-ref`. Sort order defaults to the value configured for the
`branch.sort` variable if exists, or to sorting based on the
full refname (including `refs/...` prefix). This lists full refname (including `refs/...` prefix). This lists
detached HEAD (if present) first, then local branches and detached HEAD (if present) first, then local branches and
finally remote-tracking branches. finally remote-tracking branches. See linkgit:git-config[1].
--points-at <object>:: --points-at <object>::

View file

@ -74,6 +74,14 @@ define_list_config_array(color_branch_slots);
static int git_branch_config(const char *var, const char *value, void *cb) static int git_branch_config(const char *var, const char *value, void *cb)
{ {
const char *slot_name; const char *slot_name;
struct ref_sorting **sorting_tail = (struct ref_sorting **)cb;
if (!strcmp(var, "branch.sort")) {
if (!value)
return config_error_nonbool(var);
parse_ref_sorting(sorting_tail, value);
return 0;
}
if (starts_with(var, "column.")) if (starts_with(var, "column."))
return git_column_config(var, value, "branch", &colopts); return git_column_config(var, value, "branch", &colopts);
@ -653,7 +661,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (argc == 2 && !strcmp(argv[1], "-h")) if (argc == 2 && !strcmp(argv[1], "-h"))
usage_with_options(builtin_branch_usage, options); usage_with_options(builtin_branch_usage, options);
git_config(git_branch_config, NULL); git_config(git_branch_config, sorting_tail);
track = git_branch_track; track = git_branch_track;

View file

@ -1305,4 +1305,50 @@ test_expect_success 'tracking with unexpected .fetch refspec' '
) )
' '
test_expect_success 'configured committerdate sort' '
git init sort &&
(
cd sort &&
git config branch.sort committerdate &&
test_commit initial &&
git checkout -b a &&
test_commit a &&
git checkout -b c &&
test_commit c &&
git checkout -b b &&
test_commit b &&
git branch >actual &&
cat >expect <<-\EOF &&
master
a
c
* b
EOF
test_cmp expect actual
)
'
test_expect_success 'option override configured sort' '
(
cd sort &&
git config branch.sort committerdate &&
git branch --sort=refname >actual &&
cat >expect <<-\EOF &&
a
* b
c
master
EOF
test_cmp expect actual
)
'
test_expect_success 'invalid sort parameter in configuration' '
(
cd sort &&
git config branch.sort "v:notvalid" &&
test_must_fail git branch
)
'
test_done test_done