git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] bugreport: collect list of populated hooks

From
Emily Shaffer <emilyshaffer@google.com>
Date
Apr 24, 2020, 23:38 UTC
Message-ID
<20200424233800.200439-1-emilyshaffer@google.com>

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. To reduce the amount of code humans need to read, we turn the list into a string_list and iterate over it (as we are calling the same find_hook operation on each string). However, since bugreport should primarily be called by the user, the performance loss from massaging the string seems acceptable.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
---
Based on es/bugreport.
 Documentation/git-bugreport.txt |  1 +
 bugreport.c                     | 52 +++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
diff --git a/Documentation/git-bugreport.txt b/Documentation/git-bugreport.txt
index 643d1b2884..7fe9aef34e 100644
--- a/Documentation/git-bugreport.txt
+++ b/Documentation/git-bugreport.txt
@@ -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
diff --git a/bugreport.c b/bugreport.c
index 089b939a87..ce32145bce 100644
--- a/bugreport.c
+++ b/bugreport.c
@@ -5,6 +5,8 @@
 #include "time.h"
 #include "help.h"
 #include "compat/compiler.h"
+#include "run-command.h"
+
 
 static void get_system_info(struct strbuf *sys_info)
 {
@@ -33,6 +35,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)
+	 */
+	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
@@ -116,6 +165,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);
 
-- 
2.26.2.303.gf8c07b1a785-goog
Next: Jonathan Nieder
Message 1 of 33 in “bugreport: collect list of populated hooks”
  1. bugreport: collect list of populated hooksEmily Shaffer, Apr 24, 2020
  2. Jonathan NiederApr 25, 2020
  3. bugreport: drop time.h includeEmily Shaffer, Apr 27, 2020
  4. Jonathan NiederApr 27, 2020
  5. Junio C HamanoApr 27, 2020
  6. Junio C HamanoApr 27, 2020
  7. Emily ShafferApr 27, 2020
  8. Junio C HamanoApr 27, 2020
  9. bugreport: drop extraneous includesEmily Shaffer, Apr 27, 2020
  10. Jonathan NiederApr 27, 2020
  11. Junio C HamanoApr 25, 2020
  12. Emily ShafferApr 27, 2020
  13. Junio C HamanoApr 27, 2020
  14. Emily ShafferApr 27, 2020
  15. bugreport: collect list of populated hooksEmily Shaffer, Apr 27, 2020
  16. Jonathan NiederApr 27, 2020
  17. Junio C HamanoApr 28, 2020
  18. Emily ShafferApr 30, 2020
  19. bugreport: collect list of populated hooksEmily Shaffer, Apr 30, 2020
  20. Jonathan NiederApr 30, 2020
  21. Jonathan NiederApr 30, 2020
  22. Junio C HamanoApr 30, 2020
  23. Junio C HamanoApr 30, 2020
  24. Emily ShafferMay 7, 2020
  25. Junio C HamanoMay 7, 2020
  26. Emily ShafferMay 11, 2020
  27. bugreport: collect list of populated hooksEmily Shaffer, May 8, 2020
  28. Junio C HamanoMay 8, 2020
  29. Đoàn Trần Công DanhMay 8, 2020
  30. Emily ShafferMay 11, 2020
  31. bugreport: collect list of populated hooksEmily Shaffer, May 11, 2020
  32. Jonathan NiederMay 11, 2020
  33. Junio C HamanoMay 11, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.