@ -166,6 +166,9 @@ public class ReceivePack {
/** The refs we advertised as existing at the start of the connection. */
/** The refs we advertised as existing at the start of the connection. */
private Map < String , Ref > refs ;
private Map < String , Ref > refs ;
/** All SHA-1s shown to the client, which can be possible edges. */
private Set < ObjectId > advertisedHaves ;
/** Capabilities requested by the client. */
/** Capabilities requested by the client. */
private Set < String > enabledCapablities ;
private Set < String > enabledCapablities ;
@ -208,6 +211,7 @@ public class ReceivePack {
refFilter = RefFilter . DEFAULT ;
refFilter = RefFilter . DEFAULT ;
preReceive = PreReceiveHook . NULL ;
preReceive = PreReceiveHook . NULL ;
postReceive = PostReceiveHook . NULL ;
postReceive = PostReceiveHook . NULL ;
advertisedHaves = new HashSet < ObjectId > ( ) ;
}
}
private static class ReceiveConfig {
private static class ReceiveConfig {
@ -251,9 +255,28 @@ public class ReceivePack {
/** @return all refs which were advertised to the client. */
/** @return all refs which were advertised to the client. */
public final Map < String , Ref > getAdvertisedRefs ( ) {
public final Map < String , Ref > getAdvertisedRefs ( ) {
if ( refs = = null ) {
refs = refFilter . filter ( db . getAllRefs ( ) ) ;
Ref head = refs . get ( Constants . HEAD ) ;
if ( head ! = null & & head . isSymbolic ( ) )
refs . remove ( Constants . HEAD ) ;
for ( Ref ref : refs . values ( ) ) {
if ( ref . getObjectId ( ) ! = null )
advertisedHaves . add ( ref . getObjectId ( ) ) ;
}
advertisedHaves . addAll ( db . getAdditionalHaves ( ) ) ;
}
return refs ;
return refs ;
}
}
/** @return the set of objects advertised as present in this repository. */
public final Set < ObjectId > getAdvertisedObjects ( ) {
getAdvertisedRefs ( ) ;
return advertisedHaves ;
}
/ * *
/ * *
* @return true if this instance will validate all referenced , but not
* @return true if this instance will validate all referenced , but not
* supplied by the client , objects are reachable from another
* supplied by the client , objects are reachable from another
@ -629,7 +652,7 @@ public class ReceivePack {
sendAdvertisedRefs ( new PacketLineOutRefAdvertiser ( pckOut ) ) ;
sendAdvertisedRefs ( new PacketLineOutRefAdvertiser ( pckOut ) ) ;
pckOut . flush ( ) ;
pckOut . flush ( ) ;
} else
} else
refs = refFilter . filter ( db . getAllRefs ( ) ) ;
getAdvertisedRefs ( ) ;
if ( advertiseError ! = null )
if ( advertiseError ! = null )
return ;
return ;
recvCommands ( ) ;
recvCommands ( ) ;
@ -707,12 +730,9 @@ public class ReceivePack {
adv . advertiseCapability ( CAPABILITY_REPORT_STATUS ) ;
adv . advertiseCapability ( CAPABILITY_REPORT_STATUS ) ;
if ( allowOfsDelta )
if ( allowOfsDelta )
adv . advertiseCapability ( CAPABILITY_OFS_DELTA ) ;
adv . advertiseCapability ( CAPABILITY_OFS_DELTA ) ;
refs = refFilter . filter ( db . getAllRefs ( ) ) ;
adv . send ( getAdvertisedRefs ( ) ) ;
final Ref head = refs . remove ( Constants . HEAD ) ;
for ( ObjectId obj : advertisedHaves )
adv . send ( refs ) ;
adv . advertiseHave ( obj ) ;
if ( head ! = null & & ! head . isSymbolic ( ) )
adv . advertiseHave ( head . getObjectId ( ) ) ;
adv . includeAdditionalHaves ( db ) ;
if ( adv . isEmpty ( ) )
if ( adv . isEmpty ( ) )
adv . advertiseId ( ObjectId . zeroId ( ) , "capabilities^{}" ) ;
adv . advertiseId ( ObjectId . zeroId ( ) , "capabilities^{}" ) ;
adv . end ( ) ;
adv . end ( ) ;
@ -847,8 +867,8 @@ public class ReceivePack {
continue ;
continue ;
ow . markStart ( ow . parseAny ( cmd . getNewId ( ) ) ) ;
ow . markStart ( ow . parseAny ( cmd . getNewId ( ) ) ) ;
}
}
for ( final Ref ref : refs . values ( ) ) {
for ( final ObjectId have : advertisedHaves ) {
RevObject o = ow . parseAny ( ref . getObjectId ( ) ) ;
RevObject o = ow . parseAny ( have ) ;
ow . markUninteresting ( o ) ;
ow . markUninteresting ( o ) ;
if ( checkReferencedIsReachable & & ! baseObjects . isEmpty ( ) ) {
if ( checkReferencedIsReachable & & ! baseObjects . isEmpty ( ) ) {