╭ changed ──────╮ │src/command.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────╮ │ 8 receive_pack, │ │ 9 http_backend, │ │10 serve, │ │11 + ssh_helper, │ │12 }; │ │13 │ │14 const Help = struct {│ ╰─────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │49 .serve => .{ │ │50 .name = "serve", │ │51 .descrip = │ │51 - \\a long-running HTTP server forwarding receive-pack and upload-pack. │ │52 + \\a long-running server forwarding receive-pack and upload-pack. │ │53 + , │ │54 + .example = │ │55 + \\haxy serve --http-listen 127.0.0.1:8080 --ssh-listen 127.0.0.1:8081 --project-root /srv/git│ │56 + , │ │57 + }, │ │58 + .ssh_helper => .{ │ │59 + .name = "ssh-helper", │ │60 + .descrip = │ │61 + \\a helper run by sshd that forwards Git SSH service requests to serve. │ │62 , │ │63 .example = │ │54 - \\haxy serve --http-listen 127.0.0.1:8080 --project-root /srv/git │ │64 + \\haxy ssh-helper --ssh-connect 127.0.0.1:8081 --service upload-pack <directory> │ │65 , │ │66 }, │ │67 }; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │125 // must be included here │ │126 const value_flags = std.StaticStringMap(void).initComptime(.{ │ │127 .{"--http-listen"}, │ │128 + .{"--ssh-listen"}, │ │129 + .{"--ssh-connect"}, │ │130 .{"--project-root"}, │ │131 + .{"--service"}, │ │132 }); │ │133 │ │134 pub fn init(allocator: std.mem.Allocator, args: []const []const u8) !CommandArgs {│ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────╮ │231 http_backend, │ │232 serve: struct { │ │233 http_listen: []const u8, │ │234 + ssh_listen: ?[]const u8, │ │235 project_root: []const u8, │ │236 + }, │ │237 + ssh_helper: struct { │ │238 + ssh_connect: []const u8, │ │239 + service: ?[]const u8, │ │240 + dir: ?[]const u8, │ │241 }, │ │242 │ │243 pub fn initMaybe(cmd_args: *CommandArgs) !?Command(repo_kind, hash_kind) {│ ╰───────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │276 │ │277 return .{ .serve = .{ │ │278 .http_listen = (cmd_args.get("--http-listen") orelse null) orelse "127.0.0.1:8080", │ │279 + .ssh_listen = (cmd_args.get("--ssh-listen") orelse null), │ │280 .project_root = (cmd_args.get("--project-root") orelse null) orelse ".", │ │281 + } }; │ │282 + }, │ │283 + .ssh_helper => { │ │284 + if (cmd_args.positional_args.len > 1) return null; │ │285 + │ │286 + return .{ .ssh_helper = .{ │ │287 + .ssh_connect = (cmd_args.get("--ssh-connect") orelse null) orelse "127.0.0.1:8081", │ │288 + .service = (cmd_args.get("--service") orelse null), │ │289 + .dir = if (cmd_args.positional_args.len == 1) cmd_args.positional_args[0] else null,│ │290 } }; │ │291 }, │ │292 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯