╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────────╮ │src/event/PatchRev.zig│ ╰──────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │58 var source_object = try obj.Object(repo_kind, repo_opts).initCommit(state.readOnly(), io, allocator, source_oid); │ │59 defer source_object.deinit(); │ │60 const revision = Self{ .base_oid = try allocator.dupe(u8, base_oid), .source_oid = try allocator.dupe(u8, source_oid), .message = message }; │ │61 - const identity = try std.fmt.allocPrint(allocator, "{s} <{s}>", .{ author.name, author.email }); │ │61 + const identity = try allocator.print("{s} <{s}>", .{ author.name, author.email }); │ │62 defer allocator.free(identity); │ │63 const squash = try writeSquashCommit(repo_kind, repo_opts, state, io, allocator, revision, &source_object.content.commit.tree, identity, identity, timestamp);│ │64 var id: [evt.event_id_size]u8 = undefined; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────╮ │src/event/Repo.zig│ ╰──────────────────╯ ╭────────────────────────────────────────────────────────────────────────────╮ │32 owner, │ │33 │ │34 pub fn atLeast(self: Role, min: Role) bool { │ │35 - return @intFromEnum(self) >= @intFromEnum(min); │ │35 + return @backingInt(self) >= @backingInt(min); │ │36 } │ │37 │ │38 // whether a user may change an event: anyone's with the write role,│ ╰────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───╮ │src/fork.zig│ ╰────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │30 │ │31 // a fork's path, inside its forker's dir │ │32 pub fn forkPath(allocator: std.mem.Allocator, users_dir: []const u8, forker_id: *const [evt.event_id_size]u8, fork_id: *const [evt.event_id_size]u8) ![]u8 {│ │33 - return try std.fs.path.join(allocator, &.{ users_dir, &std.fmt.bytesToHex(forker_id.*, .lower), "forks", &std.fmt.bytesToHex(fork_id.*, .lower) }); │ │33 + return try std.Io.Dir.path.join(allocator, &.{ users_dir, &std.fmt.bytesToHex(forker_id.*, .lower), "forks", &std.fmt.bytesToHex(fork_id.*, .lower) }); │ │34 } │ │35 │ │36 const forker_section = "haxy"; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │112 if ((try target_repo.readRef(io, .{ .kind = .head, .name = input.target_branch })) == null) return error.TargetNotFound;│ │113 │ │114 // create the fork repo dir │ │115 - const forks_path = std.fs.path.dirname(fork_path) orelse return error.InvalidPatchDraft; │ │115 + const forks_path = std.Io.Dir.path.dirname(fork_path) orelse return error.InvalidPatchDraft; │ │116 var forks_dir = try std.Io.Dir.cwd().createDirPathOpen(io, forks_path, .{}); │ │117 defer forks_dir.close(io); │ │118 - const fork_name = std.fs.path.basename(fork_path); │ │118 + const fork_name = std.Io.Dir.path.basename(fork_path); │ │119 forks_dir.createDir(io, fork_name, .default_dir) catch |err| switch (err) { │ │120 error.PathAlreadyExists => return error.InvalidPatchDraft, │ │121 else => |other| return other, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │196 const na = names_arena.allocator(); │ │197 var names: std.ArrayList([]const u8) = .empty; │ │198 for (section.keys()) |key| { │ │199 - if (std.mem.startsWith(u8, key, forker_prefix)) try names.append(na, try std.fmt.allocPrint(na, forker_section ++ ".{s}", .{key}));│ │199 + if (std.mem.startsWith(u8, key, forker_prefix)) try names.append(na, try na.print(forker_section ++ ".{s}", .{key})); │ │200 } │ │201 for (names.items) |name| try config.remove(state, ctx.io, .{ .name = name }); │ │202 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────╮ │src/patch.zig│ ╰─────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1088 input: MergeInput, │ │1089 ) !void { │ │1090 const patch_id = try evt.parseEventId(&input.id); │ │1091 - errdefer |err| { │ │1091 + mergeInner(repo_opts, io, allocator, users_dir, target_repo, input, patch_id) catch |err| {│ │1092 if (err == error.PatchDataUnavailable or err == error.PatchOutOfDate) { │ │1093 refreshMergeability(repo_opts, io, allocator, target_repo, users_dir, patch_id); │ │1094 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────╮ │1095 - } │ │1095 + return err; │ │1096 + }; │ │1097 +} │ │1098 + │ │1099 +fn mergeInner( │ │1100 + comptime repo_opts: rp.RepoOpts(.xit), │ │1101 + io: std.Io, │ │1102 + allocator: std.mem.Allocator, │ │1103 + users_dir: []const u8, │ │1104 + target_repo: *rp.Repo(.xit, repo_opts), │ │1105 + input: MergeInput, │ │1106 + patch_id: [evt.event_id_size]u8, │ │1107 +) !void { │ │1108 var arena = std.heap.ArenaAllocator.init(allocator);│ │1109 defer arena.deinit(); │ │1110 │ ╰──────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1135 .squash => selected.squash_oid, │ │1136 .source => selected.source_oid, │ │1137 }) catch return error.InvalidPatch; │ │1126 - const identity = try std.fmt.allocPrint(arena.allocator(), "{s} <{s}>", .{ input.author.name, input.author.email });│ │1138 + const identity = try arena.allocator().print("{s} <{s}>", .{ input.author.name, input.author.email }); │ │1139 │ │1140 // merge the code and events in one target transaction │ │1141 { │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────╮ │src/serve.zig│ ╰─────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │55 ) !void { │ │56 // create the data dir │ │57 │ │58 - const data_dir_path = try std.fs.path.resolve(allocator, &.{ cwd_path, options.data_dir }); │ │58 + const data_dir_path = try std.Io.Dir.path.resolveAlloc(allocator, &.{ cwd_path, options.data_dir });│ │59 defer allocator.free(data_dir_path); │ │60 │ │61 const data_dir = try std.Io.Dir.cwd().createDirPathOpen(io, data_dir_path, .{}); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────╮ │63 │ │64 // create the users dir │ │65 │ │66 - const users_dir = try std.fs.path.resolve(allocator, &.{ data_dir_path, "users" }); │ │66 + const users_dir = try std.Io.Dir.path.resolveAlloc(allocator, &.{ data_dir_path, "users" });│ │67 defer allocator.free(users_dir); │ │68 │ │69 try std.Io.Dir.cwd().createDirPath(io, users_dir); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯