╭ changed ──────╮ │src/command.zig│ ╰───────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │22 \\a long-running server forwarding receive-pack and upload-pack. │ │23 , │ │24 .example = │ │25 - \\haxy serve --http-listen 127.0.0.1:8080 --ssh-listen 127.0.0.1:8081 --data-dir /srv/git │ │25 + \\haxy serve --http-listen 127.0.0.1:8080 --ssh-listen 127.0.0.1:8081 --wui-listen 127.0.0.1:8082 --data-dir /srv/git│ │26 , │ │27 }, │ │28 .ssh_helper => .{ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────╮ │ 96 const value_flags = std.StaticStringMap(void).initComptime(.{│ │ 97 .{"--http-listen"}, │ │ 98 .{"--ssh-listen"}, │ │ 99 + .{"--wui-listen"}, │ │100 .{"--ssh-connect"}, │ │101 .{"--data-dir"}, │ │102 .{"--service"}, │ ╰──────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────╮ │192 pub const Command = union(CommandKind) {│ │193 serve: struct { │ │194 http_listen: []const u8, │ │194 - ssh_listen: ?[]const u8, │ │195 + ssh_listen: []const u8, │ │196 + wui_listen: []const u8, │ │197 data_dir: []const u8, │ │198 tui: bool, │ │199 }, │ ╰─────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │211 │ │212 return .{ .serve = .{ │ │213 .http_listen = (cmd_args.get("--http-listen") orelse null) orelse "127.0.0.1:8080",│ │212 - .ssh_listen = (cmd_args.get("--ssh-listen") orelse null), │ │214 + .ssh_listen = (cmd_args.get("--ssh-listen") orelse null) orelse "127.0.0.1:8081", │ │215 + .wui_listen = (cmd_args.get("--wui-listen") orelse null) orelse "127.0.0.1:8082", │ │216 .data_dir = (cmd_args.get("--data-dir") orelse null) orelse ".", │ │217 .tui = cmd_args.contains("--tui"), │ │218 } }; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───╮ │src/main.zig│ ╰────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────╮ │79 try serve.run(repo_kind, any_repo_opts, io, allocator, cwd_path, .{│ │80 .http_listen = cli_cmd.serve.http_listen, │ │81 .ssh_listen = cli_cmd.serve.ssh_listen, │ │82 + .wui_listen = cli_cmd.serve.wui_listen, │ │83 .data_dir = cli_cmd.serve.data_dir, │ │84 .tui = cli_cmd.serve.tui, │ │85 }, run_opts.err); │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────╮ │src/serve.zig│ ╰─────────────╯ ╭───────────────────────────────────────╮ │4 const hash = xit.hash; │ │5 const ui = @import("./ui.zig"); │ │6 const web = @import("./web.zig"); │ │7 - │ │8 -const wui_listen = "127.0.0.1:8082";│ │7 │ │8 pub const Options = struct { │ │9 http_listen: []const u8, │ ╰───────────────────────────────────────╯ ╭────────────────────────────────╮ │12 - ssh_listen: ?[]const u8,│ │10 + ssh_listen: []const u8, │ │11 + wui_listen: []const u8, │ │12 data_dir: []const u8, │ │13 tui: bool, │ │14 }; │ ╰────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │51 │ │52 // create ssh listener │ │53 │ │55 - var ssh_server: ?std.Io.net.Server = null; │ │56 - defer if (ssh_server) |*server| server.deinit(io); │ │57 - │ │58 - if (options.ssh_listen) |ssh_listen| { │ │59 - const ssh_listen_address = try parseListenAddress(ssh_listen); │ │60 - const ssh_address = try std.Io.net.IpAddress.parseIp4(ssh_listen_address.host, ssh_listen_address.port);│ │61 - ssh_server = try ssh_address.listen(io, .{ .reuse_address = true }); │ │62 - } │ │54 + const ssh_listen_address = try parseListenAddress(options.ssh_listen); │ │55 + const ssh_address = try std.Io.net.IpAddress.parseIp4(ssh_listen_address.host, ssh_listen_address.port); │ │56 + var ssh_server = try ssh_address.listen(io, .{ .reuse_address = true }); │ │57 + defer ssh_server.deinit(io); │ │58 │ │59 // create wui listener │ │60 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │66 - const wui_listen_address = try parseListenAddress(wui_listen); │ │61 + const wui_listen_address = try parseListenAddress(options.wui_listen); │ │62 const wui_address = try std.Io.net.IpAddress.parseIp4(wui_listen_address.host, wui_listen_address.port);│ │63 var wui_server = try wui_address.listen(io, .{ .reuse_address = true }); │ │64 defer wui_server.deinit(io); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────╮ │65 │ │66 + // start task group │ │67 + │ │68 var tasks: std.Io.Group = .init;│ │69 defer tasks.cancel(io); │ │70 │ ╰────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯