bugreport: collect list of populated hooks

Occasionally a failure a user is seeing may be related to a specific
hook which is being run, perhaps without the user realizing. While the
contents of hooks can be sensitive - containing user data or process
information specific to the user's organization - simply knowing that a
hook is being run at a certain stage can help us to understand whether
something is going wrong.

Without a definitive list of hook names within the code, we compile our
own list from the documentation. This is likely prone to bitrot, but
designing a single source of truth for acceptable hooks is too much
overhead for this small change to the bugreport tool.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Emily Shaffer 2020-05-07 17:53:57 -07:00 committed by Junio C Hamano
parent 8f0e9843bd
commit 788a776069
3 changed files with 68 additions and 0 deletions

View File

@ -28,6 +28,7 @@ The following information is captured automatically:
- 'git version --build-options' - 'git version --build-options'
- uname sysname, release, version, and machine strings - uname sysname, release, version, and machine strings
- Compiler-specific info string - Compiler-specific info string
- A list of enabled hooks
This tool is invoked via the typical Git setup process, which means that in some This tool is invoked via the typical Git setup process, which means that in some
cases, it might not be able to launch - for example, if a relevant config file cases, it might not be able to launch - for example, if a relevant config file

View File

@ -3,6 +3,8 @@
#include "strbuf.h" #include "strbuf.h"
#include "help.h" #include "help.h"
#include "compat/compiler.h" #include "compat/compiler.h"
#include "run-command.h"
static void get_system_info(struct strbuf *sys_info) static void get_system_info(struct strbuf *sys_info)
{ {
@ -31,6 +33,53 @@ static void get_system_info(struct strbuf *sys_info)
get_libc_info(sys_info); get_libc_info(sys_info);
} }
static void get_populated_hooks(struct strbuf *hook_info, int nongit)
{
/*
* NEEDSWORK: Doesn't look like there is a list of all possible hooks;
* so below is a transcription of `git help hooks`. Later, this should
* be replaced with some programmatically generated list (generated from
* doc or else taken from some library which tells us about all the
* hooks)
*/
static const char *hook[] = {
"applypatch-msg",
"pre-applypatch",
"post-applypatch",
"pre-commit",
"pre-merge-commit",
"prepare-commit-msg",
"commit-msg",
"post-commit",
"pre-rebase",
"post-checkout",
"post-merge",
"pre-push",
"pre-receive",
"update",
"post-receive",
"post-update",
"push-to-checkout",
"pre-auto-gc",
"post-rewrite",
"sendemail-validate",
"fsmonitor-watchman",
"p4-pre-submit",
"post-index-change",
};
int i;
if (nongit) {
strbuf_addstr(hook_info,
_("not run from a git repository - no hooks to show\n"));
return;
}
for (i = 0; i < ARRAY_SIZE(hook); i++)
if (find_hook(hook[i]))
strbuf_addf(hook_info, "%s\n", hook[i]);
}
static const char * const bugreport_usage[] = { static const char * const bugreport_usage[] = {
N_("git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"), N_("git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"),
NULL NULL
@ -114,6 +163,9 @@ int cmd_main(int argc, const char **argv)
get_header(&buffer, _("System Info")); get_header(&buffer, _("System Info"));
get_system_info(&buffer); get_system_info(&buffer);
get_header(&buffer, _("Enabled Hooks"));
get_populated_hooks(&buffer, nongit_ok);
/* fopen doesn't offer us an O_EXCL alternative, except with glibc. */ /* fopen doesn't offer us an O_EXCL alternative, except with glibc. */
report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666); report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);

View File

@ -57,5 +57,20 @@ test_expect_success 'can create leading directories outside of a git dir' '
nongit git bugreport -o foo/bar/baz nongit git bugreport -o foo/bar/baz
' '
test_expect_success 'indicates populated hooks' '
test_when_finished rm git-bugreport-hooks.txt &&
test_when_finished rm -fr .git/hooks &&
rm -fr .git/hooks &&
mkdir .git/hooks &&
for hook in applypatch-msg prepare-commit-msg.sample
do
write_script ".git/hooks/$hook" <<-EOF || return 1
echo "hook $hook exists"
EOF
done &&
git bugreport -s hooks &&
grep applypatch-msg git-bugreport-hooks.txt &&
! grep prepare-commit-msg git-bugreport-hooks.txt
'
test_done test_done