Skip to content

Commit 1aa5980

Browse files
committed
feat: add status bar notification for invalid Mise configuration files
1 parent 294a79b commit 1aa5980

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

src/miseExtension.ts

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ import {
6565
} from "./providers/toolsProvider";
6666
import { VsCodeTaskProvider } from "./providers/vsCodeTaskProvider";
6767
import { WorkspaceDecorationProvider } from "./providers/WorkspaceDecorationProvider";
68-
import { displayPathRelativeTo } from "./utils/fileUtils";
68+
import { displayPathRelativeTo, expandPath } from "./utils/fileUtils";
6969
import { truncateStr } from "./utils/fn";
7070
import { logger } from "./utils/logger";
7171
import { allowedFileTaskDirs } from "./utils/miseUtilts";
@@ -83,6 +83,10 @@ export class MiseExtension {
8383
vscode.StatusBarAlignment.Left,
8484
0,
8585
);
86+
private invalidMiseConfigStatusBarItem = vscode.window.createStatusBarItem(
87+
vscode.StatusBarAlignment.Left,
88+
0,
89+
);
8690

8791
private miseFileWatcher: MiseFileWatcher | undefined;
8892

@@ -245,6 +249,7 @@ export class MiseExtension {
245249
});
246250
}
247251

252+
void this.checkForInvalidMiseConfigFiles();
248253
await this.updateStatusBarTooltip();
249254
});
250255

@@ -650,6 +655,7 @@ export class MiseExtension {
650655
}
651656

652657
const icon = state === "loading" ? "$(sync~spin)" : "$(terminal)";
658+
this.statusBarItem.color = undefined;
653659

654660
this.statusBarItem.text = `${icon} Mise`;
655661
if (state === "disabled") {
@@ -705,6 +711,63 @@ export class MiseExtension {
705711
this.statusBarItem.tooltip = errorMsg;
706712
}
707713

714+
private async checkForInvalidMiseConfigFiles() {
715+
const resetStatusBar = () => {
716+
this.invalidMiseConfigStatusBarItem.hide();
717+
this.invalidMiseConfigStatusBarItem.command = undefined;
718+
this.invalidMiseConfigStatusBarItem.tooltip = undefined;
719+
this.invalidMiseConfigStatusBarItem.text = "";
720+
};
721+
722+
try {
723+
await this.miseService.getMiseConfigFiles();
724+
resetStatusBar();
725+
} catch (error) {
726+
if (!(error instanceof Error)) {
727+
resetStatusBar();
728+
return;
729+
}
730+
731+
if (error.message.includes("mise ERROR error parsing config file")) {
732+
const filePathMatch = error.message.match(
733+
/error parsing config file: (.*?\.toml)/,
734+
);
735+
const invalidMiseCfgFile = filePathMatch?.[1];
736+
if (invalidMiseCfgFile) {
737+
const filePath = expandPath(invalidMiseCfgFile);
738+
this.invalidMiseConfigStatusBarItem.text = `Invalid Mise config: ${filePath}`;
739+
this.invalidMiseConfigStatusBarItem.color = new vscode.ThemeColor(
740+
"errorForeground",
741+
);
742+
const errorParts = error.message.split(
743+
"mise ERROR error parsing config file:",
744+
2,
745+
);
746+
const mainError = errorParts[1]
747+
? `Error parsing config file: ${errorParts[1]}`
748+
: error.message;
749+
750+
const cleanedError = mainError.split(
751+
"mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information",
752+
)[0];
753+
754+
this.invalidMiseConfigStatusBarItem.tooltip =
755+
cleanedError?.replace(/mise ERROR /g, "").trim() || error.message;
756+
757+
this.invalidMiseConfigStatusBarItem.command = {
758+
title: "Open Invalid Mise Config File",
759+
command: MISE_OPEN_FILE,
760+
arguments: [filePath],
761+
};
762+
this.invalidMiseConfigStatusBarItem.show();
763+
this.setErrorState(
764+
`Mise configuration file is invalid: ${filePath}. Please fix or remove this file.`,
765+
);
766+
}
767+
}
768+
}
769+
}
770+
708771
private checkForMissingMiseTools() {
709772
if (!isMiseExtensionEnabled()) {
710773
return;

0 commit comments

Comments
 (0)