branch: implement '--format' option
Implement the '--format' option provided by 'ref-filter'. This lets the user list branches as per desired format similar to the implementation in 'git for-each-ref'. Add tests and documentation for the same. Mentored-by: Christian Couder <christian.couder@gmail.com> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
949af0684c
commit
3d9e4ce3eb
@ -12,7 +12,7 @@ SYNOPSIS
|
|||||||
[--list] [-v [--abbrev=<length> | --no-abbrev]]
|
[--list] [-v [--abbrev=<length> | --no-abbrev]]
|
||||||
[--column[=<options>] | --no-column]
|
[--column[=<options>] | --no-column]
|
||||||
[(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
|
[(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
|
||||||
[--points-at <object>] [<pattern>...]
|
[--points-at <object>] [--format=<format>] [<pattern>...]
|
||||||
'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
|
'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
|
||||||
'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
|
'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
|
||||||
'git branch' --unset-upstream [<branchname>]
|
'git branch' --unset-upstream [<branchname>]
|
||||||
@ -250,6 +250,11 @@ start-point is either a local or remote-tracking branch.
|
|||||||
--points-at <object>::
|
--points-at <object>::
|
||||||
Only list branches of the given object.
|
Only list branches of the given object.
|
||||||
|
|
||||||
|
--format <format>::
|
||||||
|
A string that interpolates `%(fieldname)` from the object
|
||||||
|
pointed at by a ref being shown. The format is the same as
|
||||||
|
that of linkgit:git-for-each-ref[1].
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ static const char * const builtin_branch_usage[] = {
|
|||||||
N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."),
|
N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."),
|
||||||
N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"),
|
N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"),
|
||||||
N_("git branch [<options>] [-r | -a] [--points-at]"),
|
N_("git branch [<options>] [-r | -a] [--points-at]"),
|
||||||
|
N_("git branch [<options>] [-r | -a] [--format]"),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -364,14 +365,14 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r
|
|||||||
return strbuf_detach(&fmt, NULL);
|
return strbuf_detach(&fmt, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting)
|
static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct ref_array array;
|
struct ref_array array;
|
||||||
int maxwidth = 0;
|
int maxwidth = 0;
|
||||||
const char *remote_prefix = "";
|
const char *remote_prefix = "";
|
||||||
struct strbuf out = STRBUF_INIT;
|
struct strbuf out = STRBUF_INIT;
|
||||||
char *format;
|
char *to_free = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are listing more than just remote branches,
|
* If we are listing more than just remote branches,
|
||||||
@ -388,7 +389,8 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
|
|||||||
if (filter->verbose)
|
if (filter->verbose)
|
||||||
maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
|
maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
|
||||||
|
|
||||||
format = build_format(filter, maxwidth, remote_prefix);
|
if (!format)
|
||||||
|
format = to_free = build_format(filter, maxwidth, remote_prefix);
|
||||||
verify_ref_format(format);
|
verify_ref_format(format);
|
||||||
|
|
||||||
ref_array_sort(sorting, &array);
|
ref_array_sort(sorting, &array);
|
||||||
@ -407,7 +409,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
|
|||||||
}
|
}
|
||||||
|
|
||||||
ref_array_clear(&array);
|
ref_array_clear(&array);
|
||||||
free(format);
|
free(to_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reject_rebase_or_bisect_branch(const char *target)
|
static void reject_rebase_or_bisect_branch(const char *target)
|
||||||
@ -528,6 +530,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
|||||||
struct ref_filter filter;
|
struct ref_filter filter;
|
||||||
int icase = 0;
|
int icase = 0;
|
||||||
static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
|
static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
|
||||||
|
const char *format = NULL;
|
||||||
|
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT_GROUP(N_("Generic options")),
|
OPT_GROUP(N_("Generic options")),
|
||||||
@ -569,6 +572,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
|||||||
N_("print only branches of the object"), 0, parse_opt_object_name
|
N_("print only branches of the object"), 0, parse_opt_object_name
|
||||||
},
|
},
|
||||||
OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
|
OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
|
||||||
|
OPT_STRING( 0 , "format", &format, N_("format"), N_("format to use for the output")),
|
||||||
OPT_END(),
|
OPT_END(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -641,7 +645,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
|||||||
if (!sorting)
|
if (!sorting)
|
||||||
sorting = ref_default_sorting();
|
sorting = ref_default_sorting();
|
||||||
sorting->ignore_case = icase;
|
sorting->ignore_case = icase;
|
||||||
print_ref_list(&filter, sorting);
|
print_ref_list(&filter, sorting, format);
|
||||||
print_columns(&output, colopts, NULL);
|
print_columns(&output, colopts, NULL);
|
||||||
string_list_clear(&output, 0);
|
string_list_clear(&output, 0);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -225,4 +225,18 @@ test_expect_success 'sort branches, ignore case' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git branch --format option' '
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
Refname is (HEAD detached from fromtag)
|
||||||
|
Refname is refs/heads/ambiguous
|
||||||
|
Refname is refs/heads/branch-one
|
||||||
|
Refname is refs/heads/branch-two
|
||||||
|
Refname is refs/heads/master
|
||||||
|
Refname is refs/heads/ref-to-branch
|
||||||
|
Refname is refs/heads/ref-to-remote
|
||||||
|
EOF
|
||||||
|
git branch --format="Refname is %(refname)" >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user