╭ changed ────────╮ │src/serve_ssh.zig│ ╰─────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────╮ │47 sess.exemptFromIdleTimeout(); │ │48 try runTuiSession(self, sess, pty); │ │49 }, │ │50 - .exec => |command| { │ │51 - try runGitSession(self, sess, command);│ │50 + .exec => |exec| { │ │51 + try runGitSession(self, sess, exec); │ │52 }, │ │53 } │ │54 } │ ╰───────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │358 } │ │359 }; │ │360 │ │361 -fn runGitSession(handler: *const SessionHandler, sess: *ssh.SessionCtx, command: []const u8) !void { │ │361 +fn runGitSession(handler: *const SessionHandler, sess: *ssh.SessionCtx, exec: ssh.Request.Exec) !void { │ │362 const allocator = sess.conn.allocator; │ │363 const io = sess.conn.io; │ │364 + const protocol_version = xit.net_server_common.parseProtocolVersion(exec.git_protocol); │ │365 │ │365 - const parsed = parseGitCommand(allocator, command) catch return writeError(sess, "unsupported command (expected git-upload-pack or git-receive-pack)"); │ │366 + const parsed = parseGitCommand(allocator, exec.command) catch return writeError(sess, "unsupported command (expected git-upload-pack or git-receive-pack)");│ │367 defer parsed.deinit(allocator); │ │368 const path = std.mem.trimStart(u8, parsed.dir, "/"); │ │369 const fork_prefix = "fork/"; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │398 var writer = ssh.SessionWriter.init(sess, &writer_buf); │ │399 if (parsed.service == .upload_pack) { │ │400 switch (draft) { │ │400 - inline else => |*repo| try repo.uploadPack(io, allocator, &reader.interface, &writer.interface, .{}), │ │401 + inline else => |*repo| try repo.uploadPack(io, allocator, &reader.interface, &writer.interface, .{ .protocol_version = protocol_version }), │ │402 } │ │403 } else { │ │404 const target = (try evt.Repo.readByOwnerAndName(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, owner_repo.owner, owner_repo.name)) orelse│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │446 }; │ │447 defer allocator.free(repo_path); │ │448 │ │448 - if (try serveIfExists(repo_path, handler.repo_root_path, sess, io, allocator, parsed.service, handler.err)) { │ │449 + if (try serveIfExists(repo_path, handler.repo_root_path, sess, io, allocator, parsed.service, protocol_version, handler.err)) {│ │450 try sess.exit(0); │ │451 return; │ │452 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │456 // create the on-disk repo for the just-minted event and serve the push │ │457 var repo = try createRepo(any_repo_opts.toRepoOpts(), io, allocator, repo_path); │ │458 defer repo.deinit(io, allocator); │ │458 - try servePack(repo.self_repo_opts, &repo, handler.repo_root_path, sess, io, allocator, parsed.service, handler.err); │ │459 + try servePack(repo.self_repo_opts, &repo, handler.repo_root_path, sess, io, allocator, parsed.service, protocol_version, handler.err);│ │460 try sess.exit(0); │ │461 } │ │462 │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │468 io: std.Io, │ │469 allocator: std.mem.Allocator, │ │470 service: GitService, │ │471 + protocol_version: xit.net_server_common.ProtocolVersion, │ │472 error_writer: *std.Io.Writer, │ │473 ) !bool { │ │474 // a bare open() creates the directory while probing for the repo, so only│ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │483 defer any_repo.deinit(io, allocator); │ │484 │ │485 switch (any_repo) { │ │484 - inline else => |*repo| try servePack(repo.self_repo_opts, repo, repo_root_path, sess, io, allocator, service, error_writer), │ │486 + inline else => |*repo| try servePack(repo.self_repo_opts, repo, repo_root_path, sess, io, allocator, service, protocol_version, error_writer),│ │487 } │ │488 return true; │ │489 } │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────╮ │512 io: std.Io, │ │513 allocator: std.mem.Allocator, │ │514 service: GitService, │ │515 + protocol_version: xit.net_server_common.ProtocolVersion,│ │516 error_writer: *std.Io.Writer, │ │517 ) !void { │ │518 var session_reader_buf: [4096]u8 = undefined; │ ╰─────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │521 var session_writer = ssh.SessionWriter.init(sess, &session_writer_buf); │ │522 │ │523 switch (service) { │ │521 - .upload_pack => try repo.uploadPack(io, allocator, &session_reader.interface, &session_writer.interface, .{}), │ │522 - .receive_pack => try push.receivePackAndConsume(repo_opts, io, allocator, repo, &session_reader.interface, &session_writer.interface, .{}, repo_root_path, error_writer), │ │524 + .upload_pack => try repo.uploadPack(io, allocator, &session_reader.interface, &session_writer.interface, .{ .protocol_version = protocol_version }), │ │525 + .receive_pack => try push.receivePackAndConsume(repo_opts, io, allocator, repo, &session_reader.interface, &session_writer.interface, .{ .protocol_version = protocol_version }, repo_root_path, error_writer),│ │526 } │ │527 │ │528 // flush whatever the pack op buffered into our writer adapter │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯