Example #1
0
 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();
 });
Example #2
0
 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();
 }));
Example #3
0
 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) => {
Example #4
0
 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);
     }
 });
Example #5
0
 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);
     }
 }
Example #6
0
 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();
 });