]> jxnshi.xyz Git - jxnshi.xyz.git/commitdiff
Add repo view
authorjxnshi <jxnshi@cock.li>
Mon, 6 Jan 2025 17:55:48 +0000 (18:55 +0100)
committerjxnshi <jxnshi@cock.li>
Mon, 6 Jan 2025 17:55:48 +0000 (18:55 +0100)
src/main.zig

index aed04cd6cddab2bc7a3a56784513865de64e0b40..e8ab2f7a6c4f050d47727c8ca5674e94030342f3 100644 (file)
@@ -101,14 +101,11 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
             if (std.mem.startsWith(u8, route, "repos")) {
                 const sub_route = route["repos".len..];
 
+                var git_dir = try std.fs.openDirAbsolute("/srv/git/", .{ .iterate = true });
+                defer git_dir.close();
+
                 // Show all repos.
                 if (sub_route.len == 0) {
-                    var git_dir = try std.fs.openDirAbsolute("/srv/git/", .{
-                        .iterate = true,
-                    });
-
-                    defer git_dir.close();
-
                     var git_iter = git_dir.iterate();
 
                     try temp_buffer_writer.writeAll("<code>git clone git://jxnshi.xyz/repo-name.git</code>");
@@ -116,15 +113,44 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
 
                     while (try git_iter.next()) |entry| {
                         const repo_name = entry.name[0 .. entry.name.len - ".git".len];
-                        try std.fmt.format(temp_buffer_writer, "<li>{s}</li>\n", .{repo_name});
+
+                        var repo_dir = try git_dir.openDir(entry.name, .{ .iterate = true });
+                        defer repo_dir.close();
+
+                        var repo_dir_iter = repo_dir.iterate();
+
+                        var has_read_me = false;
+
+                        while (try repo_dir_iter.next()) |repo_entry| {
+                            if (std.mem.eql(u8, repo_entry.name, "README.md")) {
+                                has_read_me = true;
+                                break;
+                            }
+                        }
+
+                        if (has_read_me) {
+                            try std.fmt.format(temp_buffer_writer, "<li><a href=\"/repos/{s}\">{s}</a></li>\n", .{ repo_name, repo_name });
+                        } else {
+                            try std.fmt.format(temp_buffer_writer, "<li>{s}</li>\n", .{repo_name});
+                        }
                     }
 
                     try temp_buffer_writer.writeAll("</ul>\n");
                 }
 
                 // Show specific repo.
-                else {
-                    //
+                else if (sub_route[0] == '/') {
+                    const repo_name = sub_route[1..];
+
+                    var repo_dir = try git_dir.openDir(repo_name, .{ .iterate = true });
+                    defer repo_dir.close();
+
+                    var read_me_file = try repo_dir.openFile("README.md", .{});
+                    defer read_me_file.close();
+
+                    const read_me_file_reader = read_me_file.reader();
+
+                    try markdownToHtml(temp_buffer_writer.any(), read_me_file_reader.any());
                 }
             }