module.exports = MergeSummary; module.exports.MergeConflict = MergeConflict; var PullSummary = require('./PullSummary'); function MergeConflict (reason, file, meta) { this.reason = reason; this.file = file; if (meta) { this.meta = meta; } } MergeConflict.prototype.meta = null; MergeConflict.prototype.toString = function () { return this.file + ':' + this.reason; }; function MergeSummary () { PullSummary.call(this); this.conflicts = []; this.merges = []; } MergeSummary.prototype = Object.create(PullSummary.prototype); MergeSummary.prototype.result = 'success'; MergeSummary.prototype.toString = function () { if (this.conflicts.length) { return 'CONFLICTS: ' + this.conflicts.join(', '); } return 'OK'; }; Object.defineProperty(MergeSummary.prototype, 'failed', { get: function () { return this.conflicts.length > 0; } }); MergeSummary.parsers = [ { test: /^Auto-merging\s+(.+)$/, handle: function (result, mergeSummary) { mergeSummary.merges.push(result[1]); } }, { // Parser for standard merge conflicts test: /^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, handle: function (result, mergeSummary) { mergeSummary.conflicts.push(new MergeConflict(result[1], result[2])); } }, { // Parser for modify/delete merge conflicts (modified by us/them, deleted by them/us) test: /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, handle: function (result, mergeSummary) { mergeSummary.conflicts.push( new MergeConflict(result[1], result[2], {deleteRef: result[3]}) ); } }, { // Catch-all parser for unknown/unparsed conflicts test: /^CONFLICT\s+\((.+)\):/, handle: function (result, mergeSummary) { mergeSummary.conflicts.push(new MergeConflict(result[1], null)); } }, { test: /^Automatic merge failed;\s+(.+)$/, handle: function (result, mergeSummary) { mergeSummary.reason = mergeSummary.result = result[1]; } } ]; MergeSummary.parse = function (output) { let mergeSummary = new MergeSummary(); output.trim().split('\n').forEach(function (line) { for (var i = 0, iMax = MergeSummary.parsers.length; i < iMax; i++) { let parser = MergeSummary.parsers[i]; var result = parser.test.exec(line); if (result) { parser.handle(result, mergeSummary); break; } } }); let pullSummary = PullSummary.parse(output); if (pullSummary.summary.changes) { Object.assign(mergeSummary, pullSummary); } return mergeSummary; };