| /* |
| * Copyright (C) 2023, Tencent. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.revwalk; |
| |
| import java.io.IOException; |
| |
| import org.eclipse.jgit.errors.IncorrectObjectTypeException; |
| import org.eclipse.jgit.errors.MissingObjectException; |
| import org.eclipse.jgit.internal.storage.commitgraph.ChangedPathFilter; |
| import org.eclipse.jgit.internal.storage.commitgraph.CommitGraph; |
| import org.eclipse.jgit.lib.AnyObjectId; |
| import org.eclipse.jgit.lib.Constants; |
| import org.eclipse.jgit.lib.ObjectId; |
| |
| /** |
| * RevCommit parsed from |
| * {@link org.eclipse.jgit.internal.storage.commitgraph.CommitGraph}. |
| * |
| * @since 6.5 |
| */ |
| class RevCommitCG extends RevCommit { |
| |
| private final int graphPosition; |
| |
| private int generation = Constants.COMMIT_GENERATION_UNKNOWN; |
| |
| /** |
| * Create a new commit reference. |
| * |
| * @param id |
| * object name for the commit. |
| * @param graphPosition |
| * the position in the commit-graph of the object. |
| */ |
| protected RevCommitCG(AnyObjectId id, int graphPosition) { |
| super(id); |
| this.graphPosition = graphPosition; |
| } |
| |
| @Override |
| void parseCanonical(RevWalk walk, byte[] raw) throws IOException { |
| if (walk.isRetainBody()) { |
| buffer = raw; |
| } |
| parseInGraph(walk); |
| } |
| |
| @Override |
| void parseHeaders(RevWalk walk) throws MissingObjectException, |
| IncorrectObjectTypeException, IOException { |
| if (walk.isRetainBody()) { |
| super.parseBody(walk); // This parses header and body |
| return; |
| } |
| parseInGraph(walk); |
| } |
| |
| private void parseInGraph(RevWalk walk) throws IOException { |
| CommitGraph graph = walk.commitGraph(); |
| CommitGraph.CommitData data = graph.getCommitData(graphPosition); |
| if (data == null) { |
| // RevCommitCG was created because we got its graphPosition from |
| // commit-graph. If now the commit-graph doesn't know about it, |
| // something went wrong. |
| throw new IllegalStateException(); |
| } |
| if (!walk.shallowCommitsInitialized) { |
| walk.initializeShallowCommits(this); |
| } |
| |
| this.tree = walk.lookupTree(data.getTree()); |
| this.commitTime = (int) data.getCommitTime(); |
| this.generation = data.getGeneration(); |
| |
| if (getParents() == null) { |
| int[] pGraphList = data.getParents(); |
| if (pGraphList.length == 0) { |
| this.parents = RevCommit.NO_PARENTS; |
| } else { |
| RevCommit[] pList = new RevCommit[pGraphList.length]; |
| for (int i = 0; i < pList.length; i++) { |
| int graphPos = pGraphList[i]; |
| ObjectId objId = graph.getObjectId(graphPos); |
| pList[i] = walk.lookupCommit(objId, graphPos); |
| } |
| this.parents = pList; |
| } |
| } |
| flags |= PARSED; |
| } |
| |
| @Override |
| int getGeneration() { |
| return generation; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public ChangedPathFilter getChangedPathFilter(RevWalk rw) { |
| return rw.commitGraph().getChangedPathFilter(graphPosition); |
| } |
| } |