@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
186 lines • 18.1 kB
JavaScript
;
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.MergeUtils = void 0;
const fs = require("fs");
const Diff3 = require("node-diff3");
const __1 = require("..");
const HashUtils_1 = require("./HashUtils");
const lodash_1 = require("lodash");
class MergeUtils {
static perform2WayMerge(mine, theirs, output, mineDescription, theirsDescription, encoding, endOfLine) {
const mineString = mine.toString(encoding);
const theirsString = theirs.toString(encoding);
const mergeResult = this.MergeStringArrays2Way(mineString.split(endOfLine), theirsString.split(endOfLine), mineDescription, theirsDescription);
fs.writeFileSync(output, mergeResult.result.join(endOfLine), { encoding: encoding });
return mergeResult.conflict;
}
static perform3WayMerge(root, mine, theirs, output, mineDescription, theirsDescription, encoding, endOfLine, rootDescription) {
const rootString = root.toString(encoding);
const mineString = mine.toString(encoding);
const theirsString = theirs.toString(encoding);
const mergeResult = this.MergeStringArrays3Way(mineString.split(endOfLine), theirsString.split(endOfLine), rootString.split(endOfLine), mineDescription, theirsDescription, rootDescription);
const mergedContent = mergeResult.result.join(endOfLine);
fs.writeFileSync(output, mergedContent, { encoding: encoding });
return mergeResult.conflict;
}
static checkFileForMergeNotation(file, encoding) {
const fileContent = fs.readFileSync(file).toString(encoding);
let found = false;
fileContent.split(/\r?\n/).forEach((line) => {
if (line.startsWith(this.MINE_MARKUP) || line.startsWith(this.THEIR_MARKUP)) {
found = true;
}
});
return found;
}
static markElementAsMerged(element) {
return __awaiter(this, void 0, void 0, function* () {
const localFileSha1 = yield HashUtils_1.HashUtils.getFileHash(element.localFile);
if (localFileSha1 == element.localFileVersion.sha1)
element.localStatus = __1.ElementVersionStatus.INSYNC;
else
element.localStatus = __1.ElementVersionStatus.CHANGED;
element.mergeElmVersion = (0, lodash_1.cloneDeep)(__1.WorkspaceUtils.EmptyWorkspaceElementVersion);
element.mergeStatus = __1.ElementVersionStatus.MISSING;
});
}
static toTrimmedArray(input) {
const array = input.map((line) => {
return line.trimEnd();
});
return array;
}
static MergeStringArrays3Way(mine, theirs, root, mineDescription, theirsDescription, rootDescription) {
const mineTrimmed = this.toTrimmedArray(mine);
const theirsTrimmed = this.toTrimmedArray(theirs);
const rootTrimmed = this.toTrimmedArray(root);
let mineIndex = 0;
let rootIndex = 0;
let theirsIndex = 0;
const regions = Diff3.diff3MergeRegions(mineTrimmed, rootTrimmed, theirsTrimmed);
const mergeResult = { conflict: false, result: [] };
regions.forEach((region) => {
if (region.stable) {
mineIndex = region.bufferStart;
theirsIndex = region.bufferStart;
rootIndex = region.bufferStart;
region.bufferContent.forEach((line) => {
if (line == mineTrimmed[mineIndex]) {
mergeResult.result.push(mine[mineIndex]);
}
else if (line == theirsTrimmed[theirsIndex]) {
mergeResult.result.push(theirs[theirsIndex]);
}
else {
mergeResult.result.push(line);
}
mineIndex++;
theirsIndex++;
rootIndex++;
});
}
else {
mineIndex = region.aStart;
theirsIndex = region.bStart;
rootIndex = region.oStart;
let inConflict = false;
if (region.aLength == region.bLength) {
for (let i = 0; i < region.aLength; i++) {
if (region.aContent[i] != region.bContent[i]) {
inConflict = true;
}
}
}
else {
inConflict = true;
}
if (inConflict) {
mergeResult.result.push(`${this.MINE_MARKUP} ${mineDescription}`);
region.aContent.forEach(() => {
mergeResult.result.push(mine[mineIndex]);
mineIndex++;
});
if (rootDescription) {
mergeResult.result.push(`${this.ROOT_MARKUP} ${rootDescription}`);
region.oContent.forEach(() => {
mergeResult.result.push(root[rootIndex]);
rootIndex++;
});
}
mergeResult.result.push(this.SEPARATOR);
region.bContent.forEach(() => {
mergeResult.result.push(theirs[theirsIndex]);
theirsIndex++;
});
mergeResult.result.push(`${this.THEIR_MARKUP} ${theirsDescription}`);
mergeResult.conflict = true;
}
else {
region.aContent.forEach(() => {
mergeResult.result.push(mine[mineIndex]);
mineIndex++;
theirsIndex++;
rootIndex++;
});
}
}
});
return mergeResult;
}
static MergeStringArrays2Way(mine, theirs, mineDescription, theirsDescription) {
const mineTrimmed = this.toTrimmedArray(mine);
const theirsTrimmed = this.toTrimmedArray(theirs);
let mineIndex = 0;
let theirsIndex = 0;
const diffResults = Diff3.diffPatch(mineTrimmed, theirsTrimmed);
const mergeResult = { conflict: false, result: [] };
if (diffResults.length == 0) {
mine.forEach((line) => mergeResult.result.push(line.toString()));
}
else {
diffResults.forEach((diffResult) => {
while (diffResult.buffer1.offset > mineIndex) {
mergeResult.result.push(mine[mineIndex]);
mineIndex++;
theirsIndex++;
}
mergeResult.result.push(`${this.MINE_MARKUP} ${mineDescription}`);
diffResult.buffer1.chunk.forEach(() => {
mergeResult.result.push(mine[mineIndex]);
mineIndex++;
});
mergeResult.result.push(this.SEPARATOR);
diffResult.buffer2.chunk.forEach(() => {
mergeResult.result.push(theirs[theirsIndex]);
theirsIndex++;
});
mergeResult.result.push(`${this.THEIR_MARKUP} ${theirsDescription}`);
mergeResult.conflict = true;
});
while (mineIndex < mine.length) {
mergeResult.result.push(mine[mineIndex]);
mineIndex++;
theirsIndex++;
}
}
return mergeResult;
}
static getMergeCommand(localFile) {
return `zowe endevor confirm resolution '${localFile}'`;
}
}
exports.MergeUtils = MergeUtils;
MergeUtils.MINE_MARKUP = "<<<<<<< LOCAL FILE";
MergeUtils.ROOT_MARKUP = "||||||| COMMON BASE";
MergeUtils.SEPARATOR = "=======";
MergeUtils.THEIR_MARKUP = ">>>>>>> ENDEVOR ELEMENT";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVyZ2VVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvd29ya3NwYWNlL01lcmdlVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBdUJBLHlCQUEwQjtBQUMxQixvQ0FBb0M7QUFDcEMsMEJBQW9GO0FBQ3BGLDJDQUF3QztBQUN4QyxtQ0FBbUM7QUFFbkMsTUFBYSxVQUFVO0lBb0JkLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDNUIsSUFBWSxFQUNaLE1BQWMsRUFDZCxNQUFtQixFQUNuQixlQUF1QixFQUN2QixpQkFBeUIsRUFDekIsUUFBd0IsRUFDeEIsU0FBaUI7UUFFakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDNUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDM0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDN0IsZUFBZSxFQUNmLGlCQUFpQixDQUNsQixDQUFDO1FBQ0YsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyRixPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQWdCTSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLElBQVksRUFDWixJQUFZLEVBQ1osTUFBYyxFQUNkLE1BQW1CLEVBQ25CLGVBQXVCLEVBQ3ZCLGlCQUF5QixFQUN6QixRQUF3QixFQUN4QixTQUFpQixFQUNqQixlQUF3QjtRQUV4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFB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