feat(porttracker): add feature batch-update and batch-map commands

This commit is contained in:
Joseph Doherty
2026-02-27 04:42:17 -05:00
parent 0a6e6bf60d
commit 2a900bf56a
3 changed files with 150 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
# NATS .NET Porting Status Report # NATS .NET Porting Status Report
Generated: 2026-02-27 09:40:28 UTC Generated: 2026-02-27 09:42:18 UTC
## Modules (12 total) ## Modules (12 total)

35
reports/report_0a6e6bf.md Normal file
View File

@@ -0,0 +1,35 @@
# NATS .NET Porting Status Report
Generated: 2026-02-27 09:42:18 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%)**

View File

@@ -171,10 +171,124 @@ public static class FeatureCommands
featureCommand.Add(updateCmd); featureCommand.Add(updateCmd);
featureCommand.Add(mapCmd); featureCommand.Add(mapCmd);
featureCommand.Add(naCmd); featureCommand.Add(naCmd);
featureCommand.Add(CreateBatchUpdate(dbOption));
featureCommand.Add(CreateBatchMap(dbOption));
return featureCommand; return featureCommand;
} }
private static Command CreateBatchUpdate(Option<string> dbOption)
{
var cmd = new Command("batch-update", "Bulk update feature status");
var idsOpt = BatchFilters.IdsOption();
var moduleOpt = BatchFilters.ModuleOption();
var statusOpt = BatchFilters.StatusOption();
var executeOpt = BatchFilters.ExecuteOption();
var setStatus = new Option<string>("--set-status") { Description = "New status to set", Required = true };
var setNotes = new Option<string?>("--set-notes") { Description = "Notes to set" };
cmd.Add(idsOpt);
cmd.Add(moduleOpt);
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 module = parseResult.GetValue(moduleOpt);
var status = parseResult.GetValue(statusOpt);
var execute = parseResult.GetValue(executeOpt);
var newStatus = parseResult.GetValue(setStatus)!;
var notes = parseResult.GetValue(setNotes);
if (string.IsNullOrWhiteSpace(ids) && module is null && string.IsNullOrWhiteSpace(status))
{
Console.WriteLine("Error: at least one filter (--ids, --module, --status) is required.");
return;
}
using var db = new Database(dbPath);
var (whereClause, filterParams) = BatchFilters.BuildWhereClause(ids, module, status);
var setClauses = new List<string> { "status = @newStatus" };
var updateParams = new List<(string, object?)> { ("@newStatus", newStatus) };
if (notes is not null)
{
setClauses.Add("notes = @newNotes");
updateParams.Add(("@newNotes", notes));
}
BatchFilters.PreviewOrExecute(db, "features",
"id, name, status, module_id, notes",
string.Join(", ", setClauses), updateParams,
whereClause, filterParams, execute);
});
return cmd;
}
private static Command CreateBatchMap(Option<string> dbOption)
{
var cmd = new Command("batch-map", "Bulk map features to .NET methods");
var idsOpt = BatchFilters.IdsOption();
var moduleOpt = BatchFilters.ModuleOption();
var statusOpt = BatchFilters.StatusOption();
var executeOpt = BatchFilters.ExecuteOption();
var setProject = new Option<string?>("--set-project") { Description = ".NET project" };
var setClass = new Option<string?>("--set-class") { Description = ".NET class" };
var setMethod = new Option<string?>("--set-method") { Description = ".NET method" };
cmd.Add(idsOpt);
cmd.Add(moduleOpt);
cmd.Add(statusOpt);
cmd.Add(executeOpt);
cmd.Add(setProject);
cmd.Add(setClass);
cmd.Add(setMethod);
cmd.SetAction(parseResult =>
{
var dbPath = parseResult.GetValue(dbOption)!;
var ids = parseResult.GetValue(idsOpt);
var module = parseResult.GetValue(moduleOpt);
var status = parseResult.GetValue(statusOpt);
var execute = parseResult.GetValue(executeOpt);
var project = parseResult.GetValue(setProject);
var cls = parseResult.GetValue(setClass);
var method = parseResult.GetValue(setMethod);
if (string.IsNullOrWhiteSpace(ids) && module is null && string.IsNullOrWhiteSpace(status))
{
Console.WriteLine("Error: at least one filter (--ids, --module, --status) is required.");
return;
}
if (project is null && cls is null && method is null)
{
Console.WriteLine("Error: at least one of --set-project, --set-class, --set-method is required.");
return;
}
using var db = new Database(dbPath);
var (whereClause, filterParams) = BatchFilters.BuildWhereClause(ids, module, status);
var setClauses = new List<string>();
var updateParams = new List<(string, object?)>();
if (project is not null) { setClauses.Add("dotnet_project = @setProject"); updateParams.Add(("@setProject", project)); }
if (cls is not null) { setClauses.Add("dotnet_class = @setClass"); updateParams.Add(("@setClass", cls)); }
if (method is not null) { setClauses.Add("dotnet_method = @setMethod"); updateParams.Add(("@setMethod", method)); }
BatchFilters.PreviewOrExecute(db, "features",
"id, name, status, dotnet_project, dotnet_class, dotnet_method",
string.Join(", ", setClauses), updateParams,
whereClause, filterParams, execute);
});
return cmd;
}
private static string Truncate(string? s, int maxLen) private static string Truncate(string? s, int maxLen)
{ {
if (s is null) return ""; if (s is null) return "";