@@ -307,6 +307,42 @@ static void get_object_info_summary(struct strbuf *obj_info)
strbuf_release(&dirpath);
}
+static void get_alternates_summary(struct strbuf *alternates_info)
+{
+ struct strbuf alternates_path = STRBUF_INIT;
+ struct strbuf alternate = STRBUF_INIT;
+ FILE *file;
+ size_t exists = 0, broken = 0;
+
+ strbuf_addstr(&alternates_path, get_object_directory());
+ strbuf_complete(&alternates_path, '/');
+ strbuf_addstr(&alternates_path, "info/alternates");
+
+ file = fopen(alternates_path.buf, "r");
+ if (!file) {
+ strbuf_addstr(alternates_info, "No alternates file found.\n");
+ strbuf_release(&alternates_path);
+ return;
+ }
+
+ while (strbuf_getline(&alternate, file) != EOF) {
+ if (!access(alternate.buf, F_OK))
+ exists++;
+ else
+ broken++;
+ }
+
+ strbuf_addf(alternates_info,
+ "%zd alternates found (%zd working, %zd broken)\n",
+ exists + broken,
+ exists,
+ broken);
+
+ fclose(file);
+ strbuf_release(&alternate);
+ strbuf_release(&alternates_path);
+}
+
static const char * const bugreport_usage[] = {
N_("git bugreport [-o|--output <file>]"),
NULL
@@ -386,6 +422,9 @@ int cmd_main(int argc, const char **argv)
get_header(&buffer, "Object Info Summary");
get_object_info_summary(&buffer);
+ get_header(&buffer, "Alternates");
+ get_alternates_summary(&buffer);
+
report = fopen_for_writing(report_path.buf);
strbuf_write(&buffer, report);
fclose(report);
In some cases, it could be that the user is having a problem with an object which isn't present in their normal object directory. We can get a hint that that might be the case by examining the list of alternates where their object may be stored instead. Since paths to alternates may be sensitive, we'll instead count how many alternates have been specified and note how many of them exist or are broken. Signed-off-by: Emily Shaffer <emilyshaffer@google.com> --- bugreport.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)