╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ──────╮ │src/ui/Fork.zig│ ╰───────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │42 const id = evt.parseEventId(route_fork.id.slice()) catch return error.NotFound; │ │43 const gpa = arena.child_allocator; │ │44 const forker_id = (try evt.User.readIdByName(evt.AdminDB, evt.admin_repo_opts.hash, haxy_moment, identity.owner)) orelse return error.NotFound;│ │45 - const fork_record = (try evt.readForkById(io, gpa, arena, repos_dir, &forker_id, &id)) orelse return error.NotFound; │ │45 + const fork_record = (try evt.readForkById(io, gpa, arena, users_dir, &forker_id, &id)) orelse return error.NotFound; │ │46 if (fork_record.removed) return error.NotFound; │ │47 if (fork_record.event.repo_id.len != evt.event_id_size) return error.NotFound; │ │48 var target_id: [evt.event_id_size]u8 = undefined; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │49 @memcpy(&target_id, fork_record.event.repo_id); │ │50 const owner_id = fork_record.event.repo_user_id[0..evt.event_id_size]; │ │51 │ │52 - const target_record = (try evt.readRepoById(io, gpa, arena, repos_dir, owner_id, fork_record.event.repo_id)) orelse return error.NotFound;│ │52 + const target_record = (try evt.readRepoById(io, gpa, arena, users_dir, owner_id, fork_record.event.repo_id)) orelse return error.NotFound;│ │53 // a draft is as readable as the repo it targets │ │54 if (evt.Repo.roleOf(target_record, session.userId()) == .none) return error.NotFound; │ │55 const owner = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, haxy_moment, arena, owner_id)) orelse return error.NotFound; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │58 const aa = arena.allocator(); │ │59 const target_identity = try std.fmt.allocPrint(aa, "{s}/{s}", .{ owner.event.name, target_record.event.name }); │ │60 const id_hex = std.fmt.bytesToHex(id, .lower); │ │61 - const fork_path = try fork.forkPath(aa, repos_dir, &id_hex); │ │61 + const fork_path = try fork.forkPath(aa, users_dir, &forker_id, &id); │ │62 var fork_repo = try rp.Repo(.xit, .{}).open(io, arena.child_allocator, .{ .path = fork_path, .require_repo_root = true });│ │63 defer fork_repo.deinit(io, arena.child_allocator); │ │64 const fork_moment = try evt.currentMoment(.{}, &fork_repo); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │71 @memcpy(&commits_base_oid, revision.record.event.base_oid); │ │72 } │ │73 │ │74 - const target_id_hex = std.fmt.bytesToHex(target_id, .lower); │ │75 - const target_path = try std.fs.path.join(aa, &.{ repos_dir, &target_id_hex }); │ │74 + const target_path = try evt.repoPath(aa, users_dir, owner_id, &target_id); │ │75 const target_source = ui.RepoSource{ .path = target_path, .repo_kind = .xit }; │ │76 var target_repo_maybe: ?rp.Repo(.xit, .{}) = if (!target_record.removed) │ │77 rp.Repo(.xit, .{}).open(io, arena.child_allocator, target_source.localInitOpts()) catch null│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │247 } else { │ │248 const haxy_moment = session.haxy_moment orelse return error.NoMoment; │ │249 const io = session.io orelse return error.NoMoment; │ │250 - const repos_dir = session.repos_dir orelse return error.NoMoment; │ │251 - const found = (try evt.readRepoByOwnerAndName(io, arena.child_allocator, arena, haxy_moment, repos_dir, repo_identity.owner, repo_identity.name)) orelse return error.NotFound;│ │250 + const users_dir = session.users_dir orelse return error.NoMoment; │ │251 + const found = (try evt.readRepoByOwnerAndName(io, arena.child_allocator, arena, haxy_moment, users_dir, repo_identity.owner, repo_identity.name)) orelse return error.NotFound;│ │252 // a repo the session can't read doesn't exist to it │ │253 if (evt.Repo.roleOf(found.repo, session.userId()) == .none) return error.NotFound; │ │254 repo = found.repo; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │259 const owner = (try evt.User.readById(DB, hash_kind, haxy_moment, arena, repo.event.user_id)) orelse return error.NotFound;│ │260 owner_name = owner.event.name; │ │261 │ │262 - // the repo's working copy lives at <repos_dir>/<hex event id>. │ │263 - const hex = std.fmt.bytesToHex(found.event_id, .lower); │ │262 + // the repo's working copy lives in its owner's dir. │ │263 source = .{ │ │265 - .path = try std.fs.path.join(arena.allocator(), &.{ repos_dir, &hex }), │ │264 + .path = try evt.repoPath(arena.allocator(), users_dir, repo.event.user_id, &found.event_id), │ │265 .repo_kind = .xit, │ │266 }; │ │267 } │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────────────╮ │src/ui/Repo/Patches.zig│ ╰───────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────╮ │354 return id; │ │355 } │ │356 if (session.data.host_kind == .local) return error.InvalidSourceBranch;│ │357 - const repos_dir = session.repos_dir orelse return error.NotFound; │ │357 + const users_dir = session.users_dir orelse return error.NotFound; │ │358 const user_id = actor.user_id orelse return error.NotFound; │ │359 const repo_id = data.repo_id orelse return error.NotFound; │ │360 const repo_user_id = actor.repo_user_id orelse return error.NotFound; │ ╰────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │361 if (!evt.Patch.branchValid(target_branch) or !try repo_source.hasBranch(io, allocator, target_branch)) return error.InvalidTargetBranch;│ │362 - var user_repo = (try evt.openUserRepo(io, allocator, repos_dir, &user_id)) orelse return error.NotFound; │ │363 - defer user_repo.deinit(io, allocator); │ │364 - const fork_path = try fork.create(.{}, io, allocator, repos_dir, &user_repo, .{ │ │362 + const fork_path = try fork.create(.{}, io, allocator, users_dir, .{ │ │363 .id = id, │ │364 .user_id = user_id, │ │365 .repo_id = repo_id, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │377 │ │378 pub fn publishDraft(data: *const Self, session: *ui.Session, allocator: std.mem.Allocator, author: evt.CommitAuthor, id: []const u8) !void {│ │379 const io = session.io orelse return error.NotFound; │ │382 - const repos_dir = session.repos_dir orelse return error.NotFound; │ │380 + const users_dir = session.users_dir orelse return error.NotFound; │ │381 const admin_repo = session.admin_repo orelse return error.NotFound; │ │382 const repo_source = data.repo_source orelse return error.NotFound; │ │383 const repo_id = data.repo_id orelse return error.NotFound; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │385 const patch_id = evt.parseEventId(id) catch return error.NotFound; │ │386 │ │387 const id_hex = std.fmt.bytesToHex(patch_id, .lower); │ │390 - const fork_path = try fork.forkPath(allocator, repos_dir, &id_hex); │ │391 - defer allocator.free(fork_path); │ │392 - │ │388 var target_repo = try rp.Repo(.xit, .{}).open(io, allocator, repo_source.localInitOpts()); │ │389 defer target_repo.deinit(io, allocator); │ │395 - var user_repo = (try evt.openUserRepo(io, allocator, repos_dir, &user_id)) orelse return error.NotFound;│ │396 - defer user_repo.deinit(io, allocator); │ │397 - try pch.publish(.{}, io, allocator, admin_repo, &user_repo, &target_repo, fork_path, .{ │ │390 + try pch.publish(.{}, io, allocator, users_dir, admin_repo, &target_repo, .{ │ │391 .id = id_hex, │ │392 .user_id = user_id, │ │393 .repo_id = repo_id, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯