summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmily Shaffer <emilyshaffer@google.com>2020-02-20 01:58:58 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-02-20 18:33:57 (GMT)
commit5439144490d5d353d2cbcb423fcd78cecbeea962 (patch)
treec1c6990e1c933718009c3c1cb23214ff975753ae
parentb1cdb5e94b9c85ca7d10ab2823977277a72a21f8 (diff)
downloadgit-5439144490d5d353d2cbcb423fcd78cecbeea962.zip
git-5439144490d5d353d2cbcb423fcd78cecbeea962.tar.gz
git-5439144490d5d353d2cbcb423fcd78cecbeea962.tar.bz2
bugreport: summarize contents of alternates file
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. While object-cache.h describes a function "foreach_alt_odb()", this function does not provide information on broken alternates, which are skipped over in "link_alt_odb_entry()". Since the goal is to identify missing alternates, we can gather the contents of .git/objects/info/alternates manually. Signed-off-by: Emily Shaffer <emilyshaffer@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/git-bugreport.txt1
-rw-r--r--bugreport.c45
2 files changed, 46 insertions, 0 deletions
diff --git a/Documentation/git-bugreport.txt b/Documentation/git-bugreport.txt
index a7ef336..1f60fb9 100644
--- a/Documentation/git-bugreport.txt
+++ b/Documentation/git-bugreport.txt
@@ -35,6 +35,7 @@ The following information is captured automatically:
- The number of loose objects in the repository
- The number of packs and packed objects in the repository
- A list of the contents of .git/objects/info (or equivalent)
+ - The number of valid and invalid alternates
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
diff --git a/bugreport.c b/bugreport.c
index 1d61e0f..1640a71 100644
--- a/bugreport.c
+++ b/bugreport.c
@@ -255,6 +255,48 @@ static void get_object_info_summary(struct strbuf *obj_info, int nongit)
strbuf_release(&dirpath);
}
+static void get_alternates_summary(struct strbuf *alternates_info, int nongit)
+{
+ struct strbuf alternates_path = STRBUF_INIT;
+ struct strbuf alternate = STRBUF_INIT;
+ FILE *file;
+ size_t exists = 0, broken = 0;
+
+ if (nongit) {
+ strbuf_addstr(alternates_info,
+ "not run from a git repository - alternates unavailable\n");
+ return;
+ }
+
+ 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-directory <file>] [-s|--suffix <format>]"),
NULL
@@ -355,6 +397,9 @@ int cmd_main(int argc, const char **argv)
get_header(&buffer, "Object Info Summary");
get_object_info_summary(&buffer, nongit_ok);
+ get_header(&buffer, "Alternates");
+ get_alternates_summary(&buffer, nongit_ok);
+
report = fopen_for_writing(report_path.buf);
if (report == NULL) {