diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c8b483..c60fd15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ [![Share via Facebook](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Facebook.png)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded) [![Share via Twitter](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Twitter.png)](https://twitter.com/intent/tweet?source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&text=vscode-deploy-reloaded:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&via=mjkloubert) [![Share via Google+](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Google+.png)](https://plus.google.com/share?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Pinterest](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Pinterest.png)](https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&media=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif&description=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.) [![Share via Reddit](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Reddit.png)](https://www.reddit.com/submit?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded) [![Share via LinkedIn](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/LinkedIn.png)](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded&summary=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Wordpress](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Wordpress.png)](https://wordpress.com/press-this.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded&s=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&i=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif) [![Share via Email](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Email.png)](mailto:?subject=vscode-deploy-reloaded&body=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20'vs-deploy'%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) -## 0.37.0 (February 8th, 2018; log files) +## 0.38.0 (February 8th, 2018; log files) * logs will be written to `.vscode-deploy-reloaded/.logs` sub folder of the user's home directory now ... files, which are older than 31 days, will be deleted automatically diff --git a/package-lock.json b/package-lock.json index 71fdef9..9e47ee2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-deploy-reloaded", - "version": "0.37.0", + "version": "0.38.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9a8ef46..0a6f9cd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-deploy-reloaded", "displayName": "Deploy (Reloaded)", "description": "Deploys files of a workspace to a destination.", - "version": "0.37.0", + "version": "0.38.0", "publisher": "mkloubert", "engines": { "vscode": "^1.19.0" diff --git a/src/helpers.ts b/src/helpers.ts index f83ec50..1ff16a7 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1323,8 +1323,7 @@ export function isBinaryContent(data: Buffer): Promise { * @return {boolean} Is boolean or not. */ export function isBool(val: any): val is boolean { - return !isNullOrUndefined(val) && - 'boolean' === typeof val; + return _.isBoolean(val); } /** diff --git a/src/log.ts b/src/log.ts index ec69a95..7297854 100644 --- a/src/log.ts +++ b/src/log.ts @@ -447,8 +447,10 @@ NEW_CONSOLE_LOGGER.addAction((ctx) => { } time = deploy_helpers.asUTC(time); - if (ctx.type > LogType.Info) { - return; + if (LogType.Trace !== ctx.type) { + if (ctx.type > LogType.Info) { + return; + } } let msg = `${LogType[logType].toUpperCase().trim()}`; @@ -464,12 +466,21 @@ NEW_CONSOLE_LOGGER.addAction((ctx) => { msg += ' ' + TAG; } + let logMsg = deploy_helpers.toStringSafe(ctx.message); + if (LogType.Trace === ctx.type) { + const STACK = deploy_helpers.toStringSafe( + (new Error()).stack + ).split("\n").filter(l => { + return l.toLowerCase() + .trim() + .startsWith('at '); + }).join("\n"); + + logMsg += `\n\nStack:\n${STACK}`; + } + msg += ` - [${time.format('DD/MMM/YYYY:HH:mm:ss')} +0000] "${ - _.replace( - deploy_helpers.toStringSafe(ctx.message), - /"/ig, - '\\"' - ) + _.replace(logMsg, /"/ig, '\\"') }"${OS.EOL}`; const LOG_FILE = Path.resolve( diff --git a/src/output.ts b/src/output.ts new file mode 100644 index 0000000..8f3ac09 --- /dev/null +++ b/src/output.ts @@ -0,0 +1,164 @@ +/** + * This file is part of the vscode-deploy-reloaded distribution. + * Copyright (c) Marcel Joachim Kloubert. + * + * vscode-deploy-reloaded is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, version 3. + * + * vscode-deploy-reloaded is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import * as deploy_helpers from './helpers'; +import * as deploy_log from './log'; +import * as deploy_objects from './objects'; +import * as vscode from 'vscode'; + + +/** + * A channel writer. + * + * @param {string} text The text to write. + * @param {boolean} addNewLine Add new line or not. + */ +export type ChannelWriter = (context: ChannelWriterContext) => void; + +/** + * A context for a channel writer. + */ +export interface ChannelWriterContext { + /** + * Add new line or not. + */ + readonly addNewLine: boolean; + /** + * The base channel. + */ + readonly baseChannel: vscode.OutputChannel; + /** + * The text to write. + */ + readonly text: string; +} + + +/** + * A wrapper for an output channel. + */ +export class OutputChannelWrapper extends deploy_objects.DisposableBase implements vscode.OutputChannel { + private readonly _OWNS_CHANNEL: boolean; + private readonly _WRITERS: ChannelWriter[] = []; + + /** + * Initializes a new instance of that class. + * + * @param {vscode.OutputChannel} baseChannel The base channel. + * @param {boolean} [ownsChannel] Also dispose base channel or not. + */ + public constructor(public readonly baseChannel: vscode.OutputChannel, ownsChannel?: boolean) { + super(); + + this._OWNS_CHANNEL = deploy_helpers.toBooleanSafe(ownsChannel); + } + + /** + * Adds a writer. + * + * @param {ChannelWriter} writer The writer to add. + * + * @chainable + */ + public addWriter(writer: ChannelWriter): this { + if (writer) { + this._WRITERS.push(writer); + } + + return this; + } + + /** @inheritdoc */ + public append(value: any) { + value = deploy_helpers.toStringSafe(value); + + this.invokeForBaseChannel(this.baseChannel.append, + [ value ]); + + this.sendToWriters(value, false); + } + + /** @inheritdoc */ + public appendLine(value: any) { + value = deploy_helpers.toStringSafe(value); + + this.invokeForBaseChannel(this.baseChannel.appendLine, + [ value ]); + + this.sendToWriters(value, true); + } + + /** @inheritdoc */ + public clear() { + this.invokeForBaseChannel(this.baseChannel.clear, arguments); + } + + /** @inheritdoc */ + public hide() { + this.invokeForBaseChannel(this.baseChannel.hide, arguments); + } + + private invokeForBaseChannel(method: (...args: any[]) => TResult, args?: IArguments | any[]): TResult { + if (method) { + return method.apply( + this.baseChannel, + args || [] + ); + } + } + + /** @inheritdoc */ + public get name() { + return this.baseChannel.name; + } + + /** @inheritdoc */ + protected onDispose() { + while (this._WRITERS.length > 0) { + this._WRITERS.pop(); + } + + if (this._OWNS_CHANNEL) { + this.invokeForBaseChannel(this.baseChannel.dispose, []); + } + } + + private sendToWriters(text: string, addNewLine: boolean) { + if ('' === text) { + return; + } + + for (const WRITER of this._WRITERS) { + try { + WRITER({ + addNewLine: addNewLine, + baseChannel: this.baseChannel, + text: text, + }); + } + catch (e) { + deploy_log.CONSOLE + .trace(e, 'output.OutputChannelWrapper.sendToWriters(1)'); + } + } + } + + /** @inheritdoc */ + public show() { + this.invokeForBaseChannel(this.baseChannel.show, arguments); + } +} diff --git a/src/workspaces.ts b/src/workspaces.ts index 62c7954..4cb6cd7 100644 --- a/src/workspaces.ts +++ b/src/workspaces.ts @@ -33,6 +33,7 @@ import * as deploy_list from './list'; import * as deploy_log from './log'; import * as deploy_mappings from './mappings'; import * as deploy_objects from './objects'; +import * as deploy_output from './output'; import * as deploy_packages from './packages'; import * as deploy_plugins from './plugins'; import * as deploy_pull from './pull'; @@ -282,8 +283,9 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c */ protected _lastConfigUpdate: Moment.Moment; private readonly _LOGGER = new deploy_log.ActionLogger(); - private _OLD_ENV_VARS: deploy_contracts.KeyValuePairs = {}; - private _PACKAGE_BUTTONS: PackageWithButton[] = []; + private readonly _OLD_ENV_VARS: deploy_contracts.KeyValuePairs = {}; + private readonly _OUTPUT_CHANNEL: deploy_output.OutputChannelWrapper; + private readonly _PACKAGE_BUTTONS: PackageWithButton[] = []; private _packages: deploy_packages.Package[]; private _rootPath: string | false; private _selectedSwitches: deploy_contracts.KeyValuePairs; @@ -311,6 +313,9 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c public readonly context: WorkspaceContext) { super(); + this._OUTPUT_CHANNEL = new deploy_output.OutputChannelWrapper( + context.outputChannel + ); this.state = new WorkspaceMemento(this, context.extension.workspaceState); } @@ -1859,6 +1864,7 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c } ME.setupLogger(); + ME.setupOutputChannel(); ME._rootPath = false; @@ -2497,6 +2503,9 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c /** @inheritdoc */ protected onDispose() { + // dispose output channel + this._OUTPUT_CHANNEL.dispose(); + // and last but not least: // dispose logger try { @@ -2519,7 +2528,7 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c * Gets the output channel of that workspace. */ public get output(): vscode.OutputChannel { - return this.context.outputChannel; + return this._OUTPUT_CHANNEL; } /** @@ -3445,6 +3454,12 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c deploy_log.CONSOLE .log(ctx.type, ctx.message, ctx.tag); }); + + //TODO: add actions from config + } + + private setupOutputChannel() { + //TODO: add writers from config } /**