UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

186 lines 18.1 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.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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