bugreport: gather git version and build info

Knowing which version of Git a user has and how it was built allows us
to more precisely pin down the circumstances when a certain issue
occurs, so teach bugreport how to tell us the same output as 'git
version --build-options'.

It's not ideal to directly call 'git version --build-options' because
that output goes to stdout. Instead, wrap the version string in a helper
within help.[ch] library, and call that helper from within the bugreport
library.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Emily Shaffer 2020-04-16 14:18:05 -07:00 committed by Junio C Hamano
parent 238b439d69
commit 617d57195a
4 changed files with 51 additions and 19 deletions

View File

@ -23,6 +23,10 @@ The following information is requested from the user:
- Expected behavior - Expected behavior
- Actual behavior - Actual behavior


The following information is captured automatically:

- 'git version --build-options'

This tool is invoked via the typical Git setup process, which means that in some 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 cases, it might not be able to launch - for example, if a relevant config file
is unreadable. In this kind of scenario, it may be helpful to manually gather is unreadable. In this kind of scenario, it may be helpful to manually gather

View File

@ -1,8 +1,17 @@
#include "builtin.h" #include "cache.h"
#include "parse-options.h" #include "parse-options.h"
#include "stdio.h" #include "stdio.h"
#include "strbuf.h" #include "strbuf.h"
#include "time.h" #include "time.h"
#include "help.h"

static void get_system_info(struct strbuf *sys_info)
{
/* get git version from native cmd */
strbuf_addstr(sys_info, _("git version:\n"));
get_version_info(sys_info, 1);
strbuf_complete_line(sys_info);
}


static const char * const bugreport_usage[] = { static const char * const bugreport_usage[] = {
N_("git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"), N_("git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"),
@ -32,6 +41,11 @@ static int get_bug_template(struct strbuf *template)
return 0; return 0;
} }


static void get_header(struct strbuf *buf, const char *title)
{
strbuf_addf(buf, "\n\n[%s]\n", title);
}

int cmd_main(int argc, const char **argv) int cmd_main(int argc, const char **argv)
{ {
struct strbuf buffer = STRBUF_INIT; struct strbuf buffer = STRBUF_INIT;
@ -79,6 +93,9 @@ int cmd_main(int argc, const char **argv)
/* Prepare the report contents */ /* Prepare the report contents */
get_bug_template(&buffer); get_bug_template(&buffer);


get_header(&buffer, _("System Info"));
get_system_info(&buffer);

/* fopen doesn't offer us an O_EXCL alternative, except with glibc. */ /* fopen doesn't offer us an O_EXCL alternative, except with glibc. */
report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666); report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);



46
help.c
View File

@ -622,8 +622,32 @@ const char *help_unknown_cmd(const char *cmd)
exit(1); exit(1);
} }


void get_version_info(struct strbuf *buf, int show_build_options)
{
/*
* The format of this string should be kept stable for compatibility
* with external projects that rely on the output of "git version".
*
* Always show the version, even if other options are given.
*/
strbuf_addf(buf, "git version %s\n", git_version_string);

if (show_build_options) {
strbuf_addf(buf, "cpu: %s\n", GIT_HOST_CPU);
if (git_built_from_commit_string[0])
strbuf_addf(buf, "built from commit: %s\n",
git_built_from_commit_string);
else
strbuf_addstr(buf, "no commit associated with this build\n");
strbuf_addf(buf, "sizeof-long: %d\n", (int)sizeof(long));
strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
}
}

int cmd_version(int argc, const char **argv, const char *prefix) int cmd_version(int argc, const char **argv, const char *prefix)
{ {
struct strbuf buf = STRBUF_INIT;
int build_options = 0; int build_options = 0;
const char * const usage[] = { const char * const usage[] = {
N_("git version [<options>]"), N_("git version [<options>]"),
@ -637,25 +661,11 @@ int cmd_version(int argc, const char **argv, const char *prefix)


argc = parse_options(argc, argv, prefix, options, usage, 0); argc = parse_options(argc, argv, prefix, options, usage, 0);


/* get_version_info(&buf, build_options);
* The format of this string should be kept stable for compatibility printf("%s", buf.buf);
* with external projects that rely on the output of "git version".
* strbuf_release(&buf);
* Always show the version, even if other options are given.
*/
printf("git version %s\n", git_version_string);


if (build_options) {
printf("cpu: %s\n", GIT_HOST_CPU);
if (git_built_from_commit_string[0])
printf("built from commit: %s\n",
git_built_from_commit_string);
else
printf("no commit associated with this build\n");
printf("sizeof-long: %d\n", (int)sizeof(long));
printf("sizeof-size_t: %d\n", (int)sizeof(size_t));
/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
}
return 0; return 0;
} }



1
help.h
View File

@ -37,6 +37,7 @@ void add_cmdname(struct cmdnames *cmds, const char *name, int len);
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes); void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
int is_in_cmdlist(struct cmdnames *cmds, const char *name); int is_in_cmdlist(struct cmdnames *cmds, const char *name);
void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds); void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds);
void get_version_info(struct strbuf *buf, int show_build_options);


/* /*
* call this to die(), when it is suspected that the user mistyped a * call this to die(), when it is suspected that the user mistyped a