Teach bugreport how to collect the Git, curl, and ldd versions, as well as the uname string. Learning the uname and versions in the user's environment will enable us to reproduce behavior reported by the user; the versions will also give us a good starting place while bisecting a newly introduced bug. Put this functionality in a library, so that other commands can easily include this debug info if necessary. Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> --- Makefile | 1 + bugreport.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ bugreport.h | 7 ++++++ builtin/bugreport.c | 13 +++++++++++ 4 files changed, 76 insertions(+) create mode 100644 bugreport.c create mode 100644 bugreport.h diff --git a/Makefile b/Makefile index 78767ecdde..045b22cb67 100644 --- a/Makefile +++ b/Makefile @@ -844,6 +844,7 @@ LIB_OBJS += bisect.o LIB_OBJS += blame.o LIB_OBJS += blob.o LIB_OBJS += branch.o +LIB_OBJS += bugreport.o LIB_OBJS += bulk-checkin.o LIB_OBJS += bundle.o LIB_OBJS += cache-tree.o diff --git a/bugreport.c b/bugreport.c new file mode 100644 index 0000000000..ada54fe583 --- /dev/null +++ b/bugreport.c @@ -0,0 +1,55 @@ +#include "cache.h" + +#include "bugreport.h" +#include "help.h" +#include "run-command.h" +#include "version.h" + +void get_system_info(struct strbuf *sys_info) +{ + struct child_process cp = CHILD_PROCESS_INIT; + struct strbuf std_out = STRBUF_INIT; + + strbuf_reset(sys_info); + + // get git version from native cmd + strbuf_addstr(sys_info, "git version: "); + strbuf_addstr(sys_info, git_version_string); + strbuf_complete_line(sys_info); + + // system call for other version info + argv_array_push(&cp.args, "uname"); + argv_array_push(&cp.args, "-a"); + capture_command(&cp, &std_out, 0); + + strbuf_addstr(sys_info, "uname -a: "); + strbuf_addbuf(sys_info, &std_out); + strbuf_complete_line(sys_info); + + argv_array_clear(&cp.args); + strbuf_reset(&std_out); + + + argv_array_push(&cp.args, "curl-config"); + argv_array_push(&cp.args, "--version"); + capture_command(&cp, &std_out, 0); + + strbuf_addstr(sys_info, "curl-config --version: "); + strbuf_addbuf(sys_info, &std_out); + strbuf_complete_line(sys_info); + + argv_array_clear(&cp.args); + strbuf_reset(&std_out); + + + argv_array_push(&cp.args, "ldd"); + argv_array_push(&cp.args, "--version"); + capture_command(&cp, &std_out, 0); + + strbuf_addstr(sys_info, "ldd --version: "); + strbuf_addbuf(sys_info, &std_out); + strbuf_complete_line(sys_info); + + argv_array_clear(&cp.args); + strbuf_reset(&std_out); +} diff --git a/bugreport.h b/bugreport.h new file mode 100644 index 0000000000..ba216acf3f --- /dev/null +++ b/bugreport.h @@ -0,0 +1,7 @@ +#include "strbuf.h" + +/** + * Adds the Git version, `uname -a`, and `curl-config --version` to sys_info. + * The previous contents of sys_info will be discarded. + */ +void get_system_info(struct strbuf *sys_info); diff --git a/builtin/bugreport.c b/builtin/bugreport.c index 2ef16440a0..7232d31be7 100644 --- a/builtin/bugreport.c +++ b/builtin/bugreport.c @@ -1,4 +1,5 @@ #include "builtin.h" +#include "bugreport.h" #include "stdio.h" #include "strbuf.h" #include "time.h" @@ -27,6 +28,13 @@ int get_bug_template(struct strbuf *template) return 0; } +void add_header(FILE *report, const char *title) +{ + struct strbuf buffer = STRBUF_INIT; + strbuf_addf(&buffer, "\n\n[%s]\n", title); + strbuf_write(&buffer, report); +} + int cmd_bugreport(int argc, const char **argv, const char *prefix) { struct strbuf buffer = STRBUF_INIT; @@ -43,6 +51,11 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix) get_bug_template(&buffer); strbuf_write(&buffer, report); + // add other contents + add_header(report, "System Info"); + get_system_info(&buffer); + strbuf_write(&buffer, report); + fclose(report); launch_editor(report_path.buf, NULL, NULL); -- 2.24.0.rc0.303.g954a862665-goog