diff --git a/client/src/addon_manager/commands/enable.ts b/client/src/addon_manager/commands/enable.ts index f5f7775f7bb79b31e50290ebcacaf5d261a27b15..f71e8029da56281b6b72b55caba7ab11bd4c4702 100644 --- a/client/src/addon_manager/commands/enable.ts +++ b/client/src/addon_manager/commands/enable.ts @@ -44,12 +44,13 @@ export default async (context: vscode.ExtensionContext, message: Message) => { try { await addon.enable(folder); } catch (e) { + const message = `Failed to enable ${addon.name}!`; + localLogger.error(message, { report: false }); + localLogger.error(e, { report: false }); WebVue.sendNotification({ level: NotificationLevels.error, - message: `Failed to enable ${addon.name}!`, + message, }); - localLogger.warn(`Failed to enable ${addon.name}`); - localLogger.warn(e); continue; } await setConfig([ diff --git a/client/src/addon_manager/commands/update.ts b/client/src/addon_manager/commands/update.ts index 1727f6f44a00ad983716a1d7b42ab52409685632..13aed3b5414e652d6667d80338392cf436294586 100644 --- a/client/src/addon_manager/commands/update.ts +++ b/client/src/addon_manager/commands/update.ts @@ -4,6 +4,9 @@ import { git } from "../services/git.service"; import { DiffResultTextFile } from "simple-git"; import { WebVue } from "../panels/WebVue"; import { NotificationLevels } from "../types/webvue"; +import { createChildLogger } from "../services/logging.service"; + +const localLogger = createChildLogger("Update Addon"); type Message = { data: { @@ -16,9 +19,12 @@ export default async (context: vscode.ExtensionContext, message: Message) => { try { await addon.update(); } catch (e) { + const message = `Failed to update ${addon.name}`; + localLogger.error(message, { report: false }); + localLogger.error(e, { report: false }); WebVue.sendNotification({ level: NotificationLevels.error, - message: `Failed to update ${addon.name}!`, + message, }); } await addon.setLock(false); diff --git a/client/src/addon_manager/models/addon.ts b/client/src/addon_manager/models/addon.ts index 61c16a808d75119dde9c115e6ff3173e12738df8..eae74d309fadda5184b58109e7927d65ee2f6f5b 100644 --- a/client/src/addon_manager/models/addon.ts +++ b/client/src/addon_manager/models/addon.ts @@ -90,7 +90,7 @@ export class Addon { */ public checkIfEnabled(libraryPaths: string[]) { const regex = new RegExp( - `[\/\\\\]+sumneko.lua[\/\\\\]+addonManager[\/\\\\]+addons[\/\\\\]+${this.name}`, + `[/\\\\]+sumneko.lua[/\\\\]+addonManager[/\\\\]+addons[/\\\\]+${this.name}`, "g" ); @@ -190,7 +190,7 @@ export class Addon { )) ?? []) as string[]; const regex = new RegExp( - `[\/\\\\]+sumneko.lua[\/\\\\]+addonManager[\/\\\\]+addons[\/\\\\]+${this.name}`, + `[/\\\\]+sumneko.lua[/\\\\]+addonManager[/\\\\]+addons[/\\\\]+${this.name}`, "g" ); const index = librarySetting.findIndex((path) => regex.test(path)); diff --git a/client/src/addon_manager/panels/WebVue.ts b/client/src/addon_manager/panels/WebVue.ts index 34d9b62c09c3a672ffe472dd7a648e9172d9e883..d0b28c031a78cbb50db010cd566c2f775d06efe5 100644 --- a/client/src/addon_manager/panels/WebVue.ts +++ b/client/src/addon_manager/panels/WebVue.ts @@ -250,7 +250,9 @@ export class WebVue { ) { return webview.onDidReceiveMessage((message: WebVueMessage) => { const command = message.command; - commandLogger.verbose(`Executing "${command}"`); + commandLogger.verbose( + `Executing "${command}" (${JSON.stringify(message)})` + ); try { commands[command](context, message); diff --git a/client/src/addon_manager/registration.ts b/client/src/addon_manager/registration.ts index ad976706636898113e44ce2052f1037d0240491c..97dc2b4a867962d4e5acc29fb40d1af1f77d5f3b 100644 --- a/client/src/addon_manager/registration.ts +++ b/client/src/addon_manager/registration.ts @@ -5,8 +5,7 @@ import VSCodeLogFileTransport from "./services/logging/vsCodeLogFileTransport"; import { createChildLogger, logger } from "./services/logging.service"; import dayjs from "dayjs"; import RelativeTime from "dayjs/plugin/relativeTime"; -import { setupGit } from "./services/git.service"; -import { execSync } from "child_process"; +import { git, setupGit } from "./services/git.service"; import { GIT_DOWNLOAD_URL } from "./config"; import { NotificationLevels } from "./types/webvue"; @@ -20,63 +19,75 @@ export async function activate(context: vscode.ExtensionContext) { const isEnabled = globalConfig.get("enable") as boolean; if (!isEnabled) { + // NOTE: Will only log to OUTPUT, not to log file localLogger.info("Addon manager is disabled"); return; } - try { - execSync("git --version"); - } catch (e) { - vscode.window - .showErrorMessage( - "Git does not appear to be installed. Please install Git to use the addon manager", - "Disable Addon Manager", - "Visit Git Website" - ) - .then((result) => { - switch (result) { - case "Disable Addon Manager": - globalConfig.update( - "enable", - false, - vscode.ConfigurationTarget.Global - ); - break; - case "Visit Git Website": - vscode.env.openExternal( - vscode.Uri.parse(GIT_DOWNLOAD_URL) - ); - break; - default: - break; - } - }); - return; - } + const fileLogger = new VSCodeLogFileTransport(context.logUri, { + level: "debug", + }); - // Register commands + // Register command to open addon manager context.subscriptions.push( vscode.commands.registerCommand("lua.addon_manager.open", async () => { - // Create log file transport and add to logger - const fileLogger = new VSCodeLogFileTransport(context.logUri, { - level: "debug", - }); - const promiseFilelogger = await fileLogger.init(); - context.subscriptions.push(promiseFilelogger); - logger.add(fileLogger); - await fileLogger.logStart(); + // Set up file logger + if (!fileLogger.initialized) { + const disposable = await fileLogger.init(); + context.subscriptions.push(disposable); + logger.info( + `This session's log file: ${VSCodeLogFileTransport.currentLogFile}` + ); + logger.add(fileLogger); + await fileLogger.logStart(); + } - WebVue.render(context); + // Check if git is installed + if (!(await git.version()).installed) { + logger.error("Git does not appear to be installed!", { + report: false, + }); + vscode.window + .showErrorMessage( + "Git does not appear to be installed. Please install Git to use the addon manager", + "Disable Addon Manager", + "Visit Git Website" + ) + .then((result) => { + switch (result) { + case "Disable Addon Manager": + globalConfig.update( + "enable", + false, + vscode.ConfigurationTarget.Global + ); + break; + case "Visit Git Website": + vscode.env.openExternal( + vscode.Uri.parse(GIT_DOWNLOAD_URL) + ); + break; + default: + break; + } + }); + } + // Set up git repository for fetching addons try { - await setupGit(context); + setupGit(context); } catch (e) { + const message = + "Failed to set up Git repository. Please check your connection to GitHub."; + logger.error(message, { report: false }); + logger.error(e, { report: false }); WebVue.sendNotification({ level: NotificationLevels.error, - message: - "Failed to set up Git repository. Please check your connection to GitHub.", + message, }); } + + WebVue.render(context); }) ); } diff --git a/client/src/addon_manager/services/addonManager.service.ts b/client/src/addon_manager/services/addonManager.service.ts index cced373667500f11e2048549cbb6114064fde597..2532f67b453852f76abbf6fe5949c28b27e41272 100644 --- a/client/src/addon_manager/services/addonManager.service.ts +++ b/client/src/addon_manager/services/addonManager.service.ts @@ -21,9 +21,13 @@ class AddonManager { await git.fetch(); await git.pull(); } catch (e) { + const message = + "Failed to fetch addons! Please check your connection to GitHub."; + localLogger.error(message, { report: false }); + localLogger.error(e, { report: false }); WebVue.sendNotification({ level: NotificationLevels.error, - message: `Failed to fetch addons! Please check your connection to GitHub.`, + message, }); } diff --git a/client/src/addon_manager/services/filesystem.service.ts b/client/src/addon_manager/services/filesystem.service.ts index 5928741ec678e3b08dc681b931e8e0a60bf4ffd3..20ab57a6e1ef4c418607c7aef72d2193a27c5eb3 100644 --- a/client/src/addon_manager/services/filesystem.service.ts +++ b/client/src/addon_manager/services/filesystem.service.ts @@ -12,7 +12,9 @@ type ReadDirectoryOptions = { }; namespace filesystem { - + /** Get a string representation of a URI using UNIX separators + * @param uri The URI to get as a UNIX path string + */ export function unixifyPath(uri: vscode.Uri): string { if (platform() === "win32") { return uri.path.substring(1); @@ -91,7 +93,9 @@ namespace filesystem { export async function createDirectory(uri: vscode.Uri) { return vscode.workspace.fs .createDirectory(uri) - .then(() => localLogger.debug(`Created directory at "${uri.path}"`)); + .then(() => + localLogger.debug(`Created directory at "${uri.path}"`) + ); } export type DirectoryNode = { diff --git a/client/src/addon_manager/services/git.service.ts b/client/src/addon_manager/services/git.service.ts index d69f424c06691c6e69e691d97a6e0245159c765b..54d61f6fbc4a6d62bbc13e792988df3760437bd5 100644 --- a/client/src/addon_manager/services/git.service.ts +++ b/client/src/addon_manager/services/git.service.ts @@ -33,7 +33,7 @@ export const setupGit = async (context: vscode.ExtensionContext) => { localLogger.warn( `Failed to clone ${REPOSITORY_NAME} to ${storageURI.fsPath}!` ); - throw e + throw e; } } @@ -41,10 +41,9 @@ export const setupGit = async (context: vscode.ExtensionContext) => { try { await git.fetch(); await git.pull(); - await git.checkout("main"); } catch (e) { localLogger.warn(`Failed to pull ${REPOSITORY_NAME}!`); - throw e + throw e; } }; diff --git a/client/src/addon_manager/services/logging.service.ts b/client/src/addon_manager/services/logging.service.ts index 40643b71ddb2c0864db0a76bce5fd0a21a73362f..732769bea8e15ba5deaee2ba59bac1c017e6a94b 100644 --- a/client/src/addon_manager/services/logging.service.ts +++ b/client/src/addon_manager/services/logging.service.ts @@ -15,7 +15,7 @@ import VSCodeLogFileTransport from "./logging/vsCodeLogFileTransport"; // Create logger from winston export const logger = winston.createLogger({ level: "info", - defaultMeta: { category: "General" }, + defaultMeta: { category: "General", report: true }, format: winston.format.combine( winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss", @@ -44,7 +44,7 @@ export const logger = winston.createLogger({ // When a error is logged, ask user to report error. logger.on("data", async (info) => { - if (info.level !== "error") return; + if (info.level !== "error" || !info.report) return; const choice = await vscode.window.showErrorMessage( `An error occurred with the Lua Addon Manager. Please help us improve by reporting the issue ❤️`, diff --git a/client/src/addon_manager/services/logging/vsCodeLogFileTransport.ts b/client/src/addon_manager/services/logging/vsCodeLogFileTransport.ts index 92914842ea333e933349c0201f83db92b19ce31b..ccf497970dda79dd9d598b7fbb3a416d8cd3e869 100644 --- a/client/src/addon_manager/services/logging/vsCodeLogFileTransport.ts +++ b/client/src/addon_manager/services/logging/vsCodeLogFileTransport.ts @@ -9,7 +9,7 @@ import dayjs from "dayjs"; export default class VSCodeLogFileTransport extends Transport { public static currentLogFile: vscode.Uri; - private initialized = false; + public initialized = false; private logDir: vscode.Uri; @@ -30,7 +30,7 @@ export default class VSCodeLogFileTransport extends Transport { // Create log file stream const logFileUri = vscode.Uri.joinPath( addonLogsDir, - `${dayjs().format("HH-mm")}.log` + `${dayjs().format("HH")}.log` ); VSCodeLogFileTransport.currentLogFile = logFileUri; this.stream = fs.createWriteStream(logFileUri.fsPath, { @@ -62,7 +62,9 @@ export default class VSCodeLogFileTransport extends Transport { this.emit("logged", info); }); - this.stream.write(stringToByteArray(info[MESSAGE as unknown as string] + "\n")); + this.stream.write( + stringToByteArray(info[MESSAGE as unknown as string] + "\n") + ); callback(); } diff --git a/client/src/addon_manager/types/webvue.ts b/client/src/addon_manager/types/webvue.ts index 7ecb468ce677589a9c9e797912b6f251f4a6f52f..5338ba104ae096e1a90e4f4a96855c420ce5383c 100644 --- a/client/src/addon_manager/types/webvue.ts +++ b/client/src/addon_manager/types/webvue.ts @@ -1,6 +1,6 @@ export interface WebVueMessage { command: string; - data: { [index: string]: any }; + data: { [index: string]: unknown }; } export enum NotificationLevels { diff --git a/client/webvue b/client/webvue index 36214f0c21bef2f11d46781584a12c4e6ec97090..ac8a4db6fbb2e5aab49dca9aa55e367cec92aadd 160000 --- a/client/webvue +++ b/client/webvue @@ -1 +1 @@ -Subproject commit 36214f0c21bef2f11d46781584a12c4e6ec97090 +Subproject commit ac8a4db6fbb2e5aab49dca9aa55e367cec92aadd