Teach Git how to prompt the user for a good bug report: reproduction steps, expected behavior, and actual behavior. Later, Git can learn how to collect some diagnostic information from the repository. If users can send us a well-written bug report which contains diagnostic information we would otherwise need to ask the user for, we can reduce the number of question-and-answer round trips between the reporter and the Git contributor. Users may also wish to send a report like this to their local "Git expert" if they have put their repository into a state they are confused by. Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> --- Makefile | 1 + builtin.h | 1 + builtin/bugreport.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ git.c | 1 + 4 files changed, 53 insertions(+) create mode 100644 builtin/bugreport.c diff --git a/Makefile b/Makefile index 58b92af54b..132e2a52da 100644 --- a/Makefile +++ b/Makefile @@ -1039,6 +1039,7 @@ BUILTIN_OBJS += builtin/archive.o BUILTIN_OBJS += builtin/bisect--helper.o BUILTIN_OBJS += builtin/blame.o BUILTIN_OBJS += builtin/branch.o +BUILTIN_OBJS += builtin/bugreport.o BUILTIN_OBJS += builtin/bundle.o BUILTIN_OBJS += builtin/cat-file.o BUILTIN_OBJS += builtin/check-attr.o diff --git a/builtin.h b/builtin.h index 5cf5df69f7..c6373d3289 100644 --- a/builtin.h +++ b/builtin.h @@ -135,6 +135,7 @@ int cmd_archive(int argc, const char **argv, const char *prefix); int cmd_bisect__helper(int argc, const char **argv, const char *prefix); int cmd_blame(int argc, const char **argv, const char *prefix); int cmd_branch(int argc, const char **argv, const char *prefix); +int cmd_bugreport(int argc, const char **argv, const char *prefix); int cmd_bundle(int argc, const char **argv, const char *prefix); int cmd_cat_file(int argc, const char **argv, const char *prefix); int cmd_checkout(int argc, const char **argv, const char *prefix); diff --git a/builtin/bugreport.c b/builtin/bugreport.c new file mode 100644 index 0000000000..2ef16440a0 --- /dev/null +++ b/builtin/bugreport.c @@ -0,0 +1,50 @@ +#include "builtin.h" +#include "stdio.h" +#include "strbuf.h" +#include "time.h" + +int get_bug_template(struct strbuf *template) +{ + const char template_text[] = +"Thank you for filling out a Git bug report!\n" +"Please answer the following questions to help us understand your issue.\n" +"\n" +"What did you do before the bug happened? (Steps to reproduce your issue)\n" +"\n" +"What did you expect to happen? (Expected behavior)\n" +"\n" +"What happened instead? (Actual behavior)\n" +"\n" +"What's different between what you expected and what actually happened?\n" +"\n" +"Anything else you want to add:\n" +"\n" +"Please review the rest of the bug report below.\n" +"You can delete any lines you don't wish to send.\n"; + + strbuf_reset(template); + strbuf_add(template, template_text, strlen(template_text)); + return 0; +} + +int cmd_bugreport(int argc, const char **argv, const char *prefix) +{ + struct strbuf buffer = STRBUF_INIT; + struct strbuf report_path = STRBUF_INIT; + FILE *report; + time_t now = time(NULL); + + strbuf_addstr(&report_path, "git-bugreport-"); + strbuf_addftime(&report_path, "%F", gmtime(&now), 0, 0); + strbuf_addstr(&report_path, ".txt"); + + report = fopen_for_writing(report_path.buf); + + get_bug_template(&buffer); + strbuf_write(&buffer, report); + + fclose(report); + + launch_editor(report_path.buf, NULL, NULL); + return 0; +} diff --git a/git.c b/git.c index ce6ab0ece2..2d6a64f019 100644 --- a/git.c +++ b/git.c @@ -473,6 +473,7 @@ static struct cmd_struct commands[] = { { "bisect--helper", cmd_bisect__helper, RUN_SETUP }, { "blame", cmd_blame, RUN_SETUP }, { "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG }, + { "bugreport", cmd_bugreport, RUN_SETUP }, { "bundle", cmd_bundle, RUN_SETUP_GENTLY | NO_PARSEOPT }, { "cat-file", cmd_cat_file, RUN_SETUP }, { "check-attr", cmd_check_attr, RUN_SETUP }, -- 2.24.0.rc0.303.g954a862665-goog