|
|
|
@ -103,7 +103,6 @@ import org.eclipse.jgit.revwalk.RevObject;
|
|
|
|
|
import org.eclipse.jgit.revwalk.RevSort; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevTag; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevTree; |
|
|
|
|
import org.eclipse.jgit.storage.file.PackIndex; |
|
|
|
|
import org.eclipse.jgit.storage.file.PackIndexWriter; |
|
|
|
|
import org.eclipse.jgit.util.BlockList; |
|
|
|
|
import org.eclipse.jgit.util.TemporaryBuffer; |
|
|
|
@ -144,6 +143,18 @@ import org.eclipse.jgit.util.TemporaryBuffer;
|
|
|
|
|
public class PackWriter { |
|
|
|
|
private static final int PACK_VERSION_GENERATED = 2; |
|
|
|
|
|
|
|
|
|
/** A collection of object ids. */ |
|
|
|
|
public interface ObjectIdSet { |
|
|
|
|
/** |
|
|
|
|
* Returns true if the objectId is contained within the collection. |
|
|
|
|
* |
|
|
|
|
* @param objectId |
|
|
|
|
* the objectId to find |
|
|
|
|
* @return whether the collection contains the objectId. |
|
|
|
|
*/ |
|
|
|
|
boolean contains(AnyObjectId objectId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static final Map<WeakReference<PackWriter>, Boolean> instances = |
|
|
|
|
new ConcurrentHashMap<WeakReference<PackWriter>, Boolean>(); |
|
|
|
|
|
|
|
|
@ -206,9 +217,9 @@ public class PackWriter {
|
|
|
|
|
|
|
|
|
|
private Set<ObjectId> tagTargets = Collections.emptySet(); |
|
|
|
|
|
|
|
|
|
private PackIndex[] excludeInPacks; |
|
|
|
|
private ObjectIdSet[] excludeInPacks; |
|
|
|
|
|
|
|
|
|
private PackIndex excludeInPackLast; |
|
|
|
|
private ObjectIdSet excludeInPackLast; |
|
|
|
|
|
|
|
|
|
private Deflater myDeflater; |
|
|
|
|
|
|
|
|
@ -507,19 +518,40 @@ public class PackWriter {
|
|
|
|
|
return stats.totalObjects; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Returns the object ids in the pack file that was created by this writer, |
|
|
|
|
* sorted by name. |
|
|
|
|
* |
|
|
|
|
* This method can only be invoked after |
|
|
|
|
* {@link #writePack(ProgressMonitor, ProgressMonitor, OutputStream)} has |
|
|
|
|
* been invoked and completed successfully. |
|
|
|
|
* |
|
|
|
|
* @return number of objects in pack. |
|
|
|
|
* @throws IOException |
|
|
|
|
* a cached pack cannot supply its object ids. |
|
|
|
|
*/ |
|
|
|
|
public List<ObjectId> getObjectList() throws IOException { |
|
|
|
|
if (!cachedPacks.isEmpty()) |
|
|
|
|
throw new IOException( |
|
|
|
|
JGitText.get().cachedPacksPreventsListingObjects); |
|
|
|
|
|
|
|
|
|
return Collections.unmodifiableList( |
|
|
|
|
(List<? extends ObjectId>) sortByName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Add a pack index whose contents should be excluded from the result. |
|
|
|
|
* |
|
|
|
|
* @param idx |
|
|
|
|
* objects in this index will not be in the output pack. |
|
|
|
|
*/ |
|
|
|
|
public void excludeObjects(PackIndex idx) { |
|
|
|
|
public void excludeObjects(ObjectIdSet idx) { |
|
|
|
|
if (excludeInPacks == null) { |
|
|
|
|
excludeInPacks = new PackIndex[] { idx }; |
|
|
|
|
excludeInPacks = new ObjectIdSet[] { idx }; |
|
|
|
|
excludeInPackLast = idx; |
|
|
|
|
} else { |
|
|
|
|
int cnt = excludeInPacks.length; |
|
|
|
|
PackIndex[] newList = new PackIndex[cnt + 1]; |
|
|
|
|
ObjectIdSet[] newList = new ObjectIdSet[cnt + 1]; |
|
|
|
|
System.arraycopy(excludeInPacks, 0, newList, 0, cnt); |
|
|
|
|
newList[cnt] = idx; |
|
|
|
|
excludeInPacks = newList; |
|
|
|
@ -1798,10 +1830,10 @@ public class PackWriter {
|
|
|
|
|
private boolean exclude(AnyObjectId objectId) { |
|
|
|
|
if (excludeInPacks == null) |
|
|
|
|
return false; |
|
|
|
|
if (excludeInPackLast.hasObject(objectId)) |
|
|
|
|
if (excludeInPackLast.contains(objectId)) |
|
|
|
|
return true; |
|
|
|
|
for (PackIndex idx : excludeInPacks) { |
|
|
|
|
if (idx.hasObject(objectId)) { |
|
|
|
|
for (ObjectIdSet idx : excludeInPacks) { |
|
|
|
|
if (idx.contains(objectId)) { |
|
|
|
|
excludeInPackLast = idx; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|