{"thread":{"id":"24517","subject":"[PATCH v3 0/7] Detailed test coverage reports for Git","startedAt":"2010-07-25T19:52:38Z","lastAt":"2010-07-26T11:43:02Z","messageCount":10,"participants":["Ævar Arnfjörð Bjarmason","Thomas Rast"],"isPatch":true,"patchVersion":3,"patchTotal":7},"messages":[{"id":"146318","messageId":"1280087565-24671-1-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":null,"subject":"[PATCH v3 0/7] Detailed test coverage reports for Git","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:38Z","receivedAt":"2010-07-25T19:52:38Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Here's v3 of the patch. It's almost entirely changes from Jonathan\nNieder mentioned in the review for v2 (minus the bugs). Thanks\nJonathan!\n\nHere's the stat from v2:\n   \n    .gitignore |   12 ++++++------\n    Makefile   |   15 ++++++++++-----\n    t/README   |    8 ++++----\n    3 files changed, 20 insertions(+), 15 deletions(-)\n   \nAnd the diff:\n    \n    diff --git a/.gitignore b/.gitignore\n    index baed247..0a30a7e 100644\n    --- a/.gitignore\n    +++ b/.gitignore\n    @@ -183,0 +184,6 @@\n    +*.gcda\n    +*.gcno\n    +*.gcov\n    +/coverage-untested-functions\n    +/cover_db/\n    +/cover_db_html/\n    @@ -207,6 +212,0 @@\n    -*.gcda\n    -*.gcno\n    -*.gcov\n    -/coverage-untested-functions\n    -/cover_db\n    -/cover_db_html\n    diff --git a/Makefile b/Makefile\n    index b6975aa..fdfa4fe 100644\n    --- a/Makefile\n    +++ b/Makefile\n    @@ -1487,0 +1488 @@ ifndef V\n    +\tQUIET_GCOV     = @echo '   ' GCOV $@;\n    @@ -2287,0 +2289,3 @@ coverage-clean:\n    +\t$(RM) coverage-untested-functions\n    +\t$(RM) -r cover_db/\n    +\t$(RM) -r cover_db_html/\n    @@ -2290,0 +2295 @@ COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov\n    +GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks\n    @@ -2298,2 +2303,2 @@ coverage-report:\n    -\tfor dir in $(object_dirs); do \\\n    -\t\tgcov --preserve-paths --branch-probabilities --all-blocks --object-directory=$$dir $$dir*.c; \\\n    +\t$(QUIET_GCOV)for dir in $(object_dirs); do \\\n    +\t\tgcov $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \\\n    @@ -2305 +2310 @@ coverage-untested-functions: coverage-report\n    -\t\t| tee coverage-untested-functions\n    +\t\t> coverage-untested-functions\n    @@ -2307 +2312 @@ coverage-untested-functions: coverage-report\n    -coverage-report-cover-db: coverage-report\n    +cover_db: coverage-report\n    @@ -2310 +2315 @@ coverage-report-cover-db: coverage-report\n    -coverage-report-cover-db-html: coverage-report-cover-db\n    +cover_db_html: cover_db\n    diff --git a/t/README b/t/README\n    index 400e2da..4fe8d50 100644\n    --- a/t/README\n    +++ b/t/README\n    @@ -270 +270 @@ Do:\n    -    \n    +\n    @@ -534 +534 @@ directory):\n    -    \n    +\n    @@ -554 +554 @@ Devel::Cover module. To install it do:\n    -   \n    +\n    @@ -557 +557 @@ Then, at the top-level:\n    -    make coverage-report-cover-db-html\n    +    make cover_db_html\n    \nÆvar Arnfjörð Bjarmason (7):\n  gitignore: Ignore files generated by \"make coverage\"\n  Makefile: Include subdirectories in \"make cover\" reports\n  Makefile: Split out the untested functions target\n  Makefile: Add coverage-report-cover-db target\n  Makefile: Add coverage-report-cover-db-html target\n  t/README: A new section about test coverage\n  t/README: Add a note about the dangers of coverage chasing\n\n .gitignore |    6 ++++++\n Makefile   |   24 +++++++++++++++++++++---\n t/README   |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 78 insertions(+), 3 deletions(-)\n"},{"id":"146319","messageId":"1280087565-24671-2-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 1/7] gitignore: Ignore files generated by \"make coverage\"","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:39Z","receivedAt":"2010-07-25T19:52:39Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"The \"make coverage\" support added by Thomas Rast in 901c369af5 didn't\ncontain a corresponding patch to patch .gitignore.\n\nChange gitignore to ignore the *.gcda, *.gcno and *.gcov files\ngenerated by GCC and our coverage invocations.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n .gitignore |    4 ++++\n 1 files changed, 4 insertions(+), 0 deletions(-)\n\ndiff --git a/.gitignore b/.gitignore\nindex 14e2b6b..57f79ef 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -181,6 +181,10 @@\n *.[aos]\n *.py[co]\n .depend/\n+*.gcda\n+*.gcno\n+*.gcov\n+/coverage-untested-functions\n *+\n /config.mak\n /autom4te.cache\n-- \n1.7.0.4\n"},{"id":"146320","messageId":"1280087565-24671-3-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 2/7] Makefile: Include subdirectories in \"make cover\" reports","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:40Z","receivedAt":"2010-07-25T19:52:40Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"We generate profiling files in all the $(OBJECTS) dirs. Aggregate\nresults from there, and add them to the corresponding clean target.\n\nAlso expand the gcov arguments. Generate reports for things like \"x()\n|| y()\" using --all-blocks, and add --preserve-paths since we're\nprofiling in subdirectories now.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n Makefile |   14 +++++++++++---\n 1 files changed, 11 insertions(+), 3 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex bc3c570..b791ad5 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -1485,6 +1485,7 @@ ifndef V\n \tQUIET_BUILT_IN = @echo '   ' BUILTIN $@;\n \tQUIET_GEN      = @echo '   ' GEN $@;\n \tQUIET_LNCP     = @echo '   ' LN/CP $@;\n+\tQUIET_GCOV     = @echo '   ' GCOV $@;\n \tQUIET_SUBDIR0  = +@subdir=\n \tQUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \\\n \t\t\t $(MAKE) $(PRINT_DIR) -C $$subdir\n@@ -2280,11 +2281,16 @@ coverage:\n \t$(MAKE) coverage-build\n \t$(MAKE) coverage-report\n \n+object_dirs := $(sort $(dir $(OBJECTS)))\n coverage-clean:\n-\trm -f *.gcda *.gcno\n+\t$(RM) $(addsuffix *.gcov,$(object_dirs))\n+\t$(RM) $(addsuffix *.gcda,$(object_dirs))\n+\t$(RM) $(addsuffix *.gcno,$(object_dirs))\n+\t$(RM) coverage-untested-functions\n \n COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs\n COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov\n+GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks\n \n coverage-build: coverage-clean\n \t$(MAKE) CFLAGS=\"$(COVERAGE_CFLAGS)\" LDFLAGS=\"$(COVERAGE_LDFLAGS)\" all\n@@ -2292,7 +2298,9 @@ coverage-build: coverage-clean\n \t\t-j1 test\n \n coverage-report:\n-\tgcov -b *.c\n+\t$(QUIET_GCOV)for dir in $(object_dirs); do \\\n+\t\tgcov $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \\\n+\tdone\n \tgrep '^function.*called 0 ' *.c.gcov \\\n \t\t| sed -e 's/\\([^:]*\\)\\.gcov: *function \\([^ ]*\\) called.*/\\1: \\2/' \\\n-\t\t| tee coverage-untested-functions\n+\t\t> coverage-untested-functions\n-- \n1.7.0.4\n"},{"id":"146322","messageId":"1280087565-24671-4-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 3/7] Makefile: Split out the untested functions target","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:41Z","receivedAt":"2010-07-25T19:52:41Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Change the coverage-report target so that it doesn't generate the\ncoverage-untested-functions file by default. I'm adding more targets\nfor doing various things with the gcov files, and they shouldn't all\nrun by default.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n Makefile |    2 ++\n 1 files changed, 2 insertions(+), 0 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex b791ad5..40453f1 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -2301,6 +2301,8 @@ coverage-report:\n \t$(QUIET_GCOV)for dir in $(object_dirs); do \\\n \t\tgcov $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \\\n \tdone\n+\n+coverage-untested-functions: coverage-report\n \tgrep '^function.*called 0 ' *.c.gcov \\\n \t\t| sed -e 's/\\([^:]*\\)\\.gcov: *function \\([^ ]*\\) called.*/\\1: \\2/' \\\n \t\t> coverage-untested-functions\n-- \n1.7.0.4\n"},{"id":"146321","messageId":"1280087565-24671-5-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 4/7] Makefile: Add coverage-report-cover-db target","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:42Z","receivedAt":"2010-07-25T19:52:42Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Add a target to convert the *.gcov files to a Devel::Cover\ndatabase. That database can subsequently be formatted by the cover(1)\ntool which is included with Devel::Cover.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n .gitignore |    1 +\n Makefile   |    4 ++++\n 2 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/.gitignore b/.gitignore\nindex 57f79ef..d8bd555 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -185,6 +185,7 @@\n *.gcno\n *.gcov\n /coverage-untested-functions\n+/cover_db/\n *+\n /config.mak\n /autom4te.cache\ndiff --git a/Makefile b/Makefile\nindex 40453f1..1d721ef 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -2287,6 +2287,7 @@ coverage-clean:\n \t$(RM) $(addsuffix *.gcda,$(object_dirs))\n \t$(RM) $(addsuffix *.gcno,$(object_dirs))\n \t$(RM) coverage-untested-functions\n+\t$(RM) -r cover_db/\n \n COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs\n COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov\n@@ -2306,3 +2307,6 @@ coverage-untested-functions: coverage-report\n \tgrep '^function.*called 0 ' *.c.gcov \\\n \t\t| sed -e 's/\\([^:]*\\)\\.gcov: *function \\([^ ]*\\) called.*/\\1: \\2/' \\\n \t\t> coverage-untested-functions\n+\n+cover_db: coverage-report\n+\tgcov2perl -db cover_db *.gcov\n-- \n1.7.0.4\n"},{"id":"146323","messageId":"1280087565-24671-6-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 5/7] Makefile: Add coverage-report-cover-db-html target","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:43Z","receivedAt":"2010-07-25T19:52:43Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Add a target to generate a detailed HTML report for the entire Git\ncodebase using Devel::Cover's cover(1) tool. Output it in\ncover_db_html instead of the default cover_db, so that it isn't mixed\nup with our raw report files.\n\nThe target depends on the coverage-report-cover-db target, it may be\nrun redundantly if it was previously run. But the HTML output won't be\naffected by running gcov2perl twice, so I didn't try to avoid that\nsmall redundancy.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n .gitignore |    1 +\n Makefile   |    4 ++++\n 2 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/.gitignore b/.gitignore\nindex d8bd555..0a30a7e 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -186,6 +186,7 @@\n *.gcov\n /coverage-untested-functions\n /cover_db/\n+/cover_db_html/\n *+\n /config.mak\n /autom4te.cache\ndiff --git a/Makefile b/Makefile\nindex 1d721ef..fdfa4fe 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -2288,6 +2288,7 @@ coverage-clean:\n \t$(RM) $(addsuffix *.gcno,$(object_dirs))\n \t$(RM) coverage-untested-functions\n \t$(RM) -r cover_db/\n+\t$(RM) -r cover_db_html/\n \n COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs\n COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov\n@@ -2310,3 +2311,6 @@ coverage-untested-functions: coverage-report\n \n cover_db: coverage-report\n \tgcov2perl -db cover_db *.gcov\n+\n+cover_db_html: cover_db\n+\tcover -report html -outputdir cover_db_html cover_db\n-- \n1.7.0.4\n"},{"id":"146325","messageId":"1280087565-24671-7-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 6/7] t/README: A new section about test coverage","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:44Z","receivedAt":"2010-07-25T19:52:44Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Document how test writers can generate coverage reports, to ensure\nthat their tests are really testing the code they think they're\ntesting.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/README |   42 ++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 42 insertions(+), 0 deletions(-)\n\ndiff --git a/t/README b/t/README\nindex 0d1183c..15d4b52 100644\n--- a/t/README\n+++ b/t/README\n@@ -268,6 +268,9 @@ Do:\n \tgit push gh &&\n \ttest ...\n \n+ - Check the test coverage for your tests. See the \"Test coverage\"\n+   below.\n+\n Don't:\n \n  - exit() within a <script> part.\n@@ -508,3 +511,42 @@ the purpose of t0000-basic.sh, which is to isolate that level of\n validation in one place.  Your test also ends up needing\n updating when such a change to the internal happens, so do _not_\n do it and leave the low level of validation to t0000-basic.sh.\n+\n+Test coverage\n+-------------\n+\n+You can use the coverage tests to find code paths that are not being\n+used or properly exercised yet.\n+\n+To do that, run the coverage target at the top-level (not in the t/\n+directory):\n+\n+    make coverage\n+\n+That'll compile Git with GCC's coverage arguments, and generate a test\n+report with gcov after the tests finish. Running the coverage tests\n+can take a while, since running the tests in parallel is incompatible\n+with GCC's coverage mode.\n+\n+After the tests have run you can generate a list of untested\n+functions:\n+\n+    make coverage-untested-functions\n+\n+You can also generate a detailed per-file HTML report using the\n+Devel::Cover module. To install it do:\n+\n+   # On Debian or Ubuntu:\n+   sudo aptitude install libdevel-cover-perl\n+\n+   # From the CPAN with cpanminus\n+   curl -L http://cpanmin.us | perl - --sudo --self-upgrade\n+   cpanm --sudo Devel::Cover\n+\n+Then, at the top-level:\n+\n+    make cover_db_html\n+\n+That'll generate a detailed cover report in the \"cover_db_html\"\n+directory, which you can then copy to a webserver, or inspect locally\n+in a browser.\n-- \n1.7.0.4\n"},{"id":"146324","messageId":"1280087565-24671-8-git-send-email-avarab@gmail.com","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"[PATCH v3 7/7] t/README: Add a note about the dangers of coverage chasing","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-25T19:52:45Z","receivedAt":"2010-07-25T19:52:45Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Having no coverage at all is almost always a bad sign, but trying to\nattain 100% coverage everywhere is usually a waste of time. Add a\nparagraph to explain this to future test writers.\n\nInspired-by: Jonathan Nieder <jrnieder@gmail.com>\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n\nJonathan doesn't particularly like this one. I have no particular\npreference, just trying to get across the point that you shouldn't\ncargo-cult-coverage.\n\n t/README |    9 +++++++++\n 1 files changed, 9 insertions(+), 0 deletions(-)\n\ndiff --git a/t/README b/t/README\nindex 15d4b52..4fe8d50 100644\n--- a/t/README\n+++ b/t/README\n@@ -271,6 +271,15 @@ Do:\n  - Check the test coverage for your tests. See the \"Test coverage\"\n    below.\n \n+   Don't blindly follow test coverage metrics, they're a good way to\n+   spot if you've missed something. If a new function you added\n+   doesn't have any coverage you're probably doing something wrong,\n+   but having 100% coverage doesn't necessarily mean that you tested\n+   everything.\n+\n+   Tests that are likely to smoke out future regressions are better\n+   than tests that just inflate the coverage metrics.\n+\n Don't:\n \n  - exit() within a <script> part.\n-- \n1.7.0.4\n"},{"id":"146352","messageId":"201007260943.41703.trast@student.ethz.ch","threadId":"24517","inReplyTo":"1280087565-24671-1-git-send-email-avarab@gmail.com","subject":"Re: [PATCH v3 0/7] Detailed test coverage reports for Git","fromName":"Thomas Rast","fromEmail":"trast@student.ethz.ch","sentAt":"2010-07-26T07:43:41Z","receivedAt":"2010-07-26T07:43:41Z","isPatch":true,"sender":{"key":"tr@thomasrast.ch","avatar":"https://avatars.githubusercontent.com/u/153510?v=4"},"body":"Ævar Arnfjörð Bjarmason wrote:\n> Ævar Arnfjörð Bjarmason (7):\n>   gitignore: Ignore files generated by \"make coverage\"\n>   Makefile: Include subdirectories in \"make cover\" reports\n>   Makefile: Split out the untested functions target\n>   Makefile: Add coverage-report-cover-db target\n>   Makefile: Add coverage-report-cover-db-html target\n>   t/README: A new section about test coverage\n>   t/README: Add a note about the dangers of coverage chasing\n\nThanks a lot for shaping this up!  I need the little patch below to\naccommodate my addiction for a newer compiler than the one standard\nfor my distribution (but that was an issue before, too).  It works\nvery well, and the HTML output is quite nice.\n\nAcked-by: Thomas Rast <trast@{inf,student}.ethz.ch>\n\n-- 8< --\nSubject: [PATCH] Makefile: make gcov invocation configurable\n\nIf you customize CC to use a different version of gcc, most likely you\nalso need to use a different version of gcov.  Make it configurable.\n\nSigned-off-by: Thomas Rast <trast@student.ethz.ch>\n---\n Makefile |    3 ++-\n 1 files changed, 2 insertions(+), 1 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex fdfa4fe..81cb5ac 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -308,6 +308,7 @@ TCL_PATH = tclsh\n TCLTK_PATH = wish\n PTHREAD_LIBS = -lpthread\n PTHREAD_CFLAGS =\n+GCOV = gcov\n \n export TCL_PATH TCLTK_PATH\n \n@@ -2301,7 +2302,7 @@ coverage-build: coverage-clean\n \n coverage-report:\n \t$(QUIET_GCOV)for dir in $(object_dirs); do \\\n-\t\tgcov $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \\\n+\t\t$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \\\n \tdone\n \n coverage-untested-functions: coverage-report\n-- \n1.7.2.289.g93c76\n"},{"id":"146368","messageId":"AANLkTimE8TaAmdcQuG1WWouaJcRYVApF_qca220bVn8F@mail.gmail.com","threadId":"24517","inReplyTo":"201007260943.41703.trast@student.ethz.ch","subject":"Re: [PATCH v3 0/7] Detailed test coverage reports for Git","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-26T11:43:02Z","receivedAt":"2010-07-26T11:43:02Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"On Mon, Jul 26, 2010 at 07:43, Thomas Rast <trast@student.ethz.ch> wrote:\n> Ævar Arnfjörð Bjarmason wrote:\n>> Ævar Arnfjörð Bjarmason (7):\n>>   gitignore: Ignore files generated by \"make coverage\"\n>>   Makefile: Include subdirectories in \"make cover\" reports\n>>   Makefile: Split out the untested functions target\n>>   Makefile: Add coverage-report-cover-db target\n>>   Makefile: Add coverage-report-cover-db-html target\n>>   t/README: A new section about test coverage\n>>   t/README: Add a note about the dangers of coverage chasing\n>\n> Thanks a lot for shaping this up!  I need the little patch below to\n> accommodate my addiction for a newer compiler than the one standard\n> for my distribution (but that was an issue before, too).  It works\n> very well, and the HTML output is quite nice.\n\nThanks for the fixup. I ack that right back at you. Looks good.\n"}]}