diff options
author | Derrick Stolee <dstolee@microsoft.com> | 2020-04-16 14:15:49 +0000 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-04-16 11:05:48 -0700 |
commit | a6be5e6764aabd4b418f7f365254518ec44c38d8 (patch) | |
tree | e0ecbbbcda740dd377ffc1ead118b782a36c7e4b /log-tree.c | |
parent | c9f7a793e81f517593383768ec8839dac85368c4 (diff) | |
download | git-a6be5e6764aabd4b418f7f365254518ec44c38d8.tar.gz |
log: add log.excludeDecoration config option
In 'git log', the --decorate-refs-exclude option appends a pattern
to a string_list. This list is used to prevent showing some refs
in the decoration output, or even by --simplify-by-decoration.
Users may want to use their refs space to store utility refs that
should not appear in the decoration output. For example, Scalar [1]
runs a background fetch but places the "new" refs inside the
refs/scalar/hidden/<remote>/* refspace instead of refs/<remote>/*
to avoid updating remote refs when the user is not looking. However,
these "hidden" refs appear during regular 'git log' queries.
A similar idea to use "hidden" refs is under consideration for core
Git [2].
Add the 'log.excludeDecoration' config option so users can exclude
some refs from decorations by default instead of needing to use
--decorate-refs-exclude manually. The config value is multi-valued
much like the command-line option. The documentation is careful to
point out that the config value can be overridden by the
--decorate-refs option, even though --decorate-refs-exclude would
always "win" over --decorate-refs.
Since the 'log.excludeDecoration' takes lower precedence to
--decorate-refs, and --decorate-refs-exclude takes higher
precedence, the struct decoration_filter needed another field.
This led also to new logic in load_ref_decorations() and
ref_filter_match().
There are several tests in t4202-log.sh that test the
--decorate-refs-(include|exclude) options, so these are extended.
Since the expected output is already stored as a file, most tests
could simply replace a "--decorate-refs-exclude" option with an
in-line config setting. Other tests involve the precedence of
the config option compared to command-line options and needed more
modification.
[1] https://github.com/microsoft/scalar
[2] https://lore.kernel.org/git/77b1da5d3063a2404cd750adfe3bb8be9b6c497d.1585946894.git.gitgitgadget@gmail.com/
Helped-by: Junio C Hamano <gister@pobox.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'log-tree.c')
-rw-r--r-- | log-tree.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/log-tree.c b/log-tree.c index fa6af69da3..1cfd345861 100644 --- a/log-tree.c +++ b/log-tree.c @@ -103,6 +103,8 @@ static int ref_filter_match(const char *refname, struct string_list_item *item; const struct string_list *exclude_patterns = filter->exclude_ref_pattern; const struct string_list *include_patterns = filter->include_ref_pattern; + const struct string_list *exclude_patterns_config = + filter->exclude_ref_config_pattern; if (exclude_patterns && exclude_patterns->nr) { for_each_string_list_item(item, exclude_patterns) { @@ -112,17 +114,20 @@ static int ref_filter_match(const char *refname, } if (include_patterns && include_patterns->nr) { - int found = 0; for_each_string_list_item(item, include_patterns) { - if (match_ref_pattern(refname, item)) { - found = 1; - break; - } + if (match_ref_pattern(refname, item)) + return 1; } + return 0; + } - if (!found) - return 0; + if (exclude_patterns_config && exclude_patterns_config->nr) { + for_each_string_list_item(item, exclude_patterns_config) { + if (match_ref_pattern(refname, item)) + return 0; + } } + return 1; } @@ -198,6 +203,9 @@ void load_ref_decorations(struct decoration_filter *filter, int flags) for_each_string_list_item(item, filter->include_ref_pattern) { normalize_glob_ref(item, NULL, item->string); } + for_each_string_list_item(item, filter->exclude_ref_config_pattern) { + normalize_glob_ref(item, NULL, item->string); + } } decoration_loaded = 1; decoration_flags = flags; |