@@ -46,10 +46,7 @@ typedef struct {
4646typedef struct loose_backend {
4747 git_odb_backend parent ;
4848
49- int object_zlib_level ; /** loose object zlib compression level. */
50- int fsync_object_files ; /** loose object file fsync flag. */
51- mode_t object_file_mode ;
52- mode_t object_dir_mode ;
49+ git_odb_backend_loose_options options ;
5350
5451 size_t objects_dirlen ;
5552 char objects_dir [GIT_FLEX_ARRAY ];
@@ -100,7 +97,9 @@ static int object_file_name(
10097static int object_mkdir (const git_str * name , const loose_backend * be )
10198{
10299 return git_futils_mkdir_relative (
103- name -> ptr + be -> objects_dirlen , be -> objects_dir , be -> object_dir_mode ,
100+ name -> ptr + be -> objects_dirlen ,
101+ be -> objects_dir ,
102+ be -> options .dir_mode ,
104103 GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR , NULL );
105104}
106105
@@ -827,9 +826,10 @@ static void loose_backend__writestream_free(git_odb_stream *_stream)
827826static int filebuf_flags (loose_backend * backend )
828827{
829828 int flags = GIT_FILEBUF_TEMPORARY |
830- (backend -> object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT );
829+ (backend -> options . compression_level << GIT_FILEBUF_DEFLATE_SHIFT );
831830
832- if (backend -> fsync_object_files || git_repository__fsync_gitdir )
831+ if ((backend -> options .flags & GIT_ODB_BACKEND_LOOSE_FSYNC ) ||
832+ git_repository__fsync_gitdir )
833833 flags |= GIT_FILEBUF_FSYNC ;
834834
835835 return flags ;
@@ -865,7 +865,7 @@ static int loose_backend__writestream(git_odb_stream **stream_out, git_odb_backe
865865
866866 if (git_str_joinpath (& tmp_path , backend -> objects_dir , "tmp_object" ) < 0 ||
867867 git_filebuf_open (& stream -> fbuf , tmp_path .ptr , filebuf_flags (backend ),
868- backend -> object_file_mode ) < 0 ||
868+ backend -> options . file_mode ) < 0 ||
869869 stream -> stream .write ((git_odb_stream * )stream , hdr , hdrlen ) < 0 )
870870 {
871871 git_filebuf_cleanup (& stream -> fbuf );
@@ -1083,7 +1083,7 @@ static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, c
10831083
10841084 if (git_str_joinpath (& final_path , backend -> objects_dir , "tmp_object" ) < 0 ||
10851085 git_filebuf_open (& fbuf , final_path .ptr , filebuf_flags (backend ),
1086- backend -> object_file_mode ) < 0 )
1086+ backend -> options . file_mode ) < 0 )
10871087 {
10881088 error = -1 ;
10891089 goto cleanup ;
@@ -1126,13 +1126,31 @@ static void loose_backend__free(git_odb_backend *_backend)
11261126 git__free (_backend );
11271127}
11281128
1129+ static void normalize_options (
1130+ git_odb_backend_loose_options * opts ,
1131+ const git_odb_backend_loose_options * given_opts )
1132+ {
1133+ git_odb_backend_loose_options init = GIT_ODB_BACKEND_LOOSE_OPTIONS_INIT ;
1134+
1135+ if (given_opts )
1136+ memcpy (opts , given_opts , sizeof (git_odb_backend_loose_options ));
1137+ else
1138+ memcpy (opts , & init , sizeof (git_odb_backend_loose_options ));
1139+
1140+ if (opts -> compression_level < 0 )
1141+ opts -> compression_level = Z_BEST_SPEED ;
1142+
1143+ if (opts -> dir_mode == 0 )
1144+ opts -> dir_mode = GIT_OBJECT_DIR_MODE ;
1145+
1146+ if (opts -> file_mode == 0 )
1147+ opts -> file_mode = GIT_OBJECT_FILE_MODE ;
1148+ }
1149+
11291150int git_odb_backend_loose (
11301151 git_odb_backend * * backend_out ,
11311152 const char * objects_dir ,
1132- int compression_level ,
1133- int do_fsync ,
1134- unsigned int dir_mode ,
1135- unsigned int file_mode )
1153+ git_odb_backend_loose_options * opts )
11361154{
11371155 loose_backend * backend ;
11381156 size_t objects_dirlen , alloclen ;
@@ -1150,22 +1168,11 @@ int git_odb_backend_loose(
11501168 backend -> parent .version = GIT_ODB_BACKEND_VERSION ;
11511169 backend -> objects_dirlen = objects_dirlen ;
11521170 memcpy (backend -> objects_dir , objects_dir , objects_dirlen );
1171+
11531172 if (backend -> objects_dir [backend -> objects_dirlen - 1 ] != '/' )
11541173 backend -> objects_dir [backend -> objects_dirlen ++ ] = '/' ;
11551174
1156- if (compression_level < 0 )
1157- compression_level = Z_BEST_SPEED ;
1158-
1159- if (dir_mode == 0 )
1160- dir_mode = GIT_OBJECT_DIR_MODE ;
1161-
1162- if (file_mode == 0 )
1163- file_mode = GIT_OBJECT_FILE_MODE ;
1164-
1165- backend -> object_zlib_level = compression_level ;
1166- backend -> fsync_object_files = do_fsync ;
1167- backend -> object_dir_mode = dir_mode ;
1168- backend -> object_file_mode = file_mode ;
1175+ normalize_options (& backend -> options , opts );
11691176
11701177 backend -> parent .read = & loose_backend__read ;
11711178 backend -> parent .write = & loose_backend__write ;
0 commit comments