|
|
|
@ -110,24 +110,26 @@ public class ReceivePackAdvertiseRefsHookTest extends LocalDiskRepositoryTestCas
|
|
|
|
|
|
|
|
|
|
// Fill dst with a some common history.
|
|
|
|
|
//
|
|
|
|
|
TestRepository<Repository> d = new TestRepository<>(dst); |
|
|
|
|
a = d.blob("a"); |
|
|
|
|
A = d.commit(d.tree(d.file("a", a))); |
|
|
|
|
B = d.commit().parent(A).create(); |
|
|
|
|
d.update(R_MASTER, B); |
|
|
|
|
try (TestRepository<Repository> d = new TestRepository<>(dst)) { |
|
|
|
|
a = d.blob("a"); |
|
|
|
|
A = d.commit(d.tree(d.file("a", a))); |
|
|
|
|
B = d.commit().parent(A).create(); |
|
|
|
|
d.update(R_MASTER, B); |
|
|
|
|
|
|
|
|
|
// Clone from dst into src
|
|
|
|
|
//
|
|
|
|
|
try (Transport t = Transport.open(src, uriOf(dst))) { |
|
|
|
|
t.fetch(PM, |
|
|
|
|
Collections.singleton(new RefSpec("+refs/*:refs/*"))); |
|
|
|
|
assertEquals(B, src.resolve(R_MASTER)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Clone from dst into src
|
|
|
|
|
//
|
|
|
|
|
try (Transport t = Transport.open(src, uriOf(dst))) { |
|
|
|
|
t.fetch(PM, Collections.singleton(new RefSpec("+refs/*:refs/*"))); |
|
|
|
|
assertEquals(B, src.resolve(R_MASTER)); |
|
|
|
|
// Now put private stuff into dst.
|
|
|
|
|
//
|
|
|
|
|
b = d.blob("b"); |
|
|
|
|
P = d.commit(d.tree(d.file("b", b)), A); |
|
|
|
|
d.update(R_PRIVATE, P); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Now put private stuff into dst.
|
|
|
|
|
//
|
|
|
|
|
b = d.blob("b"); |
|
|
|
|
P = d.commit(d.tree(d.file("b", b)), A); |
|
|
|
|
d.update(R_PRIVATE, P); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@ -241,31 +243,33 @@ public class ReceivePackAdvertiseRefsHookTest extends LocalDiskRepositoryTestCas
|
|
|
|
|
|
|
|
|
|
// Now use b but in a different commit than what is hidden.
|
|
|
|
|
//
|
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", b).create(); |
|
|
|
|
s.update(R_MASTER, N); |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", b).create(); |
|
|
|
|
s.update(R_MASTER, N); |
|
|
|
|
|
|
|
|
|
// Push this new content to the remote, doing strict validation.
|
|
|
|
|
//
|
|
|
|
|
PushResult r; |
|
|
|
|
RemoteRefUpdate u = new RemoteRefUpdate( //
|
|
|
|
|
src, //
|
|
|
|
|
R_MASTER, // src name
|
|
|
|
|
R_MASTER, // dst name
|
|
|
|
|
false, // do not force update
|
|
|
|
|
null, // local tracking branch
|
|
|
|
|
null // expected id
|
|
|
|
|
); |
|
|
|
|
try (TransportLocal t = newTransportLocalWithStrictValidation()) { |
|
|
|
|
t.setPushThin(true); |
|
|
|
|
r = t.push(PM, Collections.singleton(u)); |
|
|
|
|
dst.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Push this new content to the remote, doing strict validation.
|
|
|
|
|
//
|
|
|
|
|
PushResult r; |
|
|
|
|
RemoteRefUpdate u = new RemoteRefUpdate( //
|
|
|
|
|
src, //
|
|
|
|
|
R_MASTER, // src name
|
|
|
|
|
R_MASTER, // dst name
|
|
|
|
|
false, // do not force update
|
|
|
|
|
null, // local tracking branch
|
|
|
|
|
null // expected id
|
|
|
|
|
); |
|
|
|
|
try (TransportLocal t = newTransportLocalWithStrictValidation()) { |
|
|
|
|
t.setPushThin(true); |
|
|
|
|
r = t.push(PM, Collections.singleton(u)); |
|
|
|
|
dst.close(); |
|
|
|
|
assertNotNull("have result", r); |
|
|
|
|
assertNull("private not advertised", r.getAdvertisedRef(R_PRIVATE)); |
|
|
|
|
assertSame("master updated", RemoteRefUpdate.Status.OK, |
|
|
|
|
u.getStatus()); |
|
|
|
|
assertEquals(N, dst.resolve(R_MASTER)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assertNotNull("have result", r); |
|
|
|
|
assertNull("private not advertised", r.getAdvertisedRef(R_PRIVATE)); |
|
|
|
|
assertSame("master updated", RemoteRefUpdate.Status.OK, u.getStatus()); |
|
|
|
|
assertEquals(N, dst.resolve(R_MASTER)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@ -318,154 +322,165 @@ public class ReceivePackAdvertiseRefsHookTest extends LocalDiskRepositoryTestCas
|
|
|
|
|
@Test |
|
|
|
|
public void testUsingHiddenDeltaBaseFails() throws Exception { |
|
|
|
|
byte[] delta = { 0x1, 0x1, 0x1, 'c' }; |
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", |
|
|
|
|
s.blob(BinaryDelta.apply(dst.open(b).getCachedBytes(), delta))) |
|
|
|
|
.create(); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 3); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(s.parseBody(N).getTree())); |
|
|
|
|
pack.write((Constants.OBJ_REF_DELTA) << 4 | 4); |
|
|
|
|
b.copyRawTo(pack); |
|
|
|
|
deflate(pack, delta); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() + ' ' |
|
|
|
|
+ "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevCommit N = s.commit().parent(B) |
|
|
|
|
.add("q", |
|
|
|
|
s.blob(BinaryDelta.apply( |
|
|
|
|
dst.open(b).getCachedBytes(), delta))) |
|
|
|
|
.create(); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 3); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(s.parseBody(N).getTree())); |
|
|
|
|
pack.write((Constants.OBJ_REF_DELTA) << 4 | 4); |
|
|
|
|
b.copyRawTo(pack); |
|
|
|
|
deflate(pack, delta); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() |
|
|
|
|
+ ' ' + "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(b, moe.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(b, moe.getObjectId()); |
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + b.name(), |
|
|
|
|
r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", |
|
|
|
|
r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + b.name(), r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testUsingHiddenCommonBlobFails() throws Exception { |
|
|
|
|
// Try to use the 'b' blob that is hidden.
|
|
|
|
|
//
|
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", s.blob("b")).create(); |
|
|
|
|
|
|
|
|
|
// But don't include it in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 2); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack,src.open(s.parseBody(N).getTree())); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() + ' ' |
|
|
|
|
+ "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", s.blob("b")).create(); |
|
|
|
|
|
|
|
|
|
// But don't include it in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 2); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(s.parseBody(N).getTree())); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() |
|
|
|
|
+ ' ' + "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(b, moe.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(b, moe.getObjectId()); |
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + b.name(), |
|
|
|
|
r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", |
|
|
|
|
r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + b.name(), r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testUsingUnknownBlobFails() throws Exception { |
|
|
|
|
// Try to use the 'n' blob that is not on the server.
|
|
|
|
|
//
|
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevBlob n = s.blob("n"); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", n).create(); |
|
|
|
|
|
|
|
|
|
// But don't include it in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 2); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack,src.open(s.parseBody(N).getTree())); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() + ' ' |
|
|
|
|
+ "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevBlob n = s.blob("n"); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", n).create(); |
|
|
|
|
|
|
|
|
|
// But don't include it in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 2); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(s.parseBody(N).getTree())); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() |
|
|
|
|
+ ' ' + "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(n, moe.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(n, moe.getObjectId()); |
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + n.name(), |
|
|
|
|
r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", |
|
|
|
|
r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing blob " + n.name(), r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@ -509,75 +524,79 @@ public class ReceivePackAdvertiseRefsHookTest extends LocalDiskRepositoryTestCas
|
|
|
|
|
.append(" url = -upayload.sh\n") |
|
|
|
|
.toString(); |
|
|
|
|
|
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevBlob blob = s.blob(fakeGitmodules); |
|
|
|
|
RevCommit N = s.commit().parent(B) |
|
|
|
|
.add(".gitmodules", blob).create(); |
|
|
|
|
RevTree t = s.parseBody(N).getTree(); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 3); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(t)); |
|
|
|
|
copy(pack, src.open(blob)); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() + ' ' |
|
|
|
|
+ "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
return inBuf; |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevBlob blob = s.blob(fakeGitmodules); |
|
|
|
|
RevCommit N = s.commit().parent(B).add(".gitmodules", blob) |
|
|
|
|
.create(); |
|
|
|
|
RevTree t = s.parseBody(N).getTree(); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 3); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
copy(pack, src.open(t)); |
|
|
|
|
copy(pack, src.open(blob)); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() |
|
|
|
|
+ ' ' + "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
return inBuf; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testUsingUnknownTreeFails() throws Exception { |
|
|
|
|
TestRepository<Repository> s = new TestRepository<>(src); |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", s.blob("a")).create(); |
|
|
|
|
RevTree t = s.parseBody(N).getTree(); |
|
|
|
|
|
|
|
|
|
// Don't include the tree in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 1); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() + ' ' |
|
|
|
|
+ "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
try (TestRepository<Repository> s = new TestRepository<>(src)) { |
|
|
|
|
RevCommit N = s.commit().parent(B).add("q", s.blob("a")).create(); |
|
|
|
|
RevTree t = s.parseBody(N).getTree(); |
|
|
|
|
|
|
|
|
|
// Don't include the tree in the pack.
|
|
|
|
|
//
|
|
|
|
|
final TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024); |
|
|
|
|
packHeader(pack, 1); |
|
|
|
|
copy(pack, src.open(N)); |
|
|
|
|
digest(pack); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap inBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final PacketLineOut inPckLine = new PacketLineOut(inBuf); |
|
|
|
|
inPckLine.writeString(ObjectId.zeroId().name() + ' ' + N.name() |
|
|
|
|
+ ' ' + "refs/heads/s" + '\0' |
|
|
|
|
+ BasePackPushConnection.CAPABILITY_REPORT_STATUS); |
|
|
|
|
inPckLine.end(); |
|
|
|
|
pack.writeTo(inBuf, PM); |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(t, moe.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final TemporaryBuffer.Heap outBuf = new TemporaryBuffer.Heap(1024); |
|
|
|
|
final ReceivePack rp = new ReceivePack(dst); |
|
|
|
|
rp.setCheckReceivedObjects(true); |
|
|
|
|
rp.setCheckReferencedObjectsAreReachable(true); |
|
|
|
|
rp.setAdvertiseRefsHook(new HidePrivateHook()); |
|
|
|
|
try { |
|
|
|
|
receive(rp, inBuf, outBuf); |
|
|
|
|
fail("Expected UnpackException"); |
|
|
|
|
} catch (UnpackException failed) { |
|
|
|
|
Throwable err = failed.getCause(); |
|
|
|
|
assertTrue(err instanceof MissingObjectException); |
|
|
|
|
MissingObjectException moe = (MissingObjectException) err; |
|
|
|
|
assertEquals(t, moe.getObjectId()); |
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing tree " + t.name(), |
|
|
|
|
r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", |
|
|
|
|
r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final PacketLineIn r = asPacketLineIn(outBuf); |
|
|
|
|
String master = r.readString(); |
|
|
|
|
int nul = master.indexOf('\0'); |
|
|
|
|
assertTrue("has capability list", nul > 0); |
|
|
|
|
assertEquals(B.name() + ' ' + R_MASTER, master.substring(0, nul)); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
|
|
|
|
|
assertEquals("unpack error Missing tree " + t.name(), r.readString()); |
|
|
|
|
assertEquals("ng refs/heads/s n/a (unpacker error)", r.readString()); |
|
|
|
|
assertSame(PacketLineIn.END, r.readString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void packHeader(TemporaryBuffer.Heap tinyPack, int cnt) |
|
|
|
|