summaryrefslogtreecommitdiff
path: root/src/odb_loose.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2013-11-04 14:50:25 -0500
committerEdward Thomson <ethomson@microsoft.com>2013-11-04 14:50:25 -0500
commitdd64c71c2685d0b72b6f58149ecf2a972a6ea98b (patch)
treeb94556b25f9d8ac17494bcff2bbc46de20704b37 /src/odb_loose.c
parentbecb13c0f04c4ba54cf27303136293dbf8abfd73 (diff)
downloadlibgit2-dd64c71c2685d0b72b6f58149ecf2a972a6ea98b.tar.gz
Allow backend consumers to specify file mode
Diffstat (limited to 'src/odb_loose.c')
-rw-r--r--src/odb_loose.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/odb_loose.c b/src/odb_loose.c
index 07dfae539..0dfd78aee 100644
--- a/src/odb_loose.c
+++ b/src/odb_loose.c
@@ -33,6 +33,8 @@ typedef struct loose_backend {
int object_zlib_level; /** loose object zlib compression level. */
int fsync_object_files; /** loose object file fsync flag. */
+ mode_t object_file_mode;
+ mode_t object_dir_mode;
size_t objects_dirlen;
char objects_dir[GIT_FLEX_ARRAY];
@@ -79,7 +81,7 @@ static int object_file_name(
static int object_mkdir(const git_buf *name, const loose_backend *be)
{
return git_futils_mkdir(
- name->ptr + be->objects_dirlen, be->objects_dir, GIT_OBJECT_DIR_MODE,
+ name->ptr + be->objects_dirlen, be->objects_dir, be->object_dir_mode,
GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR);
}
@@ -787,7 +789,7 @@ static int loose_backend__stream_fwrite(git_odb_stream *_stream, const git_oid *
error = -1;
else
error = git_filebuf_commit_at(
- &stream->fbuf, final_path.ptr, GIT_OBJECT_FILE_MODE);
+ &stream->fbuf, final_path.ptr, backend->object_file_mode);
git_buf_free(&final_path);
@@ -876,7 +878,7 @@ static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, c
if (object_file_name(&final_path, backend, oid) < 0 ||
object_mkdir(&final_path, backend) < 0 ||
- git_filebuf_commit_at(&fbuf, final_path.ptr, GIT_OBJECT_FILE_MODE) < 0)
+ git_filebuf_commit_at(&fbuf, final_path.ptr, backend->object_file_mode) < 0)
error = -1;
cleanup:
@@ -899,7 +901,9 @@ int git_odb_backend_loose(
git_odb_backend **backend_out,
const char *objects_dir,
int compression_level,
- int do_fsync)
+ int do_fsync,
+ mode_t dir_mode,
+ mode_t file_mode)
{
loose_backend *backend;
size_t objects_dirlen;
@@ -920,8 +924,16 @@ int git_odb_backend_loose(
if (compression_level < 0)
compression_level = Z_BEST_SPEED;
+ if (dir_mode == 0)
+ dir_mode = GIT_OBJECT_DIR_MODE;
+
+ if (file_mode == 0)
+ file_mode = GIT_OBJECT_FILE_MODE;
+
backend->object_zlib_level = compression_level;
backend->fsync_object_files = do_fsync;
+ backend->object_dir_mode = dir_mode;
+ backend->object_file_mode = file_mode;
backend->parent.read = &loose_backend__read;
backend->parent.write = &loose_backend__write;