From 7769966e2e1d1ea4f7192df3a3bf2497e89205b4 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 27 Feb 2026 04:43:11 -0500 Subject: [PATCH] feat(porttracker): add library batch-update and batch-map commands --- reports/current.md | 2 +- reports/report_0a6e6bf.md | 35 ++++++ .../Commands/LibraryCommands.cs | 108 ++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 reports/report_0a6e6bf.md diff --git a/reports/current.md b/reports/current.md index 7e510cb..4474225 100644 --- a/reports/current.md +++ b/reports/current.md @@ -1,6 +1,6 @@ # NATS .NET Porting Status Report -Generated: 2026-02-27 09:40:28 UTC +Generated: 2026-02-27 09:43:12 UTC ## Modules (12 total) diff --git a/reports/report_0a6e6bf.md b/reports/report_0a6e6bf.md new file mode 100644 index 0000000..4474225 --- /dev/null +++ b/reports/report_0a6e6bf.md @@ -0,0 +1,35 @@ +# NATS .NET Porting Status Report + +Generated: 2026-02-27 09:43:12 UTC + +## Modules (12 total) + +| Status | Count | +|--------|-------| +| verified | 12 | + +## Features (3673 total) + +| Status | Count | +|--------|-------| +| deferred | 3394 | +| verified | 279 | + +## Unit Tests (3257 total) + +| Status | Count | +|--------|-------| +| deferred | 2680 | +| n_a | 187 | +| verified | 390 | + +## Library Mappings (36 total) + +| Status | Count | +|--------|-------| +| mapped | 36 | + + +## Overall Progress + +**868/6942 items complete (12.5%)** diff --git a/tools/NatsNet.PortTracker/Commands/LibraryCommands.cs b/tools/NatsNet.PortTracker/Commands/LibraryCommands.cs index 7cfb90f..e133ad9 100644 --- a/tools/NatsNet.PortTracker/Commands/LibraryCommands.cs +++ b/tools/NatsNet.PortTracker/Commands/LibraryCommands.cs @@ -86,10 +86,118 @@ public static class LibraryCommands libraryCommand.Add(listCmd); libraryCommand.Add(mapCmd); libraryCommand.Add(suggestCmd); + libraryCommand.Add(CreateBatchUpdate(dbOption)); + libraryCommand.Add(CreateBatchMap(dbOption)); return libraryCommand; } + private static Command CreateBatchUpdate(Option dbOption) + { + var cmd = new Command("batch-update", "Bulk update library status"); + var idsOpt = BatchFilters.IdsOption(); + var statusOpt = BatchFilters.StatusOption(); + var executeOpt = BatchFilters.ExecuteOption(); + var setStatus = new Option("--set-status") { Description = "New status to set", Required = true }; + var setNotes = new Option("--set-notes") { Description = "Usage notes to set" }; + + cmd.Add(idsOpt); + cmd.Add(statusOpt); + cmd.Add(executeOpt); + cmd.Add(setStatus); + cmd.Add(setNotes); + + cmd.SetAction(parseResult => + { + var dbPath = parseResult.GetValue(dbOption)!; + var ids = parseResult.GetValue(idsOpt); + var status = parseResult.GetValue(statusOpt); + var execute = parseResult.GetValue(executeOpt); + var newStatus = parseResult.GetValue(setStatus)!; + var notes = parseResult.GetValue(setNotes); + + if (string.IsNullOrWhiteSpace(ids) && string.IsNullOrWhiteSpace(status)) + { + Console.WriteLine("Error: at least one filter (--ids, --status) is required."); + return; + } + + using var db = new Database(dbPath); + var (whereClause, filterParams) = BatchFilters.BuildWhereClause(ids, null, status); + + var setClauses = new List { "status = @newStatus" }; + var updateParams = new List<(string, object?)> { ("@newStatus", newStatus) }; + if (notes is not null) + { + setClauses.Add("dotnet_usage_notes = @newNotes"); + updateParams.Add(("@newNotes", notes)); + } + + BatchFilters.PreviewOrExecute(db, "library_mappings", + "id, go_import_path, status, dotnet_usage_notes", + string.Join(", ", setClauses), updateParams, + whereClause, filterParams, execute); + }); + + return cmd; + } + + private static Command CreateBatchMap(Option dbOption) + { + var cmd = new Command("batch-map", "Bulk map libraries to .NET packages"); + var idsOpt = BatchFilters.IdsOption(); + var statusOpt = BatchFilters.StatusOption(); + var executeOpt = BatchFilters.ExecuteOption(); + var setPackage = new Option("--set-package") { Description = ".NET NuGet package" }; + var setNamespace = new Option("--set-namespace") { Description = ".NET namespace" }; + var setNotes = new Option("--set-notes") { Description = "Usage notes" }; + + cmd.Add(idsOpt); + cmd.Add(statusOpt); + cmd.Add(executeOpt); + cmd.Add(setPackage); + cmd.Add(setNamespace); + cmd.Add(setNotes); + + cmd.SetAction(parseResult => + { + var dbPath = parseResult.GetValue(dbOption)!; + var ids = parseResult.GetValue(idsOpt); + var status = parseResult.GetValue(statusOpt); + var execute = parseResult.GetValue(executeOpt); + var package = parseResult.GetValue(setPackage); + var ns = parseResult.GetValue(setNamespace); + var notes = parseResult.GetValue(setNotes); + + if (string.IsNullOrWhiteSpace(ids) && string.IsNullOrWhiteSpace(status)) + { + Console.WriteLine("Error: at least one filter (--ids, --status) is required."); + return; + } + if (package is null && ns is null && notes is null) + { + Console.WriteLine("Error: at least one of --set-package, --set-namespace, --set-notes is required."); + return; + } + + using var db = new Database(dbPath); + var (whereClause, filterParams) = BatchFilters.BuildWhereClause(ids, null, status); + + var setClauses = new List(); + var updateParams = new List<(string, object?)>(); + if (package is not null) { setClauses.Add("dotnet_package = @setPackage"); updateParams.Add(("@setPackage", package)); } + if (ns is not null) { setClauses.Add("dotnet_namespace = @setNamespace"); updateParams.Add(("@setNamespace", ns)); } + if (notes is not null) { setClauses.Add("dotnet_usage_notes = @setNotes"); updateParams.Add(("@setNotes", notes)); } + + BatchFilters.PreviewOrExecute(db, "library_mappings", + "id, go_import_path, status, dotnet_package, dotnet_namespace", + string.Join(", ", setClauses), updateParams, + whereClause, filterParams, execute); + }); + + return cmd; + } + private static string Truncate(string? s, int maxLen) { if (s is null) return "";