UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

491 lines 68 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SyncWorkspace = void 0; const __1 = require(".."); const IEndevorWorkspaceEnums_1 = require("./doc/IEndevorWorkspaceEnums"); const lodash_1 = require("lodash"); const AsyncUtils_1 = require("../utils/AsyncUtils"); const EndevorWorkspaceFilter_1 = require("./EndevorWorkspaceFilter"); const EndevorSyncActionUpdate_1 = require("./actions/EndevorSyncActionUpdate"); const EndevorSyncActionUntrack_1 = require("./actions/EndevorSyncActionUntrack"); const EndevorSyncActionDelete_1 = require("./actions/EndevorSyncActionDelete"); const fs = require("fs"); class SyncWorkspace { static syncWorkspace(session, instance, location, workspaceArgs, progressApi) { return __awaiter(this, void 0, void 0, function* () { const filter = new EndevorWorkspaceFilter_1.EndevorWorkspaceFilter(); filter.addLocation(location); const fileExtensionResolution = workspaceArgs["file-extension"] ? workspaceArgs["file-extension"].toUpperCase() : IEndevorWorkspaceEnums_1.FileExtensionResolution.MIXED; const result = yield this.syncWorkspaceImpl(session, instance, filter, workspaceArgs["dry-run"], workspaceArgs.reset, workspaceArgs.limit, workspaceArgs["one-way"], workspaceArgs["signout"], workspaceArgs["override-signout"], workspaceArgs["allow-deletes"], fileExtensionResolution, workspaceArgs["workspace-dir"], workspaceArgs["ccid"], workspaceArgs["comment"], progressApi); return new __1.EndevorWorkspaceResponse(result); }); } static syncWorkspaceImpl(session_1, instance_1, filter_1, optDryRun_1, optReset_1, optLimit_1, optNoUpdate_1, optSignout_1, optOverrideSignout_1, optAllowDeletes_1) { return __awaiter(this, arguments, void 0, function* (session, instance, filter, optDryRun, optReset, optLimit, optNoUpdate, optSignout, optOverrideSignout, optAllowDeletes, optFileExtension = IEndevorWorkspaceEnums_1.FileExtensionResolution.MIXED, optWorkspace, optCcid, optComment, progressApi) { const serverConfig = yield __1.WorkspaceUtils.getServerConfig(session, instance); const maxConcurrentRequests = AsyncUtils_1.AsyncUtils.getRecommendedThreadCount(serverConfig); let state; try { state = yield this.buildWorkspaceState(session, instance, optWorkspace, filter, serverConfig, progressApi, optFileExtension); } catch (reponse) { return reponse; } if (!__1.WorkspaceUtils.checkEntryStage(state, optDryRun, optNoUpdate)) { return state; } state.fileExtensionResolution = optFileExtension; yield this.determineSyncActions(state, session, instance, optReset, optAllowDeletes, maxConcurrentRequests, progressApi); if (!__1.WorkspaceUtils.ccidAndCommentCheck(state, !(optCcid === null || optCcid === undefined), !(optComment === null || optComment === undefined), optSignout, optNoUpdate, optDryRun)) { __1.WorkspaceUtils.composeActionsSummaryMsgs(state); state.infoMessages.push(`'${state.workspaceDir}' is not in sync with the specified Endevor location ${state.filter.toString()}.`); return state; } const ccid = optCcid == null ? "" : optCcid; const comment = optComment == null ? "" : optComment; if (optDryRun) { state.infoMessages.push("No actions executed, because 'dry-run' option was specified."); } else { const endevorActionCount = state.retrieveActions.length + state.updateActions.length + state.conflictActions.length + state.deleteActions.length; if (optLimit == 0 || endevorActionCount <= optLimit) { yield this.performActions(state, session, instance, ccid, comment, optNoUpdate, optSignout, optOverrideSignout, maxConcurrentRequests, progressApi); yield __1.WorkspaceUtils.saveState(state); } else { state.warningMessages.push(`Number of required actions (${endevorActionCount}) exceeded the specified limit of ${optLimit}. No actions were performed.`); } } __1.WorkspaceUtils.composeActionsSummaryMsgs(state); if (state.inSync) { if (state.elementCount > 0) { state.infoMessages.push(`'${state.workspaceDir}' is in sync with the specified Endevor location ${state.filter.toString()}.`); } } else { state.infoMessages.push(`'${state.workspaceDir}' is not in sync with the specified Endevor location ${state.filter.toString()}.`); } return state; }); } static unsyncWorkspace(session, instance, location, workspaceArgs, progressApi) { return __awaiter(this, void 0, void 0, function* () { const filter = new EndevorWorkspaceFilter_1.EndevorWorkspaceFilter(); filter.addLocation(location); const result = yield this.unsyncWorkspaceImpl(session, instance, filter, workspaceArgs["force"], workspaceArgs["workspace-dir"], progressApi); return new __1.EndevorWorkspaceResponse(result); }); } static unsyncWorkspaceImpl(session, instance, filter, optForce, optWorkspace, progressApi) { return __awaiter(this, void 0, void 0, function* () { const serverConfig = yield __1.WorkspaceUtils.getServerConfig(session, instance); const maxConcurrentRequests = AsyncUtils_1.AsyncUtils.getRecommendedThreadCount(serverConfig); let state; try { state = yield this.buildWorkspaceState(session, instance, optWorkspace, filter, serverConfig, progressApi); } catch (reponse) { return reponse; } yield this.determineSyncActions(state, session, instance, false, false, maxConcurrentRequests, progressApi); const changesCount = state.updateActions.length + state.conflictActions.length; if (changesCount == 0 || optForce) { if (optForce) { state.infoMessages.push(`'${state.workspaceDir}' has local changes not yet synchronized to Endevor for location ${state.filter.toString()}.`); __1.WorkspaceUtils.composeActionsSummaryMsgs(state); state.infoMessages.push(`Unsynchronization proceeds because the --force option was specified.`); } yield __1.WorkspaceUtils.removeAllLocalFiles(state, true); yield __1.WorkspaceUtils.saveState(state); state.infoMessages.push(`All local files matching ${state.filter.toString()} have been removed.`); } else { state.errorMessages.push(`'${state.workspaceDir}' has local changes not yet synchronized to Endevor for location ${state.filter.toString()}. Unsynchronization aborted.`); __1.WorkspaceUtils.composeActionsSummaryMsgs(state); state.infoMessages.push(`Use 'Synchronize Workspace' command to update Endevor with the local changes, or re-run the 'Unsynchronize Workspace' command with the --force option.`); } return state; }); } static buildWorkspaceState(session, instance, optWorkspace, filter, serverConfig, progressApi, optFileExtension) { return __awaiter(this, void 0, void 0, function* () { let workspaceDir = optWorkspace == undefined ? "." : optWorkspace; const errorObject = { errorMessages: [] }; if (!fs.existsSync(workspaceDir)) { errorObject.errorMessages.push(`Directory '${workspaceDir}' not found.`); return Promise.reject(errorObject); } workspaceDir = fs.realpathSync(workspaceDir); if (optWorkspace == undefined) { workspaceDir = __1.WorkspaceUtils.findWorkspace(workspaceDir); if (workspaceDir == "") { errorObject.errorMessages.push(`No directory was specified on the command, and current working directory is not part of an initialized Endevor SCM workspace. Run 'initialize workspace' first or select a different directory.`); return Promise.reject(errorObject); } } else { if (!__1.WorkspaceUtils.isWorkspace(workspaceDir)) { errorObject.errorMessages.push(`${workspaceDir} is not an initialized Endevor SCM workspace. Run 'initialize workspace' first or select a different directory.`); return Promise.reject(errorObject); } } const state = yield __1.WorkspaceUtils.getLocalState(workspaceDir, filter); if (optFileExtension) { if (state.fileExtensionResolution && state.fileExtensionResolution != optFileExtension) { state.warningMessages.push(`File Extension Resolution strategy changed from ${state.fileExtensionResolution .toString() .toLowerCase()} to ${optFileExtension.toString().toLowerCase()}`); } state.fileExtensionResolution = optFileExtension; } if (state.fileEncoding == "" || state.fileEncoding == undefined) { state.fileEncoding = "utf-8"; } if (state.fileEncoding.toUpperCase() != "UTF-8" && state.fileEncoding.toUpperCase() != "LATIN1" && state.fileEncoding.toUpperCase() != "ISO8859-1") { state.errorMessages.push(`The current encoding (charset) '${state.fileEncoding}' used by this workspace is not supported by Node.js. Special and binary characters may be corrupted during merges. Delete and recreate the workspace to convert it to utf-8 if you wish to avoid encoding issues.`); state.nodeEncoding = "utf-8"; } else { if (state.fileEncoding == "ISO8859-1" || state.fileEncoding == "LATIN1") state.nodeEncoding = "latin1"; else state.nodeEncoding = "utf-8"; } const maxConcurrentRequests = AsyncUtils_1.AsyncUtils.getRecommendedThreadCount(serverConfig); const invUpdateSuccess = yield __1.WorkspaceUtils.updateInventoryState(state, session, instance, maxConcurrentRequests, serverConfig, progressApi); if (!invUpdateSuccess) { return Promise.reject(new __1.EndevorWorkspaceResponse(state)); } yield __1.WorkspaceUtils.detectNewLocalFiles(state, progressApi); const elmUpdateSuccess = yield __1.WorkspaceUtils.updateElementState(state, session, instance, maxConcurrentRequests, progressApi); if (!elmUpdateSuccess) { return Promise.reject(new __1.EndevorWorkspaceResponse(state)); } return Promise.resolve(state); }); } static determineSyncActions(state, session, instance, reset, allowDeletes, maxConcurrentRequests, progressApi) { return __awaiter(this, void 0, void 0, function* () { const needDeleteResolution = []; let elementCount = 0; for (const stageKey in state.environments) { const stage = state.environments[stageKey]; const environmentDir = `${state.workspaceDir}/${stage.envName}`; const stageDir = `${environmentDir}/${stage.stageNumber}`; for (const systemKey in stage.systems) { const system = stage.systems[systemKey]; const systemDir = stageDir + "/" + systemKey; for (const subsystemKey in system.subsystems) { const subsystem = system.subsystems[subsystemKey]; const subsystemDir = systemDir + "/" + subsystemKey; for (const elementKey in subsystem.elements) { elementCount++; const element = subsystem.elements[elementKey]; const type = system.types[element.type]; const typeDir = subsystemDir + "/" + element.type; const location = { environment: stage.envName, stageNumber: `${stage.stageNumber}`, system: system.name, subsystem: subsystem.name, type: element.type, element: element.fullName }; const remoteStatus = element.remoteStatus; const localStatus = element.localStatus; if (element.fileExtensionResolution != state.fileExtensionResolution) { const newFile = __1.WorkspaceUtils.createLocalFileName(state, element.fullName, stage, system, subsystem, type); state.renameActions.push(new __1.EndevorSyncActionRename(element, location, newFile, state.fileExtensionResolution)); } if (reset) { if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.untrackActions.push(new EndevorSyncActionUntrack_1.EndevorSyncActionUntrack(element, location)); } else if (!(remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC) || !(localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC)) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } } else { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.CONFLICT_RESOLUTION) { state.conflictActions.push(new __1.EndevorSyncActionConflict(element, location, state.nodeEncoding, __1.WorkspaceUtils.getEndOfLineChars(type), state.workspaceDir, state.fileEncoding)); state.unresolvedMergeConflicts = true; } else if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC) { state.untrackActions.push(new EndevorSyncActionUntrack_1.EndevorSyncActionUntrack(element, location)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.untrackActions.push(new EndevorSyncActionUntrack_1.EndevorSyncActionUntrack(element, location)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.DELETED) { state.untrackActions.push(new EndevorSyncActionUntrack_1.EndevorSyncActionUntrack(element, location)); } else { needDeleteResolution.push([element, location]); } } else if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.NEW) { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.DELETED) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); if (allowDeletes) state.warningMessages.push("Element " + element.fullName + "." + element.type + " deleted locally and added in Endevor. Retrieving the element version from Endevor, please review the changes and delete it again if appropriate."); } else { element.mergeElmVersion = (0, lodash_1.cloneDeep)(element.remoteElmVersion); state.conflictActions.push(new __1.EndevorSyncActionConflict(element, location, state.nodeEncoding, __1.WorkspaceUtils.getEndOfLineChars(type), state.workspaceDir, state.fileEncoding)); } } else if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.CHANGED) { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC || localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.DELETED) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); if (allowDeletes) state.warningMessages.push("Element " + element.fullName + "." + element.type + " deleted locally and updated in Endevor. Retrieving the element version from Endevor, please review the changes and delete it again if appropriate."); } else { element.mergeElmVersion = (0, lodash_1.cloneDeep)(element.remoteElmVersion); state.conflictActions.push(new __1.EndevorSyncActionConflict(element, location, state.nodeEncoding, __1.WorkspaceUtils.getEndOfLineChars(type), state.workspaceDir, state.fileEncoding)); } } else if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.ENCODING_CHANGE) { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC || localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.DELETED) { if (allowDeletes) { state.deleteActions.push(new EndevorSyncActionDelete_1.EndevorSyncActionDelete(element, location)); } else { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.CHANGED) { if (element.syncFingerprint != undefined) { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, false, true, state.workspaceDir, state.fileEncoding)); } else { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, false, false, state.workspaceDir, state.fileEncoding)); } } } else if (remoteStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC) { if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.DELETED) { if (allowDeletes) { state.deleteActions.push(new EndevorSyncActionDelete_1.EndevorSyncActionDelete(element, location)); } else { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.MISSING) { state.retrieveActions.push(new __1.EndevorSyncActionRetrieve(element, location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } else if (localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.CHANGED) { if (element.syncFingerprint != undefined) { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, false, true, state.workspaceDir, state.fileEncoding)); } else { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, false, false, state.workspaceDir, state.fileEncoding)); } } } } if (!state.mkDirs.includes(environmentDir) && !fs.existsSync(environmentDir)) { state.mkDirs.push(environmentDir); } if (!state.mkDirs.includes(stageDir) && !fs.existsSync(stageDir)) { state.mkDirs.push(stageDir); } if (!state.mkDirs.includes(systemDir) && !fs.existsSync(systemDir)) { state.mkDirs.push(systemDir); } if (!state.mkDirs.includes(subsystemDir) && !fs.existsSync(subsystemDir)) { state.mkDirs.push(subsystemDir); } if (!state.mkDirs.includes(typeDir) && !fs.existsSync(typeDir)) { state.mkDirs.push(typeDir); } } } } } if (elementCount == 0) { state.warningMessages.push(`Nothing to sync - no Endevor elements or local files matched the specified Endevor location ${state.filter.toString()}.`); } if (needDeleteResolution.length > 0) { yield AsyncUtils_1.AsyncUtils.pooledParallelExec(needDeleteResolution, (resolution) => __awaiter(this, void 0, void 0, function* () { yield this.determineDeleteConflictAction(state, resolution[0], resolution[1], session, instance); return true; }), maxConcurrentRequests, `Obtaining additional data to determine correct action for ${needDeleteResolution.length} elements..`, progressApi); } const actionCount = state.retrieveActions.length + state.updateActions.length + state.conflictActions.length + state.deleteActions.length + state.mergeActions.length + state.untrackActions.length; state.inSync = actionCount == 0; }); } static performActions(state, session, instance, ccid, comment, noUpdate, optSignout, optOverrideSignout, maxConcurrentRequests, progressApi) { return __awaiter(this, void 0, void 0, function* () { state.mkDirs.forEach((directory) => { fs.mkdirSync(directory); }); state.renameActions.forEach((action) => { action.performAction(); }); yield AsyncUtils_1.AsyncUtils.pooledParallelExecWithRetry(state.retrieveActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(session, instance, ccid, comment, optSignout, optOverrideSignout); return action.statusDetailed; }), maxConcurrentRequests, 3, 1000, (status) => { return status == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_STC_SHORTAGE; }, `Retrieving ${state.retrieveActions.length} element${state.retrieveActions.length == 1 ? "" : "s"}..`, progressApi); yield AsyncUtils_1.AsyncUtils.pooledParallelExec(state.untrackActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(); }), maxConcurrentRequests, `Deleting ${state.untrackActions.length} local file${state.untrackActions.length == 1 ? "" : "s"}..`, progressApi); yield AsyncUtils_1.AsyncUtils.pooledParallelExecWithRetry(state.conflictActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(session, instance, ccid, comment, optSignout, optOverrideSignout); if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_AUTOMERGED) { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(action.element, action.location, false, false, state.workspaceDir, state.fileEncoding)); } else if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_MANUAL_MERGE_STARTED) { state.unresolvedMergeConflicts = true; } return action.statusDetailed; }), maxConcurrentRequests, 3, 1000, (status) => { return status == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_STC_SHORTAGE; }, `Resolving conflicts for ${state.conflictActions.length} element${state.conflictActions.length == 1 ? "" : "s"}..`, progressApi); if (noUpdate) { state.infoMessages.push("Updates of Endevor elements skipped, because 'one-way' option was specified."); } else { const additionalRetrieves = []; yield AsyncUtils_1.AsyncUtils.pooledParallelExecWithRetry(state.updateActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(session, instance, ccid, comment, optSignout, optOverrideSignout); if (action.element.encodingChanged && (action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.SUCCESS || action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.WARNING)) { additionalRetrieves.push(new __1.EndevorSyncActionRetrieve(action.element, action.location, state.workspaceDir, state.fileEncoding, state.codepageConfig, state.codepageValue)); } return action.statusDetailed; }), maxConcurrentRequests, 3, 1000, (status) => { return status == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_STC_SHORTAGE; }, `Updating ${state.updateActions.length} element${state.updateActions.length == 1 ? "" : "s"}..`, progressApi); if (additionalRetrieves.length > 0) { yield AsyncUtils_1.AsyncUtils.pooledParallelExec(additionalRetrieves, (action) => __awaiter(this, void 0, void 0, function* () { state.retrieveActions.push(action); yield action.performAction(session, instance, ccid, comment, optSignout, optOverrideSignout); return action.statusDetailed; }), maxConcurrentRequests, `Retrieving ${additionalRetrieves.length} element${additionalRetrieves.length == 1 ? "" : "s"}..`, progressApi); } yield AsyncUtils_1.AsyncUtils.pooledParallelExec(state.deleteActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(session, instance, ccid, comment, optOverrideSignout); }), maxConcurrentRequests, `Deleting ${state.deleteActions.length} element${state.deleteActions.length == 1 ? "" : "s"}..`, progressApi); } state.inSync = true; state.signoutOverrideNeeded = false; state.retrieveActions.forEach((action) => { if (action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE || action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.NOT_RUN) { state.inSync = false; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT) { state.signoutOverrideNeeded = true; } }); state.updateActions.forEach((action) => { if (action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE || action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.NOT_RUN) { state.inSync = false; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT) { state.signoutOverrideNeeded = true; } }); state.deleteActions.forEach((action) => { if (action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE || action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.NOT_RUN) { state.inSync = false; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT) { state.signoutOverrideNeeded = true; } }); state.conflictActions.forEach((action) => { if (action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE || action.status == IEndevorWorkspaceEnums_1.EndevorActionStatus.NOT_RUN) { state.inSync = false; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT) { state.signoutOverrideNeeded = true; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_MANUAL_MERGE_STARTED) { state.unresolvedMergeConflicts = true; } }); if (state.signoutOverrideNeeded) { state.warningMessages.push("Some actions couldn't be completed because elements are already signed out to a different user. If you want to override their signout, rerun the sync with the '--override-signout' or '--os' option"); } }); } static determineDeleteConflictAction(state, element, location, session, instance) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e; const elementList = yield __1.WorkspaceUtils.listElement(state, session, instance, location, true, true, true); if (elementList == null) { state.errorMessages.push(`Failed to list element metadata needed to decide how to address an element missing on remote for ${element.fullName}.${element.type}. Skipping this element.`); return false; } if (elementList.length == 0) { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, true, false, state.workspaceDir, state.fileEncoding)); } else { const fingerprint = elementList[0].fingerprint; if (fingerprint == element.localElmVersion.fingerprint) { state.updateActions.push(new EndevorSyncActionUpdate_1.EndevorSyncActionUpdate(element, location, true, false, state.workspaceDir, state.fileEncoding)); } else { element.mergeElmVersion.fingerprint = fingerprint; element.mergeElmVersion.ccid = (_a = elementList[0].elmLastLLCcid) !== null && _a !== void 0 ? _a : ""; element.mergeElmVersion.comment = (_b = elementList[0].elmLastLLComment) !== null && _b !== void 0 ? _b : ""; element.mergeElmVersion.userId = (_c = elementList[0].elmLastLLUsrid) !== null && _c !== void 0 ? _c : ""; element.mergeElmVersion.vvll = (_d = elementList[0].elmVVLL) !== null && _d !== void 0 ? _d : ""; element.mergeElmVersion.date = (_e = elementList[0].elmLastLLDate) !== null && _e !== void 0 ? _e : ""; const type = state.environments[`${location.environment}-${location.stageNumber}`].systems[location.system].types[location.type]; state.conflictActions.push(new __1.EndevorSyncActionConflict(element, location, state.nodeEncoding, __1.WorkspaceUtils.getEndOfLineChars(type), state.workspaceDir, state.fileEncoding)); } } return true; }); } } exports.SyncWorkspace = SyncWorkspace; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3luY1dvcmtzcGFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvd29ya3NwYWNlL1N5bmNXb3Jrc3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBd0JBLDBCQWFZO0FBQ1oseUVBS3NDO0FBQ3RDLG1DQUFtQztBQUNuQyxvREFBaUQ7QUFDakQscUVBQWtFO0FBQ2xFLCtFQUE0RTtBQUM1RSxpRkFBOEU7QUFDOUUsK0VBQTRFO0FBQzVFLHlCQUEwQjtBQVExQixNQUFhLGFBQWE7SUFXakIsTUFBTSxDQUFPLGFBQWEsQ0FDL0IsT0FBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsUUFBMkIsRUFDM0IsYUFBa0MsRUFDbEMsV0FBaUM7O1lBRWpDLE1BQU0sTUFBTSxHQUEyQixJQUFJLCtDQUFzQixFQUFFLENBQUM7WUFDcEUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixNQUFNLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0QsQ0FBQyxDQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFdBQVcsRUFBOEI7Z0JBQzVFLENBQUMsQ0FBQyxnREFBdUIsQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQ3pDLE9BQU8sRUFDUCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFDeEIsYUFBYSxDQUFDLEtBQUssRUFDbkIsYUFBYSxDQUFDLEtBQUssRUFDbkIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUN4QixhQUFhLENBQUMsU0FBUyxDQUFDLEVBQ3hCLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNqQyxhQUFhLENBQUMsZUFBZSxDQUFDLEVBQzlCLHVCQUF1QixFQUN2QixhQUFhLENBQUMsZUFBZSxDQUFDLEVBQzlCLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFD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