]> jxnshi.xyz Git - jxnshi.xyz.git/commitdiff
Add repo tab
authorjxnshi <jxnshi@proton.me>
Sat, 14 Dec 2024 13:14:52 +0000 (13:14 +0000)
committerjxnshi <jxnshi@proton.me>
Sat, 14 Dec 2024 13:14:52 +0000 (13:14 +0000)
public/404.html
public/layout.html
src/main.zig

index 8d03dc19fd3f41b104759974f72c84163f7473b1..1d70c6327add3c3130f04f65296a18f7e1b529ce 100644 (file)
@@ -1 +1 @@
-<p>Lost in outter space.</p>
+<p>On dirait que vous vous ĂȘtes perdu.</p>
index f28b7f167b453742c5325833783dacf157394c7a..614c13775e6370e7954c2acc08225cdc5bf01341 100644 (file)
@@ -13,8 +13,9 @@
                 <div>
                     <h2 id="projects-title">Projets</h2>
                     <ul>
-                        <li><a href="/livres">livres</a></li>
                         <li><a href="/cattoland">cattoland</a></li>
+                        <li><a href="/livres">livres</a></li>
+                        <li><a href="/repos">repos</a></li>
                     </ul>
                 </div>
             </div>
index ca1c9bf7817b8e1cc078d05b0471867fccf54719..d6f66fbc9004627c8c449f8ab9486f17008144e6 100644 (file)
@@ -30,6 +30,8 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
     defer layout_buffer.deinit();
     defer temp_buffer.deinit();
 
+    const temp_buffer_writer = temp_buffer.writer();
+
     var server = std.http.Server.init(connection, &read_buffer);
 
     const cwd = std.fs.cwd();
@@ -62,6 +64,7 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
             break :blk stat.kind == .file;
         };
 
+        // Serve file.
         if (is_file) blk: {
             const file = public_dir.openFile(route, .{}) catch |err| {
                 std.log.err("Could not open file \"{s}\" with error {}", .{ route, err });
@@ -72,7 +75,10 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
 
             const file_reader = file.reader();
             try file_reader.readAllArrayList(&send_buffer, std.math.maxInt(usize));
-        } else blk: {
+        }
+
+        // Serve route.
+        else blk: {
             { // Layout file.
                 var layout_file = public_dir.openFile("layout.html", .{}) catch {
                     std.log.err("Could not open layout file.", .{});
@@ -87,74 +93,106 @@ fn handleClient(parent_allocator: std.mem.Allocator, connection: std.net.Server.
 
             var maybe_index_file: ?std.fs.File = null;
 
-            index_file: {
-                route_dir: {
-                    var is_public: bool = undefined;
-                    var route_dir: std.fs.Dir = undefined;
-
-                    if (route.len == 0) {
-                        route_dir = public_dir;
-                        is_public = true;
-                    } else {
-                        route_dir = public_dir.openDir(route, .{}) catch break :route_dir;
-                        is_public = false;
-                    }
+            // Handle repos.
+            if (std.mem.startsWith(u8, route, "repos")) {
+                const sub_route = route["repos".len..];
 
-                    defer {
-                        if (!is_public) {
-                            route_dir.close();
-                        }
-                    }
+                // Show all repos.
+                if (sub_route.len == 0) {
+                    var git_dir = try std.fs.openDirAbsolute("/srv/git/", .{
+                        .iterate = true,
+                    });
 
-                    maybe_index_file = route_dir.openFile("index.html", .{}) catch break :route_dir;
+                    defer git_dir.close();
 
-                    break :index_file;
-                }
+                    var git_iter = git_dir.iterate();
+
+                    try temp_buffer_writer.writeAll("<ul id=\"repos-list\">\n");
 
-                var path_ext = std.ArrayList(u8).init(allocator);
-                defer path_ext.deinit();
+                    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});
+                    }
 
-                try path_ext.appendSlice(route);
-                try path_ext.appendSlice(".html");
+                    try temp_buffer_writer.writeAll("</ul>\n");
+                }
 
-                if (public_dir.openFile(path_ext.items, .{})) |index_file| {
-                    maybe_index_file = index_file;
-                } else |_| {
+                // Show specific repo.
+                else {
                     //
                 }
             }
 
-            if (maybe_index_file) |index_file| {
-                defer index_file.close();
+            // Handle file index.
+            else {
+                index_file: {
+                    route_dir: {
+                        var route_dir: std.fs.Dir = undefined;
+                        var is_public: bool = undefined;
+
+                        if (route.len == 0) {
+                            route_dir = public_dir;
+                            is_public = true;
+                        } else {
+                            route_dir = public_dir.openDir(route, .{}) catch break :route_dir;
+                            is_public = false;
+                        }
+
+                        defer {
+                            if (!is_public) {
+                                route_dir.close();
+                            }
+                        }
+
+                        maybe_index_file = route_dir.openFile("index.html", .{}) catch break :route_dir;
+
+                        break :index_file;
+                    }
 
-                const index_file_reader = index_file.reader();
-                try index_file_reader.readAllArrayList(&temp_buffer, std.math.maxInt(usize));
-            } else no_index_file: {
-                md_file: {
                     var path_ext = std.ArrayList(u8).init(allocator);
                     defer path_ext.deinit();
 
                     try path_ext.appendSlice(route);
-                    try path_ext.appendSlice(".md");
+                    try path_ext.appendSlice(".html");
+
+                    if (public_dir.openFile(path_ext.items, .{})) |index_file| {
+                        maybe_index_file = index_file;
+                    } else |_| {
+                        //
+                    }
+                }
 
-                    var md_file = public_dir.openFile(path_ext.items, .{}) catch break :md_file;
-                    defer md_file.close();
+                if (maybe_index_file) |index_file| {
+                    defer index_file.close();
 
-                    const md_file_reader = md_file.reader();
+                    const index_file_reader = index_file.reader();
+                    try index_file_reader.readAllArrayList(&temp_buffer, std.math.maxInt(usize));
+                } else no_index_file: {
+                    md_file: {
+                        var path_ext = std.ArrayList(u8).init(allocator);
+                        defer path_ext.deinit();
 
-                    const temp_buffer_writer = temp_buffer.writer();
+                        try path_ext.appendSlice(route);
+                        try path_ext.appendSlice(".md");
 
-                    try markdownToHtml(temp_buffer_writer.any(), md_file_reader.any());
+                        var md_file = public_dir.openFile(path_ext.items, .{}) catch break :md_file;
+                        defer md_file.close();
 
-                    break :no_index_file;
-                }
+                        const md_file_reader = md_file.reader();
+
+                        try markdownToHtml(temp_buffer_writer.any(), md_file_reader.any());
 
-                var not_found_file = public_dir.openFile("404.html", .{}) catch break :blk;
-                defer not_found_file.close();
+                        break :no_index_file;
+                    }
+
+                    // 404 Not Found.
+                    var not_found_file = public_dir.openFile("404.html", .{}) catch break :blk;
+                    defer not_found_file.close();
 
-                const not_found_file_reader = not_found_file.reader();
+                    const not_found_file_reader = not_found_file.reader();
 
-                try not_found_file_reader.readAllArrayList(&temp_buffer, std.math.maxInt(usize));
+                    try not_found_file_reader.readAllArrayList(&temp_buffer, std.math.maxInt(usize));
+                }
             }
 
             try send_buffer.resize(layout_buffer.items.len + temp_buffer.items.len - 3);