╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────╮ │src/test/net.zig│ ╰────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │712 const moment = try evt.currentMoment(.{}, &target); │ │713 const patch = (try evt.Patch.readById(evt.EventDB(.sha1), .sha1, moment, &arena, &fork_id)) orelse return error.NotFound; │ │714 try std.testing.expectEqualStrings("edited feature", patch.event.title); │ │705 - try std.testing.expectEqualStrings(&std.fmt.bytesToHex(second_revision_id, .lower), &(patch.event.revision orelse return error.NotFound).id);│ │715 + const selected = patch.event.revision orelse return error.NotFound; │ │716 + try std.testing.expectEqualStrings(&std.fmt.bytesToHex(second_revision_id, .lower), &selected.id); │ │717 + try std.testing.expectEqualStrings(&second_source_oid, selected.source_oid); │ │718 + try std.testing.expectEqualStrings("refs/heads/feature", selected.target_ref); │ │719 } │ │720 │ │721 // │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │729 try client.add(io, allocator, &.{"feature.txt"}); │ │730 break :blk try client.commit(io, allocator, .{ .message = "rejected revision" }); │ │731 }; │ │719 - const extra_ref_rejected = if (client.push(io, allocator, "patch", "master:patch", false, .{ │ │732 + const extra_ref_rejected = if (client.push(io, allocator, "patch-to-feature", "master:patch", false, .{│ │733 .refspecs = &.{"refs/heads/master:refs/heads/extra"}, │ │734 .wire = .{ .ssh = .{ .command = ssh_cmd } }, │ │735 })) |_| false else |_| true; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │755 defer target.deinit(io, allocator); │ │756 try evt.remove(.repo, .xit, .{}, io, allocator, &target, &fork_id, .patch, .{ .name = "admin", .email = "admin@example.test" });│ │757 } │ │745 - try client.push(io, allocator, "patch", "master:patch", false, .{ .wire = .{ .ssh = .{ .command = ssh_cmd } } }); │ │758 + try client.push(io, allocator, "patch-to-feature", "master:patch", false, .{ .wire = .{ .ssh = .{ .command = ssh_cmd } } }); │ │759 { │ │760 var target = try rp.Repo(.xit, .{}).open(io, allocator, .{ .path = target_path }); │ │761 defer target.deinit(io, allocator); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │786 } │ │787 const merge_parents = [_][hash.hexLen(.sha1)]u8{ third_source_oid, second_source_oid }; │ │788 _ = try client.commit(io, allocator, .{ .message = "merge patch", .parent_oids = &merge_parents }); │ │776 - try client.push(io, allocator, "origin", "master:master", false, .{ .wire = .{ .ssh = .{ .command = ssh_cmd } } }); │ │789 + try client.push(io, allocator, "origin", "master:feature", false, .{ .wire = .{ .ssh = .{ .command = ssh_cmd } } });│ │790 { │ │791 var target = try rp.Repo(.xit, .{}).open(io, allocator, .{ .path = target_path }); │ │792 defer target.deinit(io, allocator); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────╮ │63 │ │64 const cwd_path = try std.process.currentPathAlloc(io, allocator); │ │65 defer allocator.free(cwd_path); │ │66 + const key_path = try std.fs.path.join(allocator, &.{ cwd_path, temp_dir_name, "key" });│ │67 + defer allocator.free(key_path); │ │68 │ │69 var cli = false; │ │70 var serve_args: std.ArrayList([]const u8) = .empty; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │80 } │ │81 } │ │82 var serve_options = try hx.command.parseServeOptions(allocator, serve_args.items); │ │83 + const git_ssh_prefix = if (builtin.mode == .Debug) │ │84 + try std.fmt.allocPrint(allocator, "GIT_SSH_COMMAND='ssh -i \"{s}\" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR' \\\r\n", .{key_path})│ │85 + else │ │86 + ""; │ │87 + defer if (git_ssh_prefix.len != 0) allocator.free(git_ssh_prefix); │ │88 + serve_options.git_ssh_prefix = git_ssh_prefix; │ │89 │ │90 const server_path = if (std.mem.eql(u8, serve_options.data_dir, ".")) │ │91 try std.fs.path.join(allocator, &.{ cwd_path, temp_dir_name, "server" }) │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ │850 break :blk try ui.Session.init(&session_arena, &repo, .{ .user_id = &admin_user_id });│ │851 }; │ │852 session.is_terminal = true; │ │853 + session.data.git_ssh_prefix = git_ssh_prefix; │ │854 │ │855 // start the server │ │856 │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │874 var stderr_writer = std.Io.File.stderr().writer(io, &.{}); │ │875 const run_opts = hx.main.RunOpts{ .out = &stdout_writer.interface, .err = &stderr_writer.interface };│ │876 │ │868 - const key_path = try std.fs.path.join(allocator, &.{ cwd_path, temp_dir_name, "key" }); │ │869 - defer allocator.free(key_path); │ │870 - │ │877 const Runnable = struct { │ │878 io: std.Io, │ │879 key_path: []const u8, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────╮ │21 pub const Title = @import("./ui/Title.zig"); │ │22 pub const SubTitle = @import("./ui/SubTitle.zig"); │ │23 pub const Quit = @import("./ui/Quit.zig"); │ │24 -pub const GitRemote = @import("./ui/GitRemote.zig"); │ │24 +pub const CopyableText = @import("./ui/CopyableText.zig");│ │25 pub const Unauthorized = @import("./ui/Unauthorized.zig");│ │26 │ │27 pub const clipped_bottom_label_max_len = 10 * 4; │ ╰──────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────╮ │1425 // are not shown. │ │1426 git_http_port: ?u16 = null, │ │1427 git_ssh_port: ?u16 = null, │ │1428 + git_ssh_prefix: []const u8 = "", │ │1429 // true when this session views a single local repo. unlike `local` │ │1430 // (the host-side filesystem source) this travels in the snapshot, so │ │1431 // the wasm side also parses elided link urls and hides the multi-user│ ╰────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯