From 86563671ff102c6e5da28219a6cd2d144eeb2ebf Mon Sep 17 00:00:00 2001
From: tri <tri@thac.loan>
Date: Tue, 30 Sep 2025 19:30:14 +0700
Subject: [PATCH] show repo size

---
 README.md    |  5 ++++-
 src/git.zig  |  9 +++++++++
 src/main.zig | 14 +++++++-------
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index bf07dee..9f8c49b 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,8 @@ zig build -Doptimize=ReleaseSafe
 Runtime dependencies (khoe shells out to these commands at runtime):
 
 - git
-- cmark
+- [cmark][7]
+- [du][6]
 
 ## Use
 
@@ -84,3 +85,5 @@ You should have received a copy of the GNU Affero General Public License along w
 [3]: https://github.com/theZiz/aha
 [4]: https://manpages.debian.org/trixie/util-linux/flock.1.en.html
 [5]: https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/git-no-forge/#submissions
+[6]: https://manpages.debian.org/trixie/coreutils/du.1.en.html
+[7]: https://github.com/commonmark/cmark
diff --git a/src/git.zig b/src/git.zig
index a91299e..331f39f 100644
--- a/src/git.zig
+++ b/src/git.zig
@@ -147,3 +147,12 @@ pub fn readFileAlloc(arena: mem.Allocator, dir: fs.Dir, file_name: []const u8) !
 
     return proc.stdout;
 }
+
+pub fn repoSize(arena: mem.Allocator, git_dir: fs.Dir) ![]const u8 {
+    var proc = try std.process.Child.run(.{
+        .allocator = arena,
+        .cwd_dir = git_dir,
+        .argv = &.{ "du", "-h", "-d0", "." },
+    });
+    return proc.stdout[0..std.mem.indexOfAny(u8, proc.stdout, " \t").?];
+}
diff --git a/src/main.zig b/src/main.zig
index 2b631de..4a085b9 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -114,6 +114,7 @@ pub fn main() !u8 {
             .in_repo_dir = repo_dir,
             .commits = commits,
             .git_dir_path = git_dir_path,
+            .git_dir = git_dir,
         });
 
         // TODO: write repo's commits
@@ -234,6 +235,7 @@ const RepoArgs = struct {
     in_repo_dir: fs.Dir,
     commits: []git.Commit,
     git_dir_path: []const u8,
+    git_dir: fs.Dir,
 };
 
 pub fn writeRepoPage(args: RepoArgs) !void {
@@ -244,7 +246,6 @@ pub fn writeRepoPage(args: RepoArgs) !void {
     const target_dir = args.target_dir;
     const in_repo_dir = args.in_repo_dir;
     const commits = args.commits;
-    const git_dir_path = args.git_dir_path;
 
     var buf: [1024]u8 = undefined;
     var out_repo_dir = try target_dir.makeOpenPath(
@@ -253,9 +254,6 @@ pub fn writeRepoPage(args: RepoArgs) !void {
     );
     defer out_repo_dir.close();
 
-    const git_dir = try git.findGitDir(arena, in_repo_dir);
-    _ = git_dir;
-
     var file = try out_repo_dir.createFile("index.html", .{});
     defer file.close();
 
@@ -281,18 +279,20 @@ pub fn writeRepoPage(args: RepoArgs) !void {
         \\
         \\    <p>
         \\      clone: <code>git clone {2s}/{3s}</code><br>
-        \\      commits: <b>{1d}</b><br>
+        \\      size: {5s}<br>
+        \\      commits: {1d}<br>
         \\    </p>
         \\
     , .{
         repo_name,
         commits.len,
         site_url,
-        if (mem.eql(u8, git_dir_path, "."))
+        if (mem.eql(u8, args.git_dir_path, "."))
             repo_name
         else
-            try std.fmt.bufPrint(&buf, "{s}/{s}", .{ repo_name, git_dir_path }),
+            try std.fmt.bufPrint(&buf, "{s}/{s}", .{ repo_name, args.git_dir_path }),
         try html.escapeAlloc(arena, description),
+        try git.repoSize(arena, args.git_dir),
     });
 
     // If there's a readme file, include it in repo index:
-- 
2.47.3

