@ -3,6 +3,10 @@
# include "csum-file.h"
# include "remote.h"
# include "chunk-format.h"
# include "pack-mtimes.h"
# include "oidmap.h"
# include "chunk-format.h"
# include "pack-objects.h"
void reset_pack_idx_option ( struct pack_idx_option * opts )
{
@ -277,6 +281,70 @@ const char *write_rev_file_order(const char *rev_name,
return rev_name ;
}
static void write_mtimes_header ( struct hashfile * f )
{
hashwrite_be32 ( f , MTIMES_SIGNATURE ) ;
hashwrite_be32 ( f , MTIMES_VERSION ) ;
hashwrite_be32 ( f , oid_version ( the_hash_algo ) ) ;
}
/*
* Writes the object mtimes of " objects " for use in a . mtimes file .
* Note that objects must be in lexicographic ( index ) order , which is
* the expected ordering of these values in the . mtimes file .
*/
static void write_mtimes_objects ( struct hashfile * f ,
struct packing_data * to_pack ,
struct pack_idx_entry * * objects ,
uint32_t nr_objects )
{
uint32_t i ;
for ( i = 0 ; i < nr_objects ; i + + ) {
struct object_entry * e = ( struct object_entry * ) objects [ i ] ;
hashwrite_be32 ( f , oe_cruft_mtime ( to_pack , e ) ) ;
}
}
static void write_mtimes_trailer ( struct hashfile * f , const unsigned char * hash )
{
hashwrite ( f , hash , the_hash_algo - > rawsz ) ;
}
static const char * write_mtimes_file ( const char * mtimes_name ,
struct packing_data * to_pack ,
struct pack_idx_entry * * objects ,
uint32_t nr_objects ,
const unsigned char * hash )
{
struct hashfile * f ;
int fd ;
if ( ! to_pack )
BUG ( " cannot call write_mtimes_file with NULL packing_data " ) ;
if ( ! mtimes_name ) {
struct strbuf tmp_file = STRBUF_INIT ;
fd = odb_mkstemp ( & tmp_file , " pack/tmp_mtimes_XXXXXX " ) ;
mtimes_name = strbuf_detach ( & tmp_file , NULL ) ;
} else {
unlink ( mtimes_name ) ;
fd = xopen ( mtimes_name , O_CREAT | O_EXCL | O_WRONLY , 0600 ) ;
}
f = hashfd ( fd , mtimes_name ) ;
write_mtimes_header ( f ) ;
write_mtimes_objects ( f , to_pack , objects , nr_objects ) ;
write_mtimes_trailer ( f , hash ) ;
if ( adjust_shared_perm ( mtimes_name ) < 0 )
die ( _ ( " failed to make %s readable " ) , mtimes_name ) ;
finalize_hashfile ( f , NULL , FSYNC_COMPONENT_PACK_METADATA ,
CSUM_HASH_IN_STREAM | CSUM_CLOSE | CSUM_FSYNC ) ;
return mtimes_name ;
}
off_t write_pack_header ( struct hashfile * f , uint32_t nr_entries )
{
struct pack_header hdr ;
@ -479,6 +547,7 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
char * * idx_tmp_name )
{
const char * rev_tmp_name = NULL ;
const char * mtimes_tmp_name = NULL ;
if ( adjust_shared_perm ( pack_tmp_name ) )
die_errno ( " unable to make temporary pack file readable " ) ;
@ -491,9 +560,17 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
rev_tmp_name = write_rev_file ( NULL , written_list , nr_written , hash ,
pack_idx_opts - > flags ) ;
if ( pack_idx_opts - > flags & WRITE_MTIMES ) {
mtimes_tmp_name = write_mtimes_file ( NULL , to_pack , written_list ,
nr_written ,
hash ) ;
}
rename_tmp_packfile ( name_buffer , pack_tmp_name , " pack " ) ;
if ( rev_tmp_name )
rename_tmp_packfile ( name_buffer , rev_tmp_name , " rev " ) ;
if ( mtimes_tmp_name )
rename_tmp_packfile ( name_buffer , mtimes_tmp_name , " mtimes " ) ;
}
void write_promisor_file ( const char * promisor_name , struct ref * * sought , int nr_sought )