@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
150 lines • 18.7 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.EndevorSyncActionConflict = void 0;
const RetrieveElement_1 = require("../../elements/RetrieveElement");
const EndevorUtils_1 = require("../../utils/EndevorUtils");
const CacheUtils_1 = require("../CacheUtils");
const IEndevorWorkspaceEnums_1 = require("../doc/IEndevorWorkspaceEnums");
const MergeUtils_1 = require("../MergeUtils");
const EndevorSyncAction_1 = require("./EndevorSyncAction");
const fs = require("fs");
const EndevorSyncActionUtils_1 = require("./EndevorSyncActionUtils");
const HandlerUtils_1 = require("../../../cli/utils/HandlerUtils");
class EndevorSyncActionConflict extends EndevorSyncAction_1.EndevorSyncAction {
constructor(element, location, nodeEncoding, endOfLine, workspaceDir, charset) {
super(element, location);
this.actionType = IEndevorWorkspaceEnums_1.EndevorActionType.CONFLICT;
this.actionName = "Conflict Resolution";
this.actionColorANSI = HandlerUtils_1.HandlerUtils.ANSI_COLOR_GREEN;
this.nodeEncoding = nodeEncoding;
this.endOfLine = endOfLine;
this.workspaceDir = workspaceDir;
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 == IEndevorWorkspaceEnums_1.ElementVersionStatus.CONFLICT_RESOLUTION) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.NOT_RUN;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.NOT_RUN_MANUAL_MERGE_IN_PROGRESS;
return false;
}
const retrieveOptions = {
path: "log",
return: "fir",
search: "yes",
ccid: ccid,
comment: comment,
signout: optSignout ? "yes" : "no",
oveSign: optOverrideSignout ? "yes" : "no"
};
try {
const restResponse = yield RetrieveElement_1.RetrieveElement.retrieveElement(session, instance, this.location, retrieveOptions, this.element.fileCharset ? this.element.fileCharset : this.charset, this.element.codePage);
if (restResponse.isResponseJSON) {
let notFound = false;
let stcShortage = false;
let oveSignNeeded = false;
EndevorUtils_1.EndevorUtils.removeMessageTimestamps(restResponse.body.messages).forEach((message) => {
if (message.startsWith("API0000W ELEMENT NOT FOUND")) {
notFound = true;
}
if (message.startsWith("EWS1111E")) {
stcShortage = true;
}
if (message.startsWith("C1G0167E")) {
oveSignNeeded = true;
}
this.errorMessages.push(message);
});
if (notFound) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_NOT_FOUND;
return false;
}
if (stcShortage) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_STC_SHORTAGE;
return false;
}
if (oveSignNeeded) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT;
return false;
}
if (restResponse.body.data[0] == null) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE;
this.errorMessages = restResponse.body.messages;
return false;
}
}
if (restResponse.body.data[0] == null) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE;
return false;
}
const remoteContent = restResponse.body.data[0];
let fingerprint = restResponse.headers["fingerprint"];
if (fingerprint != null && fingerprint.length > 16) {
fingerprint = fingerprint.slice(fingerprint.length - 16);
}
if (fingerprint != this.element.mergeElmVersion.fingerprint) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_FINGERPRINT_MISMATCH;
if (fingerprint == null || fingerprint.length == 0) {
this.errorMessages.push("Retrieve Element didn't return a fingerprint, sync cannot proceed. Contact you Endevor web services administrator.");
}
return false;
}
let conflict = false;
const remoteDescription = `(vvll ${this.element.mergeElmVersion.vvll} ccid '${this.element.mergeElmVersion.ccid}' created by ${this.element.mergeElmVersion.userId} on ${this.element.mergeElmVersion.date.substring(0, 10)} at ${this.element.mergeElmVersion.date.substring(11, 19)})`;
if (this.element.localStatus == IEndevorWorkspaceEnums_1.ElementVersionStatus.NEW) {
const localDescription = `(untracked)`;
conflict = MergeUtils_1.MergeUtils.perform2WayMerge(fs.readFileSync(this.element.localFile), remoteContent, this.element.localFile, localDescription, remoteDescription, this.nodeEncoding, this.endOfLine);
}
else {
let localDescription = `(based on unknown vvll)`;
if (this.element.localElmVersion.vvll != "") {
localDescription = `(based on 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)})`;
}
conflict = MergeUtils_1.MergeUtils.perform3WayMerge(CacheUtils_1.CacheUtils.readSha1File(this.element.localFileVersion), fs.readFileSync(this.element.localFile), remoteContent, this.element.localFile, localDescription, remoteDescription, this.nodeEncoding, this.endOfLine);
}
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.SUCCESS;
CacheUtils_1.CacheUtils.removeSha1File(this.element.localFileVersion);
yield CacheUtils_1.CacheUtils.addSha1FileFromBuffer(this.workspaceDir, this.location.environment, this.location.stageNumber, this.location.system, this.location.subsystem, this.element.localFileVersion, remoteContent);
if (this.element.localFileVersion.sha1File == "") {
this.element.localFileVersion.sha1File = "was empty";
}
this.element.localElmVersion = this.element.mergeElmVersion;
if (conflict) {
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_MANUAL_MERGE_STARTED;
this.element.localStatus = IEndevorWorkspaceEnums_1.ElementVersionStatus.CONFLICT_RESOLUTION;
}
else {
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_AUTOMERGED;
yield MergeUtils_1.MergeUtils.markElementAsMerged(this.element);
}
return true;
}
catch (err) {
this.status = IEndevorWorkspaceEnums_1.EndevorActionStatus.FAILURE;
this.statusDetailed = IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE;
this.errorMessages.push(`${err}`);
return false;
}
});
}
}
exports.EndevorSyncActionConflict = EndevorSyncActionConflict;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclN5bmNBY3Rpb25Db25mbGljdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvd29ya3NwYWNlL2FjdGlvbnMvRW5kZXZvclN5bmNBY3Rpb25Db25mbGljdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUEwQkEsb0VBQWlFO0FBRWpFLDJEQUF3RDtBQUN4RCw4Q0FBMkM7QUFDM0MsMEVBS3VDO0FBRXZDLDhDQUEyQztBQUMzQywyREFBd0Q7QUFDeEQseUJBQTBCO0FBQzFCLHFFQUFrRTtBQUNsRSxrRUFBK0Q7QUFNL0QsTUFBYSx5QkFBMEIsU0FBUSxxQ0FBaUI7SUFTOUQsWUFDRSxPQUFpQyxFQUNqQyxRQUEyQixFQUMzQixZQUE0QixFQUM1QixTQUFpQixFQUNqQixZQUFvQixFQUNwQixPQUFlO1FBRWYsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQWhCM0IsZUFBVSxHQUFHLDBDQUFpQixDQUFDLFFBQVEsQ0FBQztRQUN4QyxlQUFVLEdBQUcscUJBQXFCLENBQUM7UUFDbkMsb0JBQWUsR0FBVywyQkFBWSxDQUFDLGdCQUFnQixDQUFDO1FBZXRELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBNkIsRUFBRSxPQUFvQztRQUN4RywrQ0FBc0IsQ0FBQyxpQ0FBaUMsQ0FDdEQsS0FBSyxFQUNMLE9BQU8sRUFDUCwwREFBMEQsRUFDMUQsMkRBQTJELEVBQzNELGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsNENBQTRDLEVBQzVDLDZDQUE2QyxFQUM3QyxnRUFBZ0UsRUFDaEUsaUVBQWlF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