blob: 5e993eab2219c76477275baba783559b47fc159b [file] [log] [blame]
/*
* Copyright (C) 2022, 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.internal.storage.commitgraph;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_DATA;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_BLOOM_FILTER_INDEX;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_COMMIT_DATA;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_EXTRA_EDGE_LIST;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_FANOUT;
import static org.eclipse.jgit.internal.storage.commitgraph.CommitGraphConstants.CHUNK_ID_OID_LOOKUP;
import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
import java.text.MessageFormat;
import org.eclipse.jgit.internal.JGitText;
/**
* Builder for {@link CommitGraph}.
*/
class CommitGraphBuilder {
private final int hashLength;
private byte[] oidFanout;
private byte[] oidLookup;
private byte[] commitData;
private byte[] extraList;
private byte[] bloomFilterIndex;
private byte[] bloomFilterData;
/**
* Create builder
*
* @return A builder of {@link CommitGraph}.
*/
static CommitGraphBuilder builder() {
return new CommitGraphBuilder(OBJECT_ID_LENGTH);
}
private CommitGraphBuilder(int hashLength) {
this.hashLength = hashLength;
}
CommitGraphBuilder addOidFanout(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(oidFanout, CHUNK_ID_OID_FANOUT);
oidFanout = buffer;
return this;
}
CommitGraphBuilder addOidLookUp(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(oidLookup, CHUNK_ID_OID_LOOKUP);
oidLookup = buffer;
return this;
}
CommitGraphBuilder addCommitData(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(commitData, CHUNK_ID_COMMIT_DATA);
commitData = buffer;
return this;
}
CommitGraphBuilder addExtraList(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(extraList, CHUNK_ID_EXTRA_EDGE_LIST);
extraList = buffer;
return this;
}
CommitGraphBuilder addBloomFilterIndex(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(bloomFilterIndex, CHUNK_ID_BLOOM_FILTER_INDEX);
bloomFilterIndex = buffer;
return this;
}
CommitGraphBuilder addBloomFilterData(byte[] buffer)
throws CommitGraphFormatException {
assertChunkNotSeenYet(bloomFilterData, CHUNK_ID_BLOOM_FILTER_DATA);
bloomFilterData = buffer;
return this;
}
CommitGraph build() throws CommitGraphFormatException {
assertChunkNotNull(oidFanout, CHUNK_ID_OID_FANOUT);
assertChunkNotNull(oidLookup, CHUNK_ID_OID_LOOKUP);
assertChunkNotNull(commitData, CHUNK_ID_COMMIT_DATA);
GraphObjectIndex index = new GraphObjectIndex(hashLength, oidFanout,
oidLookup);
GraphCommitData commitDataChunk = new GraphCommitData(hashLength,
commitData, extraList);
GraphChangedPathFilterData cpfData = new GraphChangedPathFilterData(
bloomFilterIndex, bloomFilterData);
return new CommitGraphV1(index, commitDataChunk, cpfData);
}
private void assertChunkNotNull(Object object, int chunkId)
throws CommitGraphFormatException {
if (object == null) {
throw new CommitGraphFormatException(
MessageFormat.format(JGitText.get().commitGraphChunkNeeded,
Integer.toHexString(chunkId)));
}
}
private void assertChunkNotSeenYet(Object object, int chunkId)
throws CommitGraphFormatException {
if (object != null) {
throw new CommitGraphFormatException(MessageFormat.format(
JGitText.get().commitGraphChunkRepeated,
Integer.toHexString(chunkId)));
}
}
}