|  | /** | 
|  | * @license | 
|  | * Copyright (C) 2017 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | * http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | import {PatchSetBehavior} from '../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.js'; | 
|  |  | 
|  | /** | 
|  | * @constructor | 
|  | * @param {Object} change A change object resulting from a change detail | 
|  | *     call that includes revision information. | 
|  | */ | 
|  | export function RevisionInfo(change) { | 
|  | this._change = change; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Get the largest number of parents of the commit in any revision. For | 
|  | * example, with normal changes this will always return 1. For merge changes | 
|  | * wherein the revisions are merge commits this will return 2 or potentially | 
|  | * more. | 
|  | * | 
|  | * @return {number} | 
|  | */ | 
|  | RevisionInfo.prototype.getMaxParents = function() { | 
|  | if (!this._change || !this._change.revisions) { | 
|  | return 0; | 
|  | } | 
|  | return Object.values(this._change.revisions) | 
|  | .reduce((acc, rev) => Math.max(rev.commit.parents.length, acc), 0); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Get an object that maps revision numbers to the number of parents of the | 
|  | * commit of that revision. | 
|  | * | 
|  | * @return {!Object} | 
|  | */ | 
|  | RevisionInfo.prototype.getParentCountMap = function() { | 
|  | const result = {}; | 
|  | if (!this._change || !this._change.revisions) { | 
|  | return {}; | 
|  | } | 
|  | Object.values(this._change.revisions) | 
|  | .forEach(rev => { result[rev._number] = rev.commit.parents.length; }); | 
|  | return result; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @param {number|string} patchNum | 
|  | * @return {number} | 
|  | */ | 
|  | RevisionInfo.prototype.getParentCount = function(patchNum) { | 
|  | return this.getParentCountMap()[patchNum]; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Get the commit ID of the (0-offset) indexed parent in the given revision | 
|  | * number. | 
|  | * | 
|  | * @param {number|string} patchNum | 
|  | * @param {number} parentIndex (0-offset) | 
|  | * @return {string} | 
|  | */ | 
|  | RevisionInfo.prototype.getParentId = function(patchNum, parentIndex) { | 
|  | const rev = Object.values(this._change.revisions).find(rev => | 
|  | PatchSetBehavior.patchNumEquals(rev._number, patchNum)); | 
|  | return rev.commit.parents[parentIndex].commit; | 
|  | }; |