reftable: support preset file mode for writing

Create files with mode 0666, so umask works as intended. Provides an override,
which is useful to support shared repos (test t1301-shared-repo.sh).

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Han-Wen Nienhuys
2021-12-23 19:29:50 +00:00
committed by Junio C Hamano
parent 0dd44584ab
commit cd1799dea0
3 changed files with 56 additions and 10 deletions

View File

@ -17,6 +17,7 @@ https://developers.google.com/open-source/licenses/bsd
#include "record.h"
#include "test_framework.h"
#include "reftable-tests.h"
#include "reader.h"
#include <sys/types.h>
#include <dirent.h>
@ -138,8 +139,11 @@ static int write_test_log(struct reftable_writer *wr, void *arg)
static void test_reftable_stack_add_one(void)
{
char *dir = get_tmp_dir(__LINE__);
struct reftable_write_options cfg = { 0 };
struct strbuf scratch = STRBUF_INIT;
int mask = umask(002);
struct reftable_write_options cfg = {
.default_permissions = 0660,
};
struct reftable_stack *st = NULL;
int err;
struct reftable_ref_record ref = {
@ -149,8 +153,7 @@ static void test_reftable_stack_add_one(void)
.value.symref = "master",
};
struct reftable_ref_record dest = { NULL };
struct stat stat_result = { 0 };
err = reftable_new_stack(&st, dir, cfg);
EXPECT_ERR(err);
@ -160,6 +163,7 @@ static void test_reftable_stack_add_one(void)
err = reftable_stack_read_ref(st, ref.refname, &dest);
EXPECT_ERR(err);
EXPECT(0 == strcmp("master", dest.value.symref));
EXPECT(st->readers_len > 0);
printf("testing print functionality:\n");
err = reftable_stack_print_directory(dir, GIT_SHA1_FORMAT_ID);
@ -168,9 +172,30 @@ static void test_reftable_stack_add_one(void)
err = reftable_stack_print_directory(dir, GIT_SHA256_FORMAT_ID);
EXPECT(err == REFTABLE_FORMAT_ERROR);
#ifndef GIT_WINDOWS_NATIVE
strbuf_addstr(&scratch, dir);
strbuf_addstr(&scratch, "/tables.list");
err = stat(scratch.buf, &stat_result);
EXPECT(!err);
EXPECT((stat_result.st_mode & 0777) == cfg.default_permissions);
strbuf_reset(&scratch);
strbuf_addstr(&scratch, dir);
strbuf_addstr(&scratch, "/");
/* do not try at home; not an external API for reftable. */
strbuf_addstr(&scratch, st->readers[0]->name);
err = stat(scratch.buf, &stat_result);
EXPECT(!err);
EXPECT((stat_result.st_mode & 0777) == cfg.default_permissions);
#else
(void) stat_result;
#endif
reftable_ref_record_release(&dest);
reftable_stack_destroy(st);
strbuf_release(&scratch);
clear_dir(dir);
umask(mask);
}
static void test_reftable_stack_uptodate(void)