@ -312,19 +312,21 @@ static int find_common(struct fetch_negotiator *negotiator,
const char * remote_hex ;
struct object * o ;
/*
* If that object is complete ( i . e . it is an ancestor of a
* local ref ) , we tell them we have it but do not have to
* tell them about its ancestors , which they already know
* about .
*
* We use lookup_object here because we are only
* interested in the case we * know * the object is
* reachable and we have already scanned it .
*/
if ( ( ( o = lookup_object ( the_repository , remote ) ) ! = NULL ) & &
( o - > flags & COMPLETE ) ) {
continue ;
if ( ! args - > refetch ) {
/*
* If that object is complete ( i . e . it is an ancestor of a
* local ref ) , we tell them we have it but do not have to
* tell them about its ancestors , which they already know
* about .
*
* We use lookup_object here because we are only
* interested in the case we * know * the object is
* reachable and we have already scanned it .
*/
if ( ( ( o = lookup_object ( the_repository , remote ) ) ! = NULL ) & &
( o - > flags & COMPLETE ) ) {
continue ;
}
}
remote_hex = oid_to_hex ( remote ) ;
@ -692,6 +694,9 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
int old_save_commit_buffer = save_commit_buffer ;
timestamp_t cutoff = 0 ;
if ( args - > refetch )
return ;
save_commit_buffer = 0 ;
trace2_region_enter ( " fetch-pack " , " parse_remote_refs_and_find_cutoff " , NULL ) ;
@ -1028,7 +1033,11 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
struct fetch_negotiator * negotiator ;
negotiator = & negotiator_alloc ;
fetch_negotiator_init ( r , negotiator ) ;
if ( args - > refetch ) {
fetch_negotiator_init_noop ( negotiator ) ;
} else {
fetch_negotiator_init ( r , negotiator ) ;
}
sort_ref_list ( & ref , ref_compare_name ) ;
QSORT ( sought , nr_sought , cmp_ref_by_name ) ;
@ -1121,7 +1130,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
mark_complete_and_common_ref ( negotiator , args , & ref ) ;
filter_refs ( args , & ref , sought , nr_sought ) ;
if ( everything_local ( args , & ref ) ) {
if ( ! args - > refetch & & everything_local ( args , & ref ) ) {
packet_flush ( fd [ 1 ] ) ;
goto all_done ;
}
@ -1587,7 +1596,10 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
struct strvec index_pack_args = STRVEC_INIT ;
negotiator = & negotiator_alloc ;
fetch_negotiator_init ( r , negotiator ) ;
if ( args - > refetch )
fetch_negotiator_init_noop ( negotiator ) ;
else
fetch_negotiator_init ( r , negotiator ) ;
packet_reader_init ( & reader , fd [ 0 ] , NULL , 0 ,
PACKET_READ_CHOMP_NEWLINE |
@ -1613,7 +1625,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
/* Filter 'ref' by 'sought' and those that aren't local */
mark_complete_and_common_ref ( negotiator , args , & ref ) ;
filter_refs ( args , & ref , sought , nr_sought ) ;
if ( everything_local ( args , & ref ) )
if ( ! args - > refetch & & everything_local ( args , & ref ) )
state = FETCH_DONE ;
else
state = FETCH_SEND_REQUEST ;