}
res.set(toSearch[off]);
- if (res.object.isEdge()) {
+ if (res.object.isEdge() || res.object.doNotAttemptDelta()) {
// We don't actually want to make a delta for
// them, just need to push them into the window
// so they can be read by other objects.
private static final int EDGE = 1 << 3;
+ private static final int DELTA_ATTEMPTED = 1 << 4;
+
+ private static final int ATTEMPT_DELTA_MASK = REUSE_AS_IS | DELTA_ATTEMPTED;
+
private static final int TYPE_SHIFT = 5;
private static final int EXT_SHIFT = 8;
* <li>1 bit: canReuseAsIs</li>
* <li>1 bit: doNotDelta</li>
* <li>1 bit: edgeObject</li>
- * <li>1 bit: unused</li>
+ * <li>1 bit: deltaAttempted</li>
* <li>3 bits: type</li>
* <li>4 bits: subclass flags (if any)</li>
* <li>--</li>
flags |= EDGE;
}
+ boolean doNotAttemptDelta() {
+ // Do not attempt if delta attempted and object reuse.
+ return (flags & ATTEMPT_DELTA_MASK) == ATTEMPT_DELTA_MASK;
+ }
+
+ boolean isDeltaAttempted() {
+ return (flags & DELTA_ATTEMPTED) != 0;
+ }
+
+ void setDeltaAttempted(boolean deltaAttempted) {
+ if (deltaAttempted)
+ flags |= DELTA_ATTEMPTED;
+ else
+ flags &= ~DELTA_ATTEMPTED;
+ }
+
/** @return the extended flags on this object, in the range [0x0, 0xf]. */
protected int getExtendedFlags() {
return (flags >>> EXT_SHIFT) & EXT_MASK;
}
/**
- * @return true if this is a delta against another object and this is stored
- * in pack delta format.
+ * @return the storage format type, which must be one of
+ * {@link #PACK_DELTA}, {@link #PACK_WHOLE}, or
+ * {@link #FORMAT_OTHER}.
*/
public int getFormat() {
return FORMAT_OTHER;
public ObjectId getDeltaBase() {
return null;
}
+
+ /**
+ * @return whether the current representation of the object has had delta
+ * compression attempted on it.
+ */
+ public boolean wasDeltaAttempted() {
+ int fmt = getFormat();
+ return fmt == PACK_DELTA || fmt == PACK_WHOLE;
+ }
}