UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

190 lines 22.6 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.EndevorSyncActionMerge = void 0; const __1 = require("../.."); const CacheUtils_1 = require("../CacheUtils"); const MergeUtils_1 = require("../MergeUtils"); const EndevorSyncActionUtils_1 = require("./EndevorSyncActionUtils"); class EndevorSyncActionMerge extends __1.EndevorSyncAction { constructor(element, location, encoding, endOfLine, mergeFromLoc, mergeFromLocSearch, mergeSync, charset) { super(element, location); this.actionType = __1.EndevorActionType.MERGE; this.actionName = "Merge Element"; this.encoding = encoding; this.endOfLine = endOfLine; this.mergeFromLoc = mergeFromLoc; this.mergeFromLocSearch = mergeFromLocSearch; this.mergeSync = mergeSync; this.charset = charset; } static composeActionsSummaryMsg(state, actions) { EndevorSyncActionUtils_1.EndevorSyncActionUtils.composeActionsSummaryMsgForMerges(state, actions, "element successfully retrieved with unknown merge result", "elements successfully retrieved with unknown merge result", "element successfully auto-merged", "elements successfully auto-merged", "element require manual conflict resolution", "elements require manual conflict resolution", "element retrieve in preparation for conflict resolution failed", "element retrieves in preparation for conflict resolution failed", "element conflict resolution not started", "element conflict resolutions not started"); } performAction(session, instance, ccid, comment, optSignout, optOverrideSignout) { return __awaiter(this, void 0, void 0, function* () { if (this.element.localStatus == __1.ElementVersionStatus.CONFLICT_RESOLUTION) { this.status = __1.EndevorActionStatus.NOT_RUN; this.statusDetailed = __1.EndevorActionStatusDetailed.NOT_RUN_MANUAL_MERGE_IN_PROGRESS; return false; } const element = this.element; const locationList = yield EndevorSyncActionUtils_1.EndevorSyncActionUtils.listElement(this, session, instance, this.location, true, false, true).catch(() => { return null; }); if (locationList == null) return false; const mergeFromList = yield EndevorSyncActionUtils_1.EndevorSyncActionUtils.listElement(this, session, instance, this.mergeFromLoc, true, false, true).catch(() => { return null; }); if (mergeFromList == null) return false; const mergeFromVersion = this.findVersionInformation(mergeFromList, this.mergeFromLocSearch); if (mergeFromVersion == undefined) { return false; } const mergeElmContent = yield EndevorSyncActionUtils_1.EndevorSyncActionUtils.retrieveElm(this, session, instance, ccid, comment, optSignout, optOverrideSignout, this.mergeFromLoc, this.mergeFromLocSearch, mergeFromVersion.fingerprint, this.charset).catch(() => { return null; }); if (mergeElmContent == null) return false; element.mergeElmVersion = element.remoteElmVersion; if (this.mergeSync) element.syncFingerprint = mergeFromVersion.fingerprint; let localDescription = `(based on unknown vvll)`; if (mergeFromVersion.vvll != "") { localDescription = `(vvll ${this.element.localElmVersion.vvll} ccid '${this.element.localElmVersion.ccid}' created by ${this.element.localElmVersion.userId} on ${this.element.localElmVersion.date.substring(0, 10)} at ${this.element.localElmVersion.date.substring(11, 19)})`; } let remoteDescription = `(based on unknown vvll)`; if (mergeFromVersion.vvll != "") { remoteDescription = `(based on vvll ${mergeFromVersion.vvll} ccid '${mergeFromVersion.ccid}' created by ${mergeFromVersion.userId} on ${mergeFromVersion.date.substring(0, 10)} at ${mergeFromVersion.date.substring(11, 19)}) (merging from ${this.mergeFromLoc.environment}/${this.mergeFromLoc.stageNumber}/${this.mergeFromLoc.system}/${this.mergeFromLoc.subsystem})`; } let conflict = false; const mergeRoot = this.findRoot(locationList, mergeFromList); if (mergeRoot == undefined) { conflict = MergeUtils_1.MergeUtils.perform2WayMerge(CacheUtils_1.CacheUtils.readSha1File(this.element.localFileVersion), mergeElmContent, this.element.localFile, localDescription, remoteDescription, this.encoding, this.endOfLine); } else { const rootElmContent = yield EndevorSyncActionUtils_1.EndevorSyncActionUtils.retrieveElm(this, session, instance, ccid, comment, optSignout, optOverrideSignout, mergeRoot, true, undefined, this.charset).catch(() => { return null; }); if (rootElmContent == null) return false; conflict = MergeUtils_1.MergeUtils.perform3WayMerge(rootElmContent, CacheUtils_1.CacheUtils.readSha1File(this.element.localFileVersion), mergeElmContent, this.element.localFile, localDescription, remoteDescription, this.encoding, this.endOfLine); } this.status = __1.EndevorActionStatus.SUCCESS; if (conflict) { this.statusDetailed = __1.EndevorActionStatusDetailed.SUCCESS_MANUAL_MERGE_STARTED; this.element.localStatus = __1.ElementVersionStatus.CONFLICT_RESOLUTION; } else { this.statusDetailed = __1.EndevorActionStatusDetailed.SUCCESS_AUTOMERGED; yield MergeUtils_1.MergeUtils.markElementAsMerged(this.element); } return true; }); } findVersionInformation(listResults, searchMap) { var _a, _b, _c, _d, _e, _f; if (listResults.length == 0) { this.errorMessages.push("No elements to merge with found at the specified merge location"); this.status = __1.EndevorActionStatus.NOT_RUN; this.statusDetailed = __1.EndevorActionStatusDetailed.NOT_RUN; return undefined; } let lowestResults = []; listResults.forEach((currentElement) => { if (lowestResults.length == 0 || lowestResults[0].stgSeqNum > currentElement.stgSeqNum) { lowestResults = []; lowestResults.push(currentElement); } else if (lowestResults[0].stgSeqNum == currentElement.stgSeqNum) { lowestResults.push(currentElement); } }); if (lowestResults.length == 0) { this.errorMessages.push("Internal: findVersionInformation failed to obtain version info for remote element"); this.status = __1.EndevorActionStatus.FAILURE; this.statusDetailed = __1.EndevorActionStatusDetailed.FAILURE; return undefined; } const selfMerge = lowestResults.some((currentElement) => { return (currentElement.envName == this.location.environment && `${currentElement.stgNum}` == this.location.stageNumber && currentElement.sysName == this.location.system && currentElement.sbsName == this.location.subsystem); }); if (selfMerge) { this.errorMessages.push(`The element was found at the specified merge location - cannot merge with itself.`); this.status = __1.EndevorActionStatus.FAILURE; this.statusDetailed = __1.EndevorActionStatusDetailed.FAILURE_MERGE_LOCATION_INVALID; } if (lowestResults.length > 1) { this.errorMessages.push(`${lowestResults.length} elements with name ${this.element.fullName} and type ${this.element.type} found at the specified merge location.`); this.status = __1.EndevorActionStatus.FAILURE; this.statusDetailed = __1.EndevorActionStatusDetailed.FAILURE_MERGE_LOCATION_INVALID; return undefined; } const lowest = lowestResults[0]; if (lowest.stgSeqNum > 1 && !searchMap) { this.status = __1.EndevorActionStatus.FAILURE; this.statusDetailed = __1.EndevorActionStatusDetailed.FAILURE_MERGE_LOCATION_INVALID; this.errorMessages.push("No element to merge with found at the specified merge location (element probably moved while 'Merge Element' was executing)"); return undefined; } this.errorMessages.push(`Merging with ${this.element.fullName}.${this.element.type} at ${lowest.envName}/${lowest.stgNum}/${lowest.sysName}/${lowest.sbsName}`); return { ccid: (_a = lowest.elmLastLLCcid) !== null && _a !== void 0 ? _a : "", comment: (_b = lowest.elmLastLLComment) !== null && _b !== void 0 ? _b : "", date: (_c = lowest.elmLastLLDate) !== null && _c !== void 0 ? _c : "", userId: (_d = lowest.elmLastLLUsrid) !== null && _d !== void 0 ? _d : "", vvll: (_e = lowest.elmVVLL) !== null && _e !== void 0 ? _e : "", fingerprint: (_f = lowest.fingerprint) !== null && _f !== void 0 ? _f : "" }; } findRoot(listResults1, listResults2) { const findLowestStgElement = (lowestElement, currentElement) => { if (lowestElement == undefined || lowestElement.stgSeqNum > currentElement.stgSeqNum) { return currentElement; } else return lowestElement; }; const lowest1 = listResults1.reduce(findLowestStgElement); const lowest2 = listResults2.reduce(findLowestStgElement); const rootCandidates = listResults1.filter((element1) => { return listResults2.some((element2) => { return (element1.stgSeqNum != lowest1.stgSeqNum && element2.stgSeqNum != lowest2.stgSeqNum && element1.envName == element2.envName && element1.stgNum == element2.stgNum && element1.sysName == element2.sysName && element1.sbsName == element2.sbsName && element1.typeName == element2.typeName); }); }); let mergeRootLoc = undefined; if (rootCandidates.length > 0) { const lowestRoot = rootCandidates.reduce(findLowestStgElement); mergeRootLoc = { element: lowestRoot.fullElmName, environment: lowestRoot.envName, stageNumber: `${lowestRoot.stgNum}`, system: lowestRoot.sysName, subsystem: lowestRoot.sbsName, type: lowestRoot.typeName }; } return mergeRootLoc; } } exports.EndevorSyncActionMerge = EndevorSyncActionMerge; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclN5bmNBY3Rpb25NZXJnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvd29ya3NwYWNlL2FjdGlvbnMvRW5kZXZvclN5bmNBY3Rpb25NZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUF3QkEsNkJBV2U7QUFDZiw4Q0FBMkM7QUFDM0MsOENBQTJDO0FBQzNDLHFFQUFrRTtBQU9sRSxNQUFhLHNCQUF1QixTQUFRLHFCQUFpQjtJQVUzRCxZQUNFLE9BQWlDLEVBQ2pDLFFBQTJCLEVBQzNCLFFBQXdCLEVBQ3hCLFNBQWlCLEVBQ2pCLFlBQStCLEVBQy9CLGtCQUEyQixFQUMzQixTQUFrQixFQUNsQixPQUFlO1FBRWYsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQW5CM0IsZUFBVSxHQUFHLHFCQUFpQixDQUFDLEtBQUssQ0FBQztRQUNyQyxlQUFVLEdBQUcsZUFBZSxDQUFDO1FBbUIzQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUE2QixFQUFFLE9BQWlDO1FBQ3JHLCtDQUFzQixDQUFDLGlDQUFpQyxDQUN0RCxLQUFLLEVBQ0wsT0FBTyxFQUNQLDBEQUEwRCxFQUMxRCwyREFBMkQsRUFDM0Qsa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyw0Q0FBNEMsRUFDNUMsNkNBQTZDLEVBQzdDLGdFQUFnRSxFQUNoRSxpRUFBaUUsRUFDakUseUNBQXlD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