return __awaiter(this, void 0, void 0, function* () { if (!plugin.compareFiles && !plugin.compareWorkspace) { return false; // not supported } if (!plugin.canGetFileInfo) { return null; // no file info support } let wf = Workflows.create(); wf.next((ctx) => { ctx.result = []; }); if (plugin.compareWorkspace) { wf.next((ctx) => __awaiter(this, void 0, void 0, function* () { let results = ctx.result; let compareRes = yield plugin.compareWorkspace(files, target); results.push .apply(results, compareRes); return compareRes; })); } else { // use compareFiles() instead files.forEach(f => { wf.next((ctx) => __awaiter(this, void 0, void 0, function* () { let results = ctx.result; let compareRes = yield plugin.compareFiles(f, target); results.push(compareRes); return compareRes; })); }); } return yield wf.start(); });
wf.next((wfCtx) => __awaiter(this, void 0, void 0, function* () { let entry = wfCtx.value; let wfTarget = Workflows.create(); // deploy for each plugin tp.plugins.forEach(p => { let clonedTarget = deploy_helpers.cloneObject(tp.target); // apply settings let settings = deploy_helpers.cloneObject(entry.settings); for (let prop in settings) { clonedTarget[prop] = settings[prop]; } wfTarget.next((wfTargetCtx) => { return new Promise((resolve, reject) => { p.deployWorkspace(files, clonedTarget, { baseDirectory: opts.baseDirectory, context: deploy_plugins.createPluginContext(opts.context || me.context), onBeforeDeployFile: (sender, e) => { if (opts.onBeforeDeployFile) { opts.onBeforeDeployFile(me, { destination: e.destination, file: e.file, target: clonedTarget, }); } }, onCompleted: (sender, e) => { if (e.error) { reject(e.error); } else { resolve(); } }, onFileCompleted: (sender, e) => { if (opts.onFileCompleted) { opts.onFileCompleted(me, { canceled: e.canceled, error: e.error, file: e.file, target: clonedTarget, }); } }, }); }); }); }); wfTarget.on('action.after', afterWorkflowsAction); yield wfTarget.start(); }));
wf.start().then((packagesAndFilters) => { if (packagesAndFilters.length < 1) { resolve(); return; } let targets = me.getTargets(); let wfPackages = Workflows.create(); wfPackages.next((ctxPkg) => { return new Promise((res, rej) => { FS.lstat(file, (err, stats) => { if (err) { rej(err); } else { ctxPkg.value = stats; res(); } }); }); }); packagesAndFilters.forEach(pf => { let alwaysSyncIfNewer = deploy_helpers.toBooleanSafe(pf.package.alwaysSyncIfNewer, deploy_helpers.toBooleanSafe(cfg.alwaysSyncIfNewer)); let timeToCompareWithLocalFile; if (deploy_helpers.toBooleanSafe(cfg.useWorkspaceStartTimeForSyncWhenOpen, deploy_helpers.toBooleanSafe(pf.package.useWorkspaceStartTimeForSyncWhenOpen))) { timeToCompareWithLocalFile = startTime; } else { timeToCompareWithLocalFile = lastConfigUpdate; } let targetNames = deploy_helpers.asArray(pf.filter.target); targetNames = targetNames.map(x => deploy_helpers.normalizeString(x)); targetNames = targetNames.filter(x => '' !== x); if (targetNames.length < 1) { // from package targetNames = deploy_helpers.asArray(pf.package.targets); } // cleanups targetNames = deploy_helpers.asArray(targetNames); targetNames = targetNames.map(x => deploy_helpers.normalizeString(x)); targetNames = targetNames.filter(x => '' !== x); targetNames = deploy_helpers.distinctArray(targetNames); let machtingTargets = targets.filter(t => { return targetNames.indexOf(deploy_helpers.normalizeString(t.name)) > -1; }); deploy_targets.getPluginsForTarget(machtingTargets, me.plugins).forEach(targetWithPlugin => { let supportedPlugins = targetWithPlugin.plugins .filter(x => x.canPull && x.canGetFileInfo); supportedPlugins.forEach(pi => { wfPackages.next((ctxPkg) => { let fileStats = ctxPkg.value; return new Promise((res, rej) => { let syncCompletedInvoked = false; let syncCompleted = (err, okMsg) => { if (syncCompletedInvoked) { return; } syncCompletedInvoked = true; if (err) { me.outputChannel.appendLine(i18.t('failed', err)); rej(err); } else { me.outputChannel.appendLine(okMsg); res(); } }; try { // output channel message { let targetName = deploy_helpers.toStringSafe(targetWithPlugin.target.name).trim(); let pullingMsg; if ('' !== targetName) { targetName = ` ('${targetName}')`; } pullingMsg = i18.t('sync.file.synchronize', file, targetName); me.outputChannel.append(pullingMsg); } // get info of remote file Promise.resolve(pi.getFileInfo(file, targetWithPlugin.target)).then((fi) => { if (fi) { if (fi.exists) { try { let remoteFileIsNewer = false; if (fi.modifyTime) { remoteFileIsNewer = fi.modifyTime.isAfter(fileStats.mtime); } if (remoteFileIsNewer) { // sync local with remote file ... if (alwaysSyncIfNewer || timeToCompareWithLocalFile.isAfter(fileStats.mtime)) { // ... if local not changed // since the current session if (!syncCompletedInvoked) { pi.pullFile(file, targetWithPlugin.target, { onCompleted: (sender, e) => { syncCompleted(e.error, i18.t('ok')); } }); } } else { syncCompleted(null, i18.t('sync.file.localChangedWithinSession')); } } else { syncCompleted(null, i18.t('sync.file.localIsNewer')); } } catch (e) { syncCompleted(e); } } else { syncCompleted(null, i18.t('sync.file.doesNotExistOnRemote')); } } else { syncCompleted(null, i18.t('canceled')); } }).catch((err) => { syncCompleted(err); // could not get file info }); } catch (e) { syncCompleted(e); } }); }); }); }); }); wfPackages.start().then(() => { resolve(); }).catch((err) => { reject(err); }); }).catch((err) => {
return new Promise((resolve, reject) => { try { if (!lastConfigUpdate || !startTime || deploy_helpers.isEmptyString(file)) { resolve(); return; } file = normalizeFilePath(file); let wf = Workflows.create(); wf.next((ctx) => { ctx.result = []; }); me.getPackages().forEach(pkg => { wf.next((ctx) => __awaiter(this, void 0, void 0, function* () { let packagesAndFilters = ctx.result; if (!deploy_helpers.isNullOrUndefined(pkg.syncWhenOpen)) { if (false !== pkg.syncWhenOpen) { let filter; let fastFileCheck = deploy_helpers.toBooleanSafe(pkg.fastCheckOnSync, deploy_helpers.toBooleanSafe(cfg.fastCheckOnSync)); if (true === pkg.syncWhenOpen) { // files of package filter = deploy_helpers.cloneObject(pkg); filter.target = pkg.targets; } else { if ('object' === typeof pkg.syncWhenOpen) { filter = pkg.syncWhenOpen; } else { // target name filter = deploy_helpers.cloneObject(pkg); filter.target = deploy_helpers.toStringSafe(pkg.syncWhenOpen); } } let fileChecker; if (fastFileCheck) { fileChecker = () => { return deploy_helpers.doesFileMatchByFilter(file, filter); }; } else { let filesByFilter = yield deploy_helpers.getFilesByFilterAsync(filter, me.useGitIgnoreStylePatternsInFilter(filter)); filesByFilter = filesByFilter.map(x => normalizeFilePath(x)); fileChecker = () => { return filesByFilter.indexOf(file) > -1; }; } if (fileChecker()) { packagesAndFilters.push({ filter: filter, package: pkg, }); } } } })); }); wf.start().then((packagesAndFilters) => { if (packagesAndFilters.length < 1) { resolve(); return; } let targets = me.getTargets(); let wfPackages = Workflows.create(); wfPackages.next((ctxPkg) => { return new Promise((res, rej) => { FS.lstat(file, (err, stats) => { if (err) { rej(err); } else { ctxPkg.value = stats; res(); } }); }); }); packagesAndFilters.forEach(pf => { let alwaysSyncIfNewer = deploy_helpers.toBooleanSafe(pf.package.alwaysSyncIfNewer, deploy_helpers.toBooleanSafe(cfg.alwaysSyncIfNewer)); let timeToCompareWithLocalFile; if (deploy_helpers.toBooleanSafe(cfg.useWorkspaceStartTimeForSyncWhenOpen, deploy_helpers.toBooleanSafe(pf.package.useWorkspaceStartTimeForSyncWhenOpen))) { timeToCompareWithLocalFile = startTime; } else { timeToCompareWithLocalFile = lastConfigUpdate; } let targetNames = deploy_helpers.asArray(pf.filter.target); targetNames = targetNames.map(x => deploy_helpers.normalizeString(x)); targetNames = targetNames.filter(x => '' !== x); if (targetNames.length < 1) { // from package targetNames = deploy_helpers.asArray(pf.package.targets); } // cleanups targetNames = deploy_helpers.asArray(targetNames); targetNames = targetNames.map(x => deploy_helpers.normalizeString(x)); targetNames = targetNames.filter(x => '' !== x); targetNames = deploy_helpers.distinctArray(targetNames); let machtingTargets = targets.filter(t => { return targetNames.indexOf(deploy_helpers.normalizeString(t.name)) > -1; }); deploy_targets.getPluginsForTarget(machtingTargets, me.plugins).forEach(targetWithPlugin => { let supportedPlugins = targetWithPlugin.plugins .filter(x => x.canPull && x.canGetFileInfo); supportedPlugins.forEach(pi => { wfPackages.next((ctxPkg) => { let fileStats = ctxPkg.value; return new Promise((res, rej) => { let syncCompletedInvoked = false; let syncCompleted = (err, okMsg) => { if (syncCompletedInvoked) { return; } syncCompletedInvoked = true; if (err) { me.outputChannel.appendLine(i18.t('failed', err)); rej(err); } else { me.outputChannel.appendLine(okMsg); res(); } }; try { // output channel message { let targetName = deploy_helpers.toStringSafe(targetWithPlugin.target.name).trim(); let pullingMsg; if ('' !== targetName) { targetName = ` ('${targetName}')`; } pullingMsg = i18.t('sync.file.synchronize', file, targetName); me.outputChannel.append(pullingMsg); } // get info of remote file Promise.resolve(pi.getFileInfo(file, targetWithPlugin.target)).then((fi) => { if (fi) { if (fi.exists) { try { let remoteFileIsNewer = false; if (fi.modifyTime) { remoteFileIsNewer = fi.modifyTime.isAfter(fileStats.mtime); } if (remoteFileIsNewer) { // sync local with remote file ... if (alwaysSyncIfNewer || timeToCompareWithLocalFile.isAfter(fileStats.mtime)) { // ... if local not changed // since the current session if (!syncCompletedInvoked) { pi.pullFile(file, targetWithPlugin.target, { onCompleted: (sender, e) => { syncCompleted(e.error, i18.t('ok')); } }); } } else { syncCompleted(null, i18.t('sync.file.localChangedWithinSession')); } } else { syncCompleted(null, i18.t('sync.file.localIsNewer')); } } catch (e) { syncCompleted(e); } } else { syncCompleted(null, i18.t('sync.file.doesNotExistOnRemote')); } } else { syncCompleted(null, i18.t('canceled')); } }).catch((err) => { syncCompleted(err); // could not get file info }); } catch (e) { syncCompleted(e); } }); }); }); }); }); wfPackages.start().then(() => { resolve(); }).catch((err) => { reject(err); }); }).catch((err) => { reject(err); }); } catch (e) { reject(e); } });
deployWorkspace(files, target, opts) { if (!opts) { opts = {}; } let hasCancelled = false; let completedInvoked = false; let completed = (err) => { if (completedInvoked) { return; } completedInvoked = true; if (opts.onCompleted) { opts.onCompleted(me, { canceled: hasCancelled, error: err, target: target, }); } }; let me = this; me.onCancelling(() => hasCancelled = true, opts); let afterWorkflowsAction = (err, ctx) => { if (ctx && hasCancelled) { ctx.finish(); } }; try { let allEntries = deploy_helpers.asArray(target.entries) .filter(x => x); let targets = deploy_helpers.asArray(target.targets) .map(t => deploy_helpers.normalizeString(t)) .filter(t => '' !== t); targets = deploy_helpers.distinctArray(targets); let wf = Workflows.create(); // let user select one entry wf.next((wfCtx) => { return new Promise((resolve, reject) => { if (allEntries.length > 0) { let quickPicks = allEntries.map((e, i) => { let label = deploy_helpers.toStringSafe(e.name).trim(); if ('' === label) { label = `Entry #${i}`; } let desc = deploy_helpers.toStringSafe(e.description).trim(); let detail = me.context.replaceWithValues(e.detail); if (deploy_helpers.isEmptyString(detail)) { detail = undefined; } return { description: desc, detail: detail, entry: e, label: label, }; }); let placeholder = deploy_helpers.toStringSafe(target.placeholder).trim(); if ('' === placeholder) { placeholder = i18.t('plugins.list.selectEntry'); } vscode.window.showQuickPick(quickPicks, { placeHolder: placeholder, }).then((qp) => { if (qp) { wfCtx.value = qp.entry; } resolve(); }, (err) => { reject(err); }); } else { resolve(); } }); }); // cancel if user has NOT selected // any entry wf.next((wfCtx) => { if (!wfCtx.value) { hasCancelled = true; afterWorkflowsAction(null, wfCtx); } }); // create an action for each target me.getTargetsWithPlugins(target, targets).forEach(tp => { wf.next((wfCtx) => __awaiter(this, void 0, void 0, function* () { let entry = wfCtx.value; let wfTarget = Workflows.create(); // deploy for each plugin tp.plugins.forEach(p => { let clonedTarget = deploy_helpers.cloneObject(tp.target); // apply settings let settings = deploy_helpers.cloneObject(entry.settings); for (let prop in settings) { clonedTarget[prop] = settings[prop]; } wfTarget.next((wfTargetCtx) => { return new Promise((resolve, reject) => { p.deployWorkspace(files, clonedTarget, { baseDirectory: opts.baseDirectory, context: deploy_plugins.createPluginContext(opts.context || me.context), onBeforeDeployFile: (sender, e) => { if (opts.onBeforeDeployFile) { opts.onBeforeDeployFile(me, { destination: e.destination, file: e.file, target: clonedTarget, }); } }, onCompleted: (sender, e) => { if (e.error) { reject(e.error); } else { resolve(); } }, onFileCompleted: (sender, e) => { if (opts.onFileCompleted) { opts.onFileCompleted(me, { canceled: e.canceled, error: e.error, file: e.file, target: clonedTarget, }); } }, }); }); }); }); wfTarget.on('action.after', afterWorkflowsAction); yield wfTarget.start(); })); }); wf.on('action.after', afterWorkflowsAction); // start the workflow wf.start().then(() => { completed(null); }).catch((err) => { completed(err); }); } catch (e) { completed(e); } }
return __awaiter(this, void 0, void 0, function* () { let me = this; let wf = Workflows.create(); wf.next((ctx) => { ctx.result = true; }); let differences = yield checkFiles(files, target, plugin); if (Array.isArray(differences)) { wf.next(() => __awaiter(this, void 0, void 0, function* () { return differences.filter(d => { try { if (!d.right.exists) { return false; // only if exist } if (!d.right.modifyTime) { return false; // cannot compare } if (!d.left.modifyTime) { return true; } return d.right.modifyTime.utc() .isAfter(d.left.modifyTime.utc()); } catch (e) { d.right.error = e; return true; } }); })); // check data wf.next((ctx) => __awaiter(this, void 0, void 0, function* () { let newerFiles = ctx.previousValue; for (let i = 0; i < newerFiles.length;) { let nf = newerFiles[i]; let remove = false; if (!nf.right.error) { try { if (plugin.canPull) { let leftData = (yield deploy_helpers.loadFrom(Path.join(nf.left.path, nf.left.name))).data; let rightdata = yield plugin.downloadFile(Path.join(nf.left.path, nf.left.name), target); let toComparableBuffer = (b) => __awaiter(this, void 0, void 0, function* () { let isBinary = yield deploy_helpers.isBinaryContent(b); if (!isBinary) { let str = b.toString('ascii'); str = deploy_helpers.replaceAllStrings(str, "\r", ""); str = deploy_helpers.replaceAllStrings(str, "\t", " "); b = new Buffer(str, 'ascii'); } return b; }); leftData = yield toComparableBuffer(leftData); rightdata = yield toComparableBuffer(rightdata); if (leftData.equals(rightdata)) { remove = true; } } } catch (e) { nf.right.error = e; } } if (remove) { newerFiles.splice(i, 1); } else { i++; } } return newerFiles; })); // show wanring if newer files were found wf.next((ctx) => { let newerFiles = ctx.previousValue; return new Promise((resolve, reject) => { let localFiles = newerFiles.map(nf => { return Path.join(nf.left.path, nf.left.name); }).map(lf => { return Path.resolve(lf); }); if (newerFiles.length > 0) { ctx.result = false; let msg = i18.t('deploy.newerFiles.message', newerFiles.length); // [BUTTON] show let showBtn = new deploy_objects.SimplePopupButton(); showBtn.action = () => { ctx.result = false; showFilesInBrowsers(me, newerFiles, target).then(() => { resolve(); }).catch((err) => { reject(err); }); }; showBtn.title = i18.t('deploy.newerFiles.show'); // [BUTTON] deploy let deployBtn = new deploy_objects.SimplePopupButton(); deployBtn.action = () => { ctx.result = true; resolve(); }; deployBtn.title = i18.t('deploy.newerFiles.deploy'); let args = [msg, showBtn, deployBtn]; // show popup vscode.window.showWarningMessage.apply(null, args).then((btn) => { try { if (btn) { btn.action(); } else { ctx.result = null; resolve(); } } catch (e) { reject(e); } }, (err) => { reject(err); }); } else { resolve(); } }); }); } return yield wf.start(); });