mirror of
https://github.com/git/git.git
synced 2024-11-28 04:23:30 +08:00
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:
parent
8f0e9843bd
commit
788a776069
@ -28,6 +28,7 @@ The following information is captured automatically:
|
||||
- 'git version --build-options'
|
||||
- uname sysname, release, version, and machine strings
|
||||
- Compiler-specific info string
|
||||
- A list of enabled hooks
|
||||
|
||||
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
|
||||
|
52
bugreport.c
52
bugreport.c
@ -3,6 +3,8 @@
|
||||
#include "strbuf.h"
|
||||
#include "help.h"
|
||||
#include "compat/compiler.h"
|
||||
#include "run-command.h"
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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[] = {
|
||||
N_("git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"),
|
||||
NULL
|
||||
@ -114,6 +163,9 @@ int cmd_main(int argc, const char **argv)
|
||||
get_header(&buffer, _("System Info"));
|
||||
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. */
|
||||
report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);
|
||||
|
||||
|
@ -57,5 +57,20 @@ test_expect_success 'can create leading directories outside of a git dir' '
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user