@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
491 lines • 68 kB
JavaScript
"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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