Message ID | 20200508005357.223058-1-emilyshaffer@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4] bugreport: collect list of populated hooks | expand |
Emily Shaffer <emilyshaffer@google.com> writes: > diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh > index 2e73658a5c..ff317cce68 100755 > --- a/t/t0091-bugreport.sh > +++ b/t/t0091-bugreport.sh > @@ -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 Probably our mails crossed, but as I said in my response, this will make the hook say "hook exists" because $hook will be literally in the script file. EOF needs to be left unquoted, i.e. write_script ".git/hooks/$hook" <<-EOF || return 1 ... > + done && > + ... Thanks.
On 2020-05-07 17:53:57-0700, Emily Shaffer <emilyshaffer@google.com> wrote: > +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 Hi Emily, I think this is a bit more correct test. ---------8<---------- From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= <congdanhqx@gmail.com> Date: Fri, 8 May 2020 08:26:53 +0700 Subject: [PATCH] fixup! bugreport: collect list of populated hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use an exact match to check for populated hooks Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com> --- t/t0091-bugreport.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh index 9450cc02e3..789e8f1ac7 100755 --- a/t/t0091-bugreport.sh +++ b/t/t0091-bugreport.sh @@ -67,8 +67,13 @@ test_expect_success 'indicates populated hooks' ' EOF done && git bugreport -s hooks && - grep applypatch-msg git-bugreport-hooks.txt && - ! grep prepare-commit-msg git-bugreport-hooks.txt + cat <<-\EOF >expected && + applypatch-msg + + EOF + awk -F "]\\n" -v RS="[" "/applypatch-msg/{print \$2}" \ + git-bugreport-hooks.txt >actual && + test_cmp expected actual ' test_done
On Fri, May 08, 2020 at 08:34:05AM +0700, Đoàn Trần Công Danh wrote: > > On 2020-05-07 17:53:57-0700, Emily Shaffer <emilyshaffer@google.com> wrote: > > +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 > > Hi Emily, > > I think this is a bit more correct test. > ---------8<---------- > MIME-Version: 1.0 > Content-Type: text/plain; charset=UTF-8 > Content-Transfer-Encoding: 8bit > > Use an exact match to check for populated hooks > > Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com> > --- > t/t0091-bugreport.sh | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh > index 9450cc02e3..789e8f1ac7 100755 > --- a/t/t0091-bugreport.sh > +++ b/t/t0091-bugreport.sh > @@ -67,8 +67,13 @@ test_expect_success 'indicates populated hooks' ' > EOF > done && > git bugreport -s hooks && > - grep applypatch-msg git-bugreport-hooks.txt && > - ! grep prepare-commit-msg git-bugreport-hooks.txt > + cat <<-\EOF >expected && > + applypatch-msg > + > + EOF > + awk -F "]\\n" -v RS="[" "/applypatch-msg/{print \$2}" \ > + git-bugreport-hooks.txt >actual && If I understand correctly, you are saying "look for a line like [...] which is followed by a line that says 'applypatch-msg'" - that is, making sure that you don't see some false positive should "applypatch-msg" exist in the rest of the bugreport. Could we compromise and grep for "^applypatch-msg$", e.g. "there is a line calling out applypatch-msg in some way that isn't in the context of the report template"? - Even though regex magic is used, ^$ are beginner regex that many people can understand easily. - Using grep for a single line means we are not allergic to header format changes later on It doesn't search for false positives, true, but I found your awk suggestion hard to understand - my impression is that awk is less commonly understood, even among Git contributors. In sed, it's a little bit more readable: cat <<-\EOF >expected && [Enabled Hooks] applypatch-msg EOF sed -n '/\[Enabled Hooks\]/, /^$/ p' git-bugreport-hooks.txt >actual test_cmp expected actual But, I don't like this because it relies on the name of the header, and the newline spacing between sections - and would be nontrivial to change if we decided to underline headers instead, or add a newline between a header and its contents. So I think it may be overkill. Thanks for your suggestion, though. - Emily
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 acacca8fef..aa8a489c35 100644 --- a/bugreport.c +++ b/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); diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh index 2e73658a5c..ff317cce68 100755 --- a/t/t0091-bugreport.sh +++ b/t/t0091-bugreport.sh @@ -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
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> --- Since v3, squashed Junio's suggestion (https://lore.kernel.org/git/xmqqwo5wpqvg.fsf@gitster.c.googlers.com) but kept the test_when_finished cleanup lines to try to avoid leaving junk for later tests. CI: https://github.com/nasamuffin/git/actions/runs/98568890, which seems like it might be flaky. Have failed a couple because of downloads timing out... but I'm on top of next from a while ago, so I might be missing some extra Actions topics? - Emily Documentation/git-bugreport.txt | 1 + bugreport.c | 52 +++++++++++++++++++++++++++++++++ t/t0091-bugreport.sh | 15 ++++++++++ 3 files changed, 68 insertions(+)