╭ changed ─────────╮ │src/serve_http.zig│ ╰──────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────────────────────────────────────────────────────╮ │ 9 comptime any_repo_opts: rp.AnyRepoOpts(repo_kind),│ │10 io: std.Io, │ │11 allocator: std.mem.Allocator, │ │12 - repo_root_path: []const u8, │ │12 + users_dir: []const u8, │ │13 admin_repo_path: []const u8, │ │14 net_server: *std.Io.net.Server, │ │15 tasks: *std.Io.Group, │ ╰──────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────╮ │18 const Context = struct { │ │19 io: std.Io, │ │20 allocator: std.mem.Allocator,│ │21 - repo_root_path: []const u8, │ │21 + users_dir: []const u8, │ │22 admin_repo_path: []const u8, │ │23 err: *std.Io.Writer, │ │24 }; │ ╰─────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │26 const handle = struct { │ │27 fn h(ctx: Context, stream: std.Io.net.Stream) void { │ │28 defer stream.close(ctx.io); │ │29 - handleConnection(repo_kind, any_repo_opts, ctx.io, ctx.allocator, ctx.repo_root_path, ctx.admin_repo_path, stream, ctx.err) catch |request_err| {│ │29 + handleConnection(repo_kind, any_repo_opts, ctx.io, ctx.allocator, ctx.users_dir, ctx.admin_repo_path, stream, ctx.err) catch |request_err| { │ │30 serve_common.logError(ctx.io, ctx.err, "connection failed: {s}\n", .{@errorName(request_err)}); │ │31 }; │ │32 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────╮ │35 serve_common.runListener(io, net_server, tasks, err, "http", Context{│ │36 .io = io, │ │37 .allocator = allocator, │ │38 - .repo_root_path = repo_root_path, │ │38 + .users_dir = users_dir, │ │39 .admin_repo_path = admin_repo_path, │ │40 .err = err, │ │41 }, handle); │ ╰─────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ │46 comptime any_repo_opts: rp.AnyRepoOpts(repo_kind),│ │47 io: std.Io, │ │48 allocator: std.mem.Allocator, │ │49 - repo_root_path: []const u8, │ │49 + users_dir: []const u8, │ │50 admin_repo_path: []const u8, │ │51 stream: std.Io.net.Stream, │ │52 err: *std.Io.Writer, │ ╰──────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │64 else => |e| return e, │ │65 }; │ │66 │ │67 - handleGitRequest(repo_kind, any_repo_opts, io, allocator, repo_root_path, admin_repo_path, &http_server, &request) catch |request_err| {│ │67 + handleGitRequest(repo_kind, any_repo_opts, io, allocator, users_dir, admin_repo_path, &http_server, &request) catch |request_err| { │ │68 serve_common.logError(io, err, "request failed: {s}\n", .{@errorName(request_err)}); │ │69 if (http_server.reader.state == .received_head) { │ │70 http_server.reader.state = .ready; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ │80 comptime any_repo_opts: rp.AnyRepoOpts(repo_kind),│ │81 io: std.Io, │ │82 allocator: std.mem.Allocator, │ │83 - repo_root_path: []const u8, │ │83 + users_dir: []const u8, │ │84 admin_repo_path: []const u8, │ │85 http_server: *std.http.Server, │ │86 request: *std.http.Server.Request, │ ╰──────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │133 var arena = std.heap.ArenaAllocator.init(allocator); │ │134 defer arena.deinit(); │ │135 const moment = try evt.currentMoment(evt.admin_repo_opts, &admin); │ │136 - const repo = (try evt.readRepoByOwnerAndName(io, allocator, &arena, moment, repo_root_path, owner_repo.owner, owner_repo.name)) orelse│ │136 + const repo = (try evt.readRepoByOwnerAndName(io, allocator, &arena, moment, users_dir, owner_repo.owner, owner_repo.name)) orelse │ │137 return error.RepoNotFound; │ │138 if (repo.repo.event.read_access == .private) { │ │139 if (http_server.reader.state == .received_head) http_server.reader.state = .ready; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │140 try writeSimpleResponse(http_server, 403, "Forbidden", "text/plain", "private repos cannot be fetched over HTTP");│ │141 return; │ │142 } │ │143 - const repo_id = std.fmt.bytesToHex(repo.event_id, .lower); │ │144 - break :blk try std.fs.path.join(allocator, &.{ repo_root_path, &repo_id }); │ │143 + break :blk try evt.repoPath(allocator, users_dir, repo.repo.event.user_id, &repo.event_id); │ │144 }; │ │145 defer allocator.free(repo_path); │ │146 │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯