Skip to content

Commit 1ae6c0f

Browse files
committed
Honor JSON errors for workspace commands #1709 #1710
1 parent 582323b commit 1ae6c0f

3 files changed

Lines changed: 43 additions & 4 deletions

File tree

src/CodeIndex/Cli/ProgramRunner.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,12 @@ internal static int Run(
254254
"validate-config" => CdidxConfigFile.RunValidate(subArgs, jsonOptions),
255255
"config" => subArgs.Length > 0 && subArgs[0] == "show"
256256
? CdidxConfigFile.RunShow(subArgs[1..], jsonOptions)
257-
: ShowError(args, "Unknown config command: use `cdidx config show`."),
257+
: CommandErrorWriter.WriteJsonOrHuman(
258+
ContainsJsonOutputFlag(subArgs),
259+
jsonOptions,
260+
"Unknown config command: use `cdidx config show`.",
261+
CommandExitCodes.UsageError,
262+
"use `cdidx config show`."),
258263
"workspace" => WorkspaceCommandRunner.Run(subArgs, jsonOptions),
259264
"db" => DbCommandRunner.RunIntegrityCheck(subArgs, jsonOptions),
260265
"report" => ReportCommandRunner.Run(subArgs, jsonOptions, appVersion),

src/CodeIndex/Cli/WorkspaceCommandRunner.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal static int Run(string[] args, JsonSerializerOptions jsonOptions)
1717
"status" => List(json, jsonOptions),
1818
"current" => Current(json, jsonOptions),
1919
"use" => Use(args[1..], json, jsonOptions),
20-
_ => CommandErrorWriter.Write("Unknown workspace command.", CommandExitCodes.UsageError, "use `cdidx workspace list`, `cdidx workspace use <name>`, or `cdidx workspace current`.")
20+
_ => CommandErrorWriter.WriteJsonOrHuman(json, jsonOptions, "Unknown workspace command.", CommandExitCodes.UsageError, "use `cdidx workspace list`, `cdidx workspace use <name>`, or `cdidx workspace current`.")
2121
};
2222
}
2323

@@ -61,7 +61,7 @@ private static int Current(bool json, JsonSerializerOptions jsonOptions)
6161
private static int Use(string[] args, bool json, JsonSerializerOptions jsonOptions)
6262
{
6363
if (args.Length != 1)
64-
return CommandErrorWriter.Write("workspace use requires a name.", CommandExitCodes.UsageError, "run `cdidx workspace use <name>` from a manifest member or pass `default`.");
64+
return CommandErrorWriter.WriteJsonOrHuman(json, jsonOptions, "workspace use requires a name.", CommandExitCodes.UsageError, "run `cdidx workspace use <name>` from a manifest member or pass `default`.");
6565

6666
var name = args[0];
6767
var manifest = WorkspaceManifestLoader.Find(Environment.CurrentDirectory);
@@ -70,7 +70,7 @@ private static int Use(string[] args, bool json, JsonSerializerOptions jsonOptio
7070
? null
7171
: manifest?.Members.FirstOrDefault(m => string.Equals(Path.GetFileName(m.Path), name, StringComparison.OrdinalIgnoreCase));
7272
if (manifest != null && member == null && !useDefault)
73-
return CommandErrorWriter.Write("workspace member was not found.", CommandExitCodes.UsageError, "run `cdidx workspace list` and pass one of the listed member directory names.");
73+
return CommandErrorWriter.WriteJsonOrHuman(json, jsonOptions, "workspace member was not found.", CommandExitCodes.UsageError, "run `cdidx workspace list` and pass one of the listed member directory names.");
7474

7575
var root = member?.Path ?? Environment.CurrentDirectory;
7676
var dbPath = member?.DbPath ?? DbPathResolver.ResolveForIndex(root, explicitDbPath: null);

tests/CodeIndex.Tests/WorkspaceCommandRunnerTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,40 @@ public void WorkspaceList_ReadsManifestMembers()
4444
}
4545
}
4646

47+
[Fact]
48+
public void WorkspaceErrors_HonorJsonFlag()
49+
{
50+
var (exitCode, stdout, stderr) = ConsoleCapture.Capture(() => WorkspaceCommandRunner.Run(["nope", "--json"], _jsonOptions));
51+
52+
Assert.Equal(CommandExitCodes.UsageError, exitCode);
53+
Assert.Contains("\"status\":\"error\"", stdout);
54+
Assert.Contains("Unknown workspace command", stdout);
55+
Assert.DoesNotContain("Unknown workspace command", stderr);
56+
}
57+
58+
[Fact]
59+
public void ConfigErrors_HonorJsonFlag()
60+
{
61+
var configHome = TestProjectHelper.CreateTempProject("cdidx_config_error_config");
62+
try
63+
{
64+
using var env = EnvironmentVariableScope.Capture(ActiveWorkspace.EnvironmentVariable, "XDG_CONFIG_HOME");
65+
Environment.SetEnvironmentVariable(ActiveWorkspace.EnvironmentVariable, null);
66+
Environment.SetEnvironmentVariable("XDG_CONFIG_HOME", configHome);
67+
68+
var (exitCode, stdout, stderr) = ConsoleCapture.Capture(() => ProgramRunner.Run(["config", "nope", "--json"], _jsonOptions));
69+
70+
Assert.Equal(CommandExitCodes.UsageError, exitCode);
71+
Assert.Contains("\"status\":\"error\"", stdout);
72+
Assert.Contains("Unknown config command", stdout);
73+
Assert.DoesNotContain("Unknown config command", stderr);
74+
}
75+
finally
76+
{
77+
TestProjectHelper.DeleteDirectory(configHome);
78+
}
79+
}
80+
4781
[Fact]
4882
public void ConfigShow_PrintsPrecedence()
4983
{

0 commit comments

Comments
 (0)