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>
Derrick Stolee committedApr 16, 2020 at 14:15 UTCa6be5e6764aabd4b418f7f365254518ec44c38d8
6 files changed+93-11
Documentation/config/log.txt
+6
index e9e1e397f3..208d5fdcaa 100644--- a/Documentation/config/log.txt+++ b/Documentation/config/log.txt@@ -18,6 +18,12 @@ log.decorate:: names are shown. This is the same as the `--decorate` option of the `git log`.+log.excludeDecoration::+ Exclude the specified patterns from the log decorations. This is+ similar to the `--decorate-refs-exclude` command-line option, but+ the config option can be overridden by the `--decorate-refs`+ option.+ log.follow:: If `true`, `git log` will act as if the `--follow` option was used when a single <path> is given. This has the same limitations as `--follow`,
Documentation/git-log.txt
+4-1
index bed09bb09e..17592234ba 100644--- a/Documentation/git-log.txt+++ b/Documentation/git-log.txt@@ -43,7 +43,10 @@ OPTIONS If no `--decorate-refs` is given, pretend as if all refs were included. For each candidate, do not use it for decoration if it matches any patterns given to `--decorate-refs-exclude` or if it- doesn't match any of the patterns given to `--decorate-refs`.+ doesn't match any of the patterns given to `--decorate-refs`. The+ `log.excludeDecoration` config option allows excluding refs from+ the decorations, but an explicit `--decorate-refs` pattern will+ override a match in `log.excludeDecoration`. --source:: Print out the ref name given on the command line by which each