╭ changed ─────────────╮ │src/event/PatchRev.zig│ ╰──────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │44 timestamp: u64, │ │45 ) !struct { event: evt.EventWithId, revision: evt.Patch.Revision } { │ │46 const allocator = arena.allocator(); │ │47 - var base_object = try obj.Object(repo_kind, repo_opts).initCommit(state.readOnly(), io, allocator, base_oid); │ │48 - defer base_object.deinit(); │ │47 + const base_tree = if (std.mem.allEqual(u8, base_oid, '0')) blk: { │ │48 + // a merge into a newly created branch starts from an empty tree │ │49 + var reader = std.Io.Reader.fixed(""); │ │50 + var oid: [hash.byteLen(repo_opts.hash)]u8 = undefined; │ │51 + try obj.writeObject(repo_kind, repo_opts, state, io, allocator, &reader, .{ .kind = .tree, .size = 0 }, &oid); │ │52 + break :blk std.fmt.bytesToHex(oid, .lower); │ │53 + } else blk: { │ │54 + var base_object = try obj.Object(repo_kind, repo_opts).initCommit(state.readOnly(), io, allocator, base_oid); │ │55 + defer base_object.deinit(); │ │56 + break :blk base_object.content.commit.tree; │ │57 + }; │ │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 };│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │65 io.random(&id); │ │66 const id_hex = std.fmt.bytesToHex(id, .lower); │ │67 const entries = try allocator.alloc(evt.EventTreeEntry, 2); │ │59 - entries[0] = .{ .tree = .{ .name = "base", .oid = try allocator.dupe(u8, &base_object.content.commit.tree) } }; │ │68 + entries[0] = .{ .tree = .{ .name = "base", .oid = try allocator.dupe(u8, &base_tree) } }; │ │69 entries[1] = .{ .tree = .{ .name = "head", .oid = try allocator.dupe(u8, &source_object.content.commit.tree) } }; │ │70 return .{ │ │71 .event = .{ .id = id_hex, .author = author, .timestamp = timestamp, .tree_entries = entries, .event = .{ .patchrev = revision } },│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────╮ │134 .author = author, │ │135 .committer = committer, │ │136 .message = event.message, │ │128 - .parent_oids = &parent_oids, │ │137 + .parent_oids = if (std.mem.allEqual(u8, &base_oid, '0')) &.{} else &parent_oids,│ │138 .timestamp = timestamp, │ │139 }, head_tree_oid); │ │140 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────╯