╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────╮ │src/test/net.zig│ ╰────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────╮ │1685 if (create) .{ .read_access = .public } else null, │ │1686 )) orelse return null; │ │1684 - return try std.fs.path.join(allocator, &.{ data_path, "repos", &event_id_hex }); │ │1687 + return try evt.repoPath(allocator, users_dir, &location.owner_id, &location.repo_id);│ │1688 } │ │1689 │ │1690 // build the remote URL addressing admin/<repo_name> over the given transport │ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────────╮ │src/test/undo.zig│ ╰─────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │62 const aa = arena.allocator(); │ │63 const base = try temp.dir.realPathFileAlloc(io, ".", aa); │ │64 const admin_path = try std.fs.path.join(aa, &.{ base, "admin" }); │ │65 - const repos_dir = try std.fs.path.join(aa, &.{ base, "repos" }); │ │65 + const users_dir = try std.fs.path.join(aa, &.{ base, "users" }); │ │66 var admin = try xit.repo.Repo(.xit, evt.admin_repo_opts).init(io, allocator, .{ .path = admin_path });│ │67 defer admin.deinit(io, allocator); │ │68 const owner = [_]u8{1} ** evt.event_id_size; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │78 .{ .id = std.fmt.bytesToHex(reader, .lower), .author = author, .event = .{ .user = .{ .name = "reader", .email = "reader@example.test", .password_hash = "unused" } } }, │ │79 }; │ │80 try evt.consume(.server, .admin, .xit, evt.admin_repo_opts, io, allocator, &admin, evt.events_ref, &seed); │ │81 - var user_repo = try evt.initUserRepo(io, allocator, try evt.userRepoPath(aa, repos_dir, &owner)); │ │81 + var user_repo = try evt.initUserRepo(io, allocator, try evt.userRepoPath(aa, users_dir, &owner)); │ │82 defer user_repo.deinit(io, allocator); │ │83 try evt.consume(.server, .user, .xit, evt.user_repo_opts, io, allocator, &user_repo, evt.events_ref, &.{.{ .id = std.fmt.bytesToHex(repo_id, .lower), .author = author, .event = .{ .repo = repo_event } }});│ │84 - const repo_hex = std.fmt.bytesToHex(repo_id, .lower); │ │85 - const path = try std.fs.path.join(aa, &.{ repos_dir, &repo_hex }); │ │84 + const path = try evt.repoPath(aa, users_dir, &owner, &repo_id); │ │85 { │ │86 var repo = try xit.repo.Repo(.xit, .{}).init(io, allocator, .{ .path = path }); │ │87 defer repo.deinit(io, allocator); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │91 for ([_]?[]const u8{ &owner, &writer, &reader, null }, [_]bool{ true, true, false, false }) |user, allowed| {│ │92 var session = try ui.Session.init(&arena, &admin, .{ .user_id = user }); │ │93 session.io = io; │ │95 - session.repos_dir = repos_dir; │ │94 + session.users_dir = users_dir; │ │95 const files = ui.RoutablePage.repoFilesRoute("alice/demo", null, "", "", 0).?; │ │96 session.data.current_page = files; │ │97 const page = try ui.Repo.init(&arena, &session, files); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │115 } │ │116 var session = try ui.Session.init(&arena, &admin, .{ .user_id = &owner }); │ │117 session.io = io; │ │119 - session.repos_dir = repos_dir; │ │118 + session.users_dir = users_dir; │ │119 try Undo.perform(allocator, &session, ui.RoutablePage.repoUndoRoute("alice/demo", 2).?.repo_undo);│ │120 try std.testing.expectEqual(null, session.next_page.?.repo_undo.index); │ │121 { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │139 try evt.consume(.server, .user, .xit, evt.user_repo_opts, io, allocator, &user_repo, evt.events_ref, &.{.{ .id = std.fmt.bytesToHex(repo_id, .lower), .author = author, .event = .{ .repo = repo_event } }});│ │140 var anonymous = try ui.Session.init(&arena, &admin, .{}); │ │141 anonymous.io = io; │ │143 - anonymous.repos_dir = repos_dir; │ │142 + anonymous.users_dir = users_dir; │ │143 try std.testing.expectError(error.NotFound, ui.Repo.init(&arena, &anonymous, ui.RoutablePage.repoUndoRoute("alice/demo", null).?)); │ │144 } │ │145 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮ │253 } │ │254 │ │255 // each user's repo holds the repos they own │ │256 - const repos_path = try std.fs.path.join(arena.allocator(), &.{ server_path, "repos" }); │ │256 + const users_dir = try std.fs.path.join(arena.allocator(), &.{ server_path, "users" }); │ │257 for (user_ids, 0..) |user_id, user_index| { │ │258 - const user_repo_path = try evt.userRepoPath(arena.allocator(), repos_path, &user_id);│ │258 + const user_repo_path = try evt.userRepoPath(arena.allocator(), users_dir, &user_id); │ │259 var user_repo = try evt.initUserRepo(io, allocator, user_repo_path); │ │260 defer user_repo.deinit(io, allocator); │ │261 var owned: std.ArrayList(evt.EventWithId) = .empty; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │865 defer template_repo_dir.close(io); │ │866 │ │867 for (repo_event_ids, 0..) |id_bytes, repo_index| { │ │868 - const repo_id = std.fmt.bytesToHex(id_bytes, .lower); │ │869 - const repo_path = try std.fs.path.join(arena.allocator(), &.{ server_path, "repos", &repo_id }); │ │868 + const repo_path = try evt.repoPath(arena.allocator(), users_dir, &user_ids[repo_data[repo_index].user_index], &id_bytes);│ │869 { │ │870 var dest_dir = try cwd.createDirPathOpen(io, repo_path, .{}); │ │871 defer dest_dir.close(io); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │891 │ │892 // let the native TUI's page builders open the on-disk repos for the file tree │ │893 session.io = io; │ │895 - session.repos_dir = try std.fs.path.join(session_arena.allocator(), &.{ server_path, "repos" });│ │894 + session.users_dir = try std.fs.path.join(session_arena.allocator(), &.{ server_path, "users" });│ │895 │ │896 // leave a one-shot session for the first browser to hit the web ui, so it │ │897 // starts logged in as admin │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────╮ │1058 fn seedPatchRevision( │ │1059 io: std.Io, │ │1060 allocator: std.mem.Allocator, │ │1062 - repos_path: []const u8, │ │1061 + users_dir: []const u8, │ │1062 + forker_id: *const [evt.event_id_size]u8,│ │1063 patch_id: *const [evt.event_id_size]u8, │ │1064 title: []const u8, │ │1065 author: evt.CommitAuthor, │ ╰──────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯