Skip to content

Commit 8cda0eb

Browse files
committed
scalar diagnose: include shared cache info
Signed-off-by: Johannes Schindelin <[email protected]>
1 parent b0f6df4 commit 8cda0eb

File tree

1 file changed

+80
-1
lines changed

1 file changed

+80
-1
lines changed

diagnose.c

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,39 @@ static int dir_file_stats(struct odb_source *source, void *data)
7272
return 0;
7373
}
7474

75+
static void dir_stats(struct strbuf *buf, const char *path)
76+
{
77+
DIR *dir = opendir(path);
78+
struct dirent *e;
79+
struct stat e_stat;
80+
struct strbuf file_path = STRBUF_INIT;
81+
size_t base_path_len;
82+
83+
if (!dir)
84+
return;
85+
86+
strbuf_addstr(buf, "Contents of ");
87+
strbuf_add_absolute_path(buf, path);
88+
strbuf_addstr(buf, ":\n");
89+
90+
strbuf_add_absolute_path(&file_path, path);
91+
strbuf_addch(&file_path, '/');
92+
base_path_len = file_path.len;
93+
94+
while ((e = readdir(dir)) != NULL)
95+
if (!is_dot_or_dotdot(e->d_name) && e->d_type == DT_REG) {
96+
strbuf_setlen(&file_path, base_path_len);
97+
strbuf_addstr(&file_path, e->d_name);
98+
if (!stat(file_path.buf, &e_stat))
99+
strbuf_addf(buf, "%-70s %16"PRIuMAX"\n",
100+
e->d_name,
101+
(uintmax_t)e_stat.st_size);
102+
}
103+
104+
strbuf_release(&file_path);
105+
closedir(dir);
106+
}
107+
75108
static int count_files(struct strbuf *path)
76109
{
77110
DIR *dir = opendir(path->buf);
@@ -187,7 +220,7 @@ int create_diagnostics_archive(struct repository *r,
187220
char **argv_copy = NULL;
188221
int stdout_fd = -1, archiver_fd = -1;
189222
char *cache_server_url = NULL, *shared_cache = NULL;
190-
struct strbuf buf = STRBUF_INIT;
223+
struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
191224
int res;
192225
struct archive_dir archive_dirs[] = {
193226
{ ".git", 0 },
@@ -259,6 +292,52 @@ int create_diagnostics_archive(struct repository *r,
259292
}
260293
}
261294

295+
if (shared_cache) {
296+
size_t path_len;
297+
298+
strbuf_reset(&buf);
299+
strbuf_addf(&path, "%s/pack", shared_cache);
300+
strbuf_reset(&buf);
301+
strbuf_addstr(&buf, "--add-virtual-file=packs-cached.txt:");
302+
dir_stats(&buf, path.buf);
303+
strvec_push(&archiver_args, buf.buf);
304+
305+
strbuf_reset(&buf);
306+
strbuf_addstr(&buf, "--add-virtual-file=objects-cached.txt:");
307+
loose_objs_stats(&buf, shared_cache);
308+
strvec_push(&archiver_args, buf.buf);
309+
310+
strbuf_reset(&path);
311+
strbuf_addf(&path, "%s/info", shared_cache);
312+
path_len = path.len;
313+
314+
if (is_directory(path.buf)) {
315+
DIR *dir = opendir(path.buf);
316+
struct dirent *e;
317+
318+
while ((e = readdir(dir))) {
319+
if (!strcmp(".", e->d_name) || !strcmp("..", e->d_name))
320+
continue;
321+
if (e->d_type == DT_DIR)
322+
continue;
323+
324+
strbuf_reset(&buf);
325+
strbuf_addf(&buf, "--add-virtual-file=info/%s:", e->d_name);
326+
327+
strbuf_setlen(&path, path_len);
328+
strbuf_addch(&path, '/');
329+
strbuf_addstr(&path, e->d_name);
330+
331+
if (strbuf_read_file(&buf, path.buf, 0) < 0) {
332+
res = error_errno(_("could not read '%s'"), path.buf);
333+
goto diagnose_cleanup;
334+
}
335+
strvec_push(&archiver_args, buf.buf); // CodeQL [SM01932] justification: CodeQL is wrong here because the value is read from a file via strbuf_read() which does NUL-terminate the string, something CodeQL fails to understand
336+
}
337+
closedir(dir);
338+
}
339+
}
340+
262341
strvec_pushl(&archiver_args, "--prefix=",
263342
oid_to_hex(r->hash_algo->empty_tree), "--", NULL);
264343

0 commit comments

Comments
 (0)