]> source.dussan.org Git - jgit.git/commit
Do not write edge objects to the pack stream 46/4646/5
authorShawn O. Pearce <spearce@spearce.org>
Thu, 17 Nov 2011 19:23:18 +0000 (11:23 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 18 Nov 2011 23:55:52 +0000 (15:55 -0800)
commit60e51251db0b703db8374a9470fa035dc0f811f9
tree471577614786f23e8687251e94339080e4c44243
parent1421106d7627eb2c55b97b70d105b5ba1e26a2c0
Do not write edge objects to the pack stream

Consider two objects A->B where A uses B as a delta base, and these
are in the same source pack file ordered as "A B".

If cached packs is enabled and B is also in the cached pack that
will be appended onto the end of the thin pack, and both A, B are
supposed to be in the thin pack, PackWriter must consider the fact
that A's base B is an edge object that claims to be part of the
new pack, but is actually "external" and cannot be written first.

If the object reuse system considered B candidates fist this bug
does not arise, as B will be marked as edge due to it existing in
the cached pack. When the A candidates are later examined, A sees a
valid delta base is available as an edge, and will not later try to
"write base first" during the writing phase.

However, when the reuse system considers A candidates first they
see that B will be in the outgoing pack, as it is still part of
the thin pack, and arrange for A to be written first. Later when A
switches from being in-pack to being an edge object (as it is part
of the cached pack) the pointer in B does not get its type changed
from ObjectToPack to ObjectId, so B thinks A is non-edge.

We work around this case by also checking that the delta base B
is non-edge before writing the object to the pack. Later when A
writes its object header, delta base B's ObjectToPack will have
an offset == 0, which makes isWritten() = false, and the OBJ_REF
delta format will be used for A's header. This will be resolved by
the client to the copy of B that appears in the later cached pack.

Change-Id: Ifab6bfdf3c0aa93649468f49bcf91d67f90362ca
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java