return 0;
 }
 
+static int count_files(char *path)
+{
+       DIR *dir = opendir(path);
+       struct dirent *e;
+       int count = 0;
+
+       if (!dir)
+               return 0;
+
+       while ((e = readdir(dir)) != NULL)
+               if (!is_dot_or_dotdot(e->d_name) && e->d_type == DT_REG)
+                       count++;
+
+       closedir(dir);
+       return count;
+}
+
+static void loose_objs_stats(struct strbuf *buf, const char *path)
+{
+       DIR *dir = opendir(path);
+       struct dirent *e;
+       int count;
+       int total = 0;
+       unsigned char c;
+       struct strbuf count_path = STRBUF_INIT;
+       size_t base_path_len;
+
+       if (!dir)
+               return;
+
+       strbuf_addstr(buf, "Object directory stats for ");
+       strbuf_add_absolute_path(buf, path);
+       strbuf_addstr(buf, ":\n");
+
+       strbuf_add_absolute_path(&count_path, path);
+       strbuf_addch(&count_path, '/');
+       base_path_len = count_path.len;
+
+       while ((e = readdir(dir)) != NULL)
+               if (!is_dot_or_dotdot(e->d_name) &&
+                   e->d_type == DT_DIR && strlen(e->d_name) == 2 &&
+                   !hex_to_bytes(&c, e->d_name, 1)) {
+                       strbuf_setlen(&count_path, base_path_len);
+                       strbuf_addstr(&count_path, e->d_name);
+                       total += (count = count_files(count_path.buf));
+                       strbuf_addf(buf, "%s : %7d files\n", e->d_name, count);
+               }
+
+       strbuf_addf(buf, "Total: %d loose objects", total);
+
+       strbuf_release(&count_path);
+       closedir(dir);
+}
+
 static int cmd_diagnose(int argc, const char **argv)
 {
        struct option options[] = {
        foreach_alt_odb(dir_file_stats, &buf);
        strvec_push(&archiver_args, buf.buf);
 
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, "--add-virtual-file=objects-local.txt:");
+       loose_objs_stats(&buf, ".git/objects");
+       strvec_push(&archiver_args, buf.buf);
+
        if ((res = add_directory_to_archiver(&archiver_args, ".git", 0)) ||
            (res = add_directory_to_archiver(&archiver_args, ".git/hooks", 0)) ||
            (res = add_directory_to_archiver(&archiver_args, ".git/info", 0)) ||
 
        scalar clone "file://$(pwd)" cloned --single-branch &&
        git repack &&
        echo "$(pwd)/.git/objects/" >>cloned/src/.git/objects/info/alternates &&
+       test_commit -C cloned/src loose &&
        scalar diagnose cloned >out 2>err &&
        grep "Available space" out &&
        sed -n "s/.*$SQ\\(.*\\.zip\\)$SQ.*/\\1/p" <err >zip_path &&
        unzip -p "$zip_path" diagnostics.log >out &&
        test_file_not_empty out &&
        unzip -p "$zip_path" packs-local.txt >out &&
-       grep "$(pwd)/.git/objects" out
+       grep "$(pwd)/.git/objects" out &&
+       unzip -p "$zip_path" objects-local.txt >out &&
+       grep "^Total: [1-9]" out
 '
 
 test_done