aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/scalar/scalar.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2022-05-28 16:11:16 -0700
committerJunio C Hamano <gitster@pobox.com>2022-05-30 23:07:31 -0700
commit0ed5b13f2450fd26c0e52cef775deea477e4cdb4 (patch)
treed9a9f5be5c6b4ab64d85949926b6760d5c77b2ce /contrib/scalar/scalar.c
parentaa5c79a33156c2f086ca3a149c11f1434d10f5ce (diff)
downloadgit-0ed5b13f2450fd26c0e52cef775deea477e4cdb4.tar.gz
scalar diagnose: include disk space information
When analyzing problems with large worktrees/repositories, it is useful to know how close to a "full disk" situation Scalar/Git operates. Let's include this information. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'contrib/scalar/scalar.c')
-rw-r--r--contrib/scalar/scalar.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/contrib/scalar/scalar.c b/contrib/scalar/scalar.c
index a1e05a2146..f06a2f3576 100644
--- a/contrib/scalar/scalar.c
+++ b/contrib/scalar/scalar.c
@@ -302,6 +302,58 @@ static int add_directory_to_archiver(struct strvec *archiver_args,
return res;
}
+#ifndef WIN32
+#include <sys/statvfs.h>
+#endif
+
+static int get_disk_info(struct strbuf *out)
+{
+#ifdef WIN32
+ struct strbuf buf = STRBUF_INIT;
+ char volume_name[MAX_PATH], fs_name[MAX_PATH];
+ DWORD serial_number, component_length, flags;
+ ULARGE_INTEGER avail2caller, total, avail;
+
+ strbuf_realpath(&buf, ".", 1);
+ if (!GetDiskFreeSpaceExA(buf.buf, &avail2caller, &total, &avail)) {
+ error(_("could not determine free disk size for '%s'"),
+ buf.buf);
+ strbuf_release(&buf);
+ return -1;
+ }
+
+ strbuf_setlen(&buf, offset_1st_component(buf.buf));
+ if (!GetVolumeInformationA(buf.buf, volume_name, sizeof(volume_name),
+ &serial_number, &component_length, &flags,
+ fs_name, sizeof(fs_name))) {
+ error(_("could not get info for '%s'"), buf.buf);
+ strbuf_release(&buf);
+ return -1;
+ }
+ strbuf_addf(out, "Available space on '%s': ", buf.buf);
+ strbuf_humanise_bytes(out, avail2caller.QuadPart);
+ strbuf_addch(out, '\n');
+ strbuf_release(&buf);
+#else
+ struct strbuf buf = STRBUF_INIT;
+ struct statvfs stat;
+
+ strbuf_realpath(&buf, ".", 1);
+ if (statvfs(buf.buf, &stat) < 0) {
+ error_errno(_("could not determine free disk size for '%s'"),
+ buf.buf);
+ strbuf_release(&buf);
+ return -1;
+ }
+
+ strbuf_addf(out, "Available space on '%s': ", buf.buf);
+ strbuf_humanise_bytes(out, st_mult(stat.f_bsize, stat.f_bavail));
+ strbuf_addf(out, " (mount flags 0x%lx)\n", stat.f_flag);
+ strbuf_release(&buf);
+#endif
+ return 0;
+}
+
/* printf-style interface, expects `<key>=<value>` argument */
static int set_config(const char *fmt, ...)
{
@@ -598,6 +650,7 @@ static int cmd_diagnose(int argc, const char **argv)
get_version_info(&buf, 1);
strbuf_addf(&buf, "Enlistment root: %s\n", the_repository->worktree);
+ get_disk_info(&buf);
write_or_die(stdout_fd, buf.buf, buf.len);
strvec_pushf(&archiver_args,
"--add-virtual-file=diagnostics.log:%.*s",