╭ changed ────────╮ │src/serve_ssh.zig│ ╰─────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │317 │ │318 const parsed = parseGitCommand(allocator, command) catch return writeError(sess, "unsupported command (expected git-upload-pack or git-receive-pack)");│ │319 defer parsed.deinit(allocator); │ │320 - const repo_prefix = "/repo/"; │ │321 - const repo_identity = if (std.mem.startsWith(u8, parsed.dir, repo_prefix)) parsed.dir[repo_prefix.len..] else parsed.dir; │ │320 + const path = std.mem.trimStart(u8, parsed.dir, "/"); │ │321 + const fork_prefix = "fork/"; │ │322 │ │323 - if (fork.parseRoute(repo_identity)) |route| { │ │323 + if (std.mem.startsWith(u8, path, fork_prefix)) { │ │324 + const route = fork.parseRoute(path[fork_prefix.len..]) orelse return writeError(sess, "invalid fork path"); │ │325 const owner_repo = evt.parseOwnerRepoPath(route.identity) orelse return writeError(sess, "repo path must be <owner>/<repo>"); │ │326 if (parsed.service == .receive_pack and !xit.ref.validateName(route.target)) return writeError(sess, "invalid target branch"); │ │327 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │376 return; │ │377 } │ │378 │ │379 + const repo_prefix = "repo/"; │ │380 + const repo_identity = if (std.mem.startsWith(u8, path, repo_prefix)) path[repo_prefix.len..] else path;│ │381 + │ │382 const create_if_missing = parsed.service == .receive_pack; │ │383 const any_repo_opts: rp.AnyRepoOpts(.xit) = .{}; │ │384 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯