]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bugreport: collect list of populated hooks
authorEmily Shaffer <emilyshaffer@google.com>
Fri, 8 May 2020 00:53:57 +0000 (17:53 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 8 May 2020 01:25:04 +0000 (18:25 -0700)
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>
Documentation/git-bugreport.txt
bugreport.c
t/t0091-bugreport.sh

index 643d1b288420f628592b81f634afc3deeeaa1855..7fe9aef34ea86ae0a5e1d273eb0f5a4c5a3e9066 100644 (file)
@@ -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
index acacca8fef0f0c02581903693a947c04e97597c6..aa8a489c35e8f48799e6e3e3d39e585724c89c3d 100644 (file)
@@ -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);
 
index 2e73658a5cda238fb7d2f2aa20e58d7afac26050..526304ff95b3e91e7db69f823bfc0e173b4e0764 100755 (executable)
@@ -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