Merge pull request #2164 from github/koesie10/unify-command-runners
Unify `commandRunner` implementations
This commit is contained in:
@@ -121,6 +121,7 @@ export function withProgress<R>(
|
|||||||
export function commandRunner(
|
export function commandRunner(
|
||||||
commandId: string,
|
commandId: string,
|
||||||
task: NoProgressTask,
|
task: NoProgressTask,
|
||||||
|
outputLogger = extLogger,
|
||||||
): Disposable {
|
): Disposable {
|
||||||
return commands.registerCommand(commandId, async (...args: any[]) => {
|
return commands.registerCommand(commandId, async (...args: any[]) => {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
@@ -134,64 +135,6 @@ export function commandRunner(
|
|||||||
getErrorMessage(e) || e
|
getErrorMessage(e) || e
|
||||||
} (${commandId})`;
|
} (${commandId})`;
|
||||||
const errorStack = getErrorStack(e);
|
const errorStack = getErrorStack(e);
|
||||||
if (e instanceof UserCancellationException) {
|
|
||||||
// User has cancelled this action manually
|
|
||||||
if (e.silent) {
|
|
||||||
void extLogger.log(errorMessage.fullMessage);
|
|
||||||
} else {
|
|
||||||
void showAndLogWarningMessage(errorMessage.fullMessage);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Include the full stack in the error log only.
|
|
||||||
const fullMessage = errorStack
|
|
||||||
? `${errorMessage.fullMessage}\n${errorStack}`
|
|
||||||
: errorMessage.fullMessage;
|
|
||||||
void showAndLogExceptionWithTelemetry(errorMessage, {
|
|
||||||
fullMessage,
|
|
||||||
extraTelemetryProperties: {
|
|
||||||
command: commandId,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
} finally {
|
|
||||||
const executionTime = Date.now() - startTime;
|
|
||||||
telemetryListener?.sendCommandUsage(commandId, executionTime, error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A generic wrapper for command registration. This wrapper adds uniform error handling,
|
|
||||||
* progress monitoring, and cancellation for commands.
|
|
||||||
*
|
|
||||||
* @param commandId The ID of the command to register.
|
|
||||||
* @param task The task to run. It is passed directly to `commands.registerCommand`. Any
|
|
||||||
* arguments to the command handler are passed on to the task after the progress callback
|
|
||||||
* and cancellation token.
|
|
||||||
* @param progressOptions Progress options to be sent to the progress monitor.
|
|
||||||
*/
|
|
||||||
export function commandRunnerWithProgress<R>(
|
|
||||||
commandId: string,
|
|
||||||
task: ProgressTask<R>,
|
|
||||||
progressOptions: Partial<ProgressOptions>,
|
|
||||||
outputLogger = extLogger,
|
|
||||||
): Disposable {
|
|
||||||
return commands.registerCommand(commandId, async (...args: any[]) => {
|
|
||||||
const startTime = Date.now();
|
|
||||||
let error: Error | undefined;
|
|
||||||
const progressOptionsWithDefaults = {
|
|
||||||
location: ProgressLocation.Notification,
|
|
||||||
...progressOptions,
|
|
||||||
};
|
|
||||||
try {
|
|
||||||
return await withProgress(progressOptionsWithDefaults, task, ...args);
|
|
||||||
} catch (e) {
|
|
||||||
error = asError(e);
|
|
||||||
const errorMessage = redactableError`${
|
|
||||||
getErrorMessage(e) || e
|
|
||||||
} (${commandId})`;
|
|
||||||
const errorStack = getErrorStack(e);
|
|
||||||
if (e instanceof UserCancellationException) {
|
if (e instanceof UserCancellationException) {
|
||||||
// User has cancelled this action manually
|
// User has cancelled this action manually
|
||||||
if (e.silent) {
|
if (e.silent) {
|
||||||
@@ -222,6 +165,36 @@ export function commandRunnerWithProgress<R>(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic wrapper for command registration. This wrapper adds uniform error handling,
|
||||||
|
* progress monitoring, and cancellation for commands.
|
||||||
|
*
|
||||||
|
* @param commandId The ID of the command to register.
|
||||||
|
* @param task The task to run. It is passed directly to `commands.registerCommand`. Any
|
||||||
|
* arguments to the command handler are passed on to the task after the progress callback
|
||||||
|
* and cancellation token.
|
||||||
|
* @param progressOptions Progress options to be sent to the progress monitor.
|
||||||
|
*/
|
||||||
|
export function commandRunnerWithProgress<R>(
|
||||||
|
commandId: string,
|
||||||
|
task: ProgressTask<R>,
|
||||||
|
progressOptions: Partial<ProgressOptions>,
|
||||||
|
outputLogger = extLogger,
|
||||||
|
): Disposable {
|
||||||
|
return commandRunner(
|
||||||
|
commandId,
|
||||||
|
async (...args: any[]) => {
|
||||||
|
const progressOptionsWithDefaults = {
|
||||||
|
location: ProgressLocation.Notification,
|
||||||
|
...progressOptions,
|
||||||
|
};
|
||||||
|
|
||||||
|
return withProgress(progressOptionsWithDefaults, task, ...args);
|
||||||
|
},
|
||||||
|
outputLogger,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays a progress monitor that indicates how much progess has been made
|
* Displays a progress monitor that indicates how much progess has been made
|
||||||
* reading from a stream.
|
* reading from a stream.
|
||||||
|
|||||||
Reference in New Issue
Block a user