Break the dependency on RevObject when creating a newObjectToPack().

Update the ObjectReuseAsIs API to support creating new
ObjectToPack with only the AnyObjectId and Git object type. This is
needed to support the future pack index bitmaps, which only contain
this information and do not want the overhead of creating a temporary
object for every ObjectId.

Change-Id: I906360b471412688bf429ecef74fd988f47875dc
This commit is contained in:
Colby Ranger 2012-08-27 16:08:42 -07:00
parent 8d4f227c13
commit be7a135e94
8 changed files with 25 additions and 35 deletions

View File

@ -94,7 +94,7 @@ private static byte[] getDelta(ObjectReader reader, RevObject obj)
throws IOException, MissingObjectException,
StoredObjectRepresentationNotAvailableException {
ObjectReuseAsIs asis = (ObjectReuseAsIs) reader;
ObjectToPack target = asis.newObjectToPack(obj);
ObjectToPack target = asis.newObjectToPack(obj, obj.getType());
PackWriter pw = new PackWriter(reader) {
@Override

View File

@ -43,7 +43,7 @@
package org.eclipse.jgit.storage.dfs;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.storage.pack.ObjectToPack;
import org.eclipse.jgit.storage.pack.StoredObjectRepresentation;
@ -61,8 +61,8 @@ class DfsObjectToPack extends ObjectToPack {
/** Length of the data section of the object. */
long length;
DfsObjectToPack(RevObject obj) {
super(obj);
DfsObjectToPack(AnyObjectId src, final int type) {
super(src, type);
}
@Override

View File

@ -83,7 +83,6 @@
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.revwalk.ObjectWalk;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.pack.CachedPack;
import org.eclipse.jgit.storage.pack.ObjectReuseAsIs;
@ -433,8 +432,8 @@ public long getObjectSize(AnyObjectId objectId, int typeHint)
throw new MissingObjectException(objectId.copy(), typeHint);
}
public DfsObjectToPack newObjectToPack(RevObject obj) {
return new DfsObjectToPack(obj);
public DfsObjectToPack newObjectToPack(AnyObjectId objectId, int type) {
return new DfsObjectToPack(objectId, type);
}
private static final Comparator<DfsObjectRepresentation> REPRESENTATION_SORT = new Comparator<DfsObjectRepresentation>() {

View File

@ -43,7 +43,7 @@
package org.eclipse.jgit.storage.file;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.storage.pack.ObjectToPack;
import org.eclipse.jgit.storage.pack.StoredObjectRepresentation;
@ -58,8 +58,8 @@ class LocalObjectToPack extends ObjectToPack {
/** Length of the data section of the object. */
long length;
LocalObjectToPack(RevObject obj) {
super(obj);
LocalObjectToPack(AnyObjectId src, final int type) {
super(src, type);
}
@Override

View File

@ -68,7 +68,6 @@
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.storage.pack.CachedPack;
import org.eclipse.jgit.storage.pack.ObjectReuseAsIs;
import org.eclipse.jgit.storage.pack.ObjectToPack;
@ -148,8 +147,8 @@ public long getObjectSize(AnyObjectId objectId, int typeHint)
return sz;
}
public LocalObjectToPack newObjectToPack(RevObject obj) {
return new LocalObjectToPack(obj);
public LocalObjectToPack newObjectToPack(AnyObjectId objectId, int type) {
return new LocalObjectToPack(objectId, type);
}
public void selectObjectRepresentation(PackWriter packer,

View File

@ -49,9 +49,9 @@
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.revwalk.RevObject;
/**
* Extension of {@link ObjectReader} that supports reusing objects in packs.
@ -71,13 +71,13 @@ public interface ObjectReuseAsIs {
* object state, such as to remember what file and offset contains the
* object's pack encoded data.
*
* @param obj
* identity of the object that will be packed. The object's
* parsed status is undefined here. Implementers must not rely on
* the object being parsed.
* @param objectId
* the id of the object that will be packed.
* @param type
* the Git type of the object that will be packed.
* @return a new instance for this object.
*/
public ObjectToPack newObjectToPack(RevObject obj);
public ObjectToPack newObjectToPack(AnyObjectId objectId, int type);
/**
* Select the best object representation for a packer.

View File

@ -47,7 +47,6 @@
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.transport.PackedObjectInfo;
/**
@ -120,18 +119,6 @@ public ObjectToPack(AnyObjectId src, final int type) {
flags = type << TYPE_SHIFT;
}
/**
* Construct for the specified object.
*
* @param obj
* identity of the object that will be packed. The object's
* parsed status is undefined here. Implementers must not rely on
* the object being parsed.
*/
public ObjectToPack(RevObject obj) {
this(obj, obj.getType());
}
/**
* @return delta base object id if object is going to be packed in delta
* representation; null otherwise - if going to be packed as a

View File

@ -1826,13 +1826,18 @@ public void addObject(final RevObject object)
}
private void addObject(final RevObject object, final int pathHashCode) {
addObject(object, object.getType(), pathHashCode);
}
private void addObject(
final AnyObjectId src, final int type, final int pathHashCode) {
final ObjectToPack otp;
if (reuseSupport != null)
otp = reuseSupport.newObjectToPack(object);
otp = reuseSupport.newObjectToPack(src, type);
else
otp = new ObjectToPack(object);
otp = new ObjectToPack(src, type);
otp.setPathHash(pathHashCode);
objectsLists[object.getType()].add(otp);
objectsLists[type].add(otp);
objectsMap.add(otp);
}