Merge branch 'ps/reftable-detach' into ps/reftable-iterator-reuse

* ps/reftable-detach:
  reftable/system: provide thin wrapper for lockfile subsystem
  reftable/stack: drop only use of `get_locked_file_path()`
  reftable/system: provide thin wrapper for tempfile subsystem
  reftable/stack: stop using `fsync_component()` directly
  reftable/system: stop depending on "hash.h"
  reftable: explicitly handle hash format IDs
  reftable/system: move "dir.h" to its only user
This commit is contained in:
Junio C Hamano
2024-11-19 12:24:33 +09:00
27 changed files with 507 additions and 230 deletions

View File

@ -2722,6 +2722,7 @@ REFTABLE_OBJS += reftable/pq.o
REFTABLE_OBJS += reftable/reader.o REFTABLE_OBJS += reftable/reader.o
REFTABLE_OBJS += reftable/record.o REFTABLE_OBJS += reftable/record.o
REFTABLE_OBJS += reftable/stack.o REFTABLE_OBJS += reftable/stack.o
REFTABLE_OBJS += reftable/system.o
REFTABLE_OBJS += reftable/tree.o REFTABLE_OBJS += reftable/tree.o
REFTABLE_OBJS += reftable/writer.o REFTABLE_OBJS += reftable/writer.o

View File

@ -15,6 +15,7 @@
#include "../object.h" #include "../object.h"
#include "../path.h" #include "../path.h"
#include "../refs.h" #include "../refs.h"
#include "../reftable/reftable-basics.h"
#include "../reftable/reftable-stack.h" #include "../reftable/reftable-stack.h"
#include "../reftable/reftable-record.h" #include "../reftable/reftable-record.h"
#include "../reftable/reftable-error.h" #include "../reftable/reftable-error.h"
@ -23,6 +24,7 @@
#include "../setup.h" #include "../setup.h"
#include "../strmap.h" #include "../strmap.h"
#include "../trace2.h" #include "../trace2.h"
#include "../write-or-die.h"
#include "parse.h" #include "parse.h"
#include "refs-internal.h" #include "refs-internal.h"
@ -272,6 +274,11 @@ static int reftable_be_config(const char *var, const char *value,
return 0; return 0;
} }
static int reftable_be_fsync(int fd)
{
return fsync_component(FSYNC_COMPONENT_REFERENCE, fd);
}
static struct ref_store *reftable_be_init(struct repository *repo, static struct ref_store *reftable_be_init(struct repository *repo,
const char *gitdir, const char *gitdir,
unsigned int store_flags) unsigned int store_flags)
@ -289,11 +296,21 @@ static struct ref_store *reftable_be_init(struct repository *repo,
refs->store_flags = store_flags; refs->store_flags = store_flags;
refs->log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo); refs->log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo);
refs->write_options.hash_id = repo->hash_algo->format_id; switch (repo->hash_algo->format_id) {
case GIT_SHA1_FORMAT_ID:
refs->write_options.hash_id = REFTABLE_HASH_SHA1;
break;
case GIT_SHA256_FORMAT_ID:
refs->write_options.hash_id = REFTABLE_HASH_SHA256;
break;
default:
BUG("unknown hash algorithm %d", repo->hash_algo->format_id);
}
refs->write_options.default_permissions = calc_shared_perm(0666 & ~mask); refs->write_options.default_permissions = calc_shared_perm(0666 & ~mask);
refs->write_options.disable_auto_compact = refs->write_options.disable_auto_compact =
!git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1); !git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
refs->write_options.lock_timeout_ms = 100; refs->write_options.lock_timeout_ms = 100;
refs->write_options.fsync = reftable_be_fsync;
git_config(reftable_be_config, &refs->write_options); git_config(reftable_be_config, &refs->write_options);

View File

@ -271,14 +271,15 @@ int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b)
return p; return p;
} }
int hash_size(uint32_t id) int hash_size(enum reftable_hash id)
{ {
if (!id)
return REFTABLE_HASH_SIZE_SHA1;
switch (id) { switch (id) {
case 0: case REFTABLE_HASH_SHA1:
case GIT_SHA1_FORMAT_ID: return REFTABLE_HASH_SIZE_SHA1;
return GIT_SHA1_RAWSZ; case REFTABLE_HASH_SHA256:
case GIT_SHA256_FORMAT_ID: return REFTABLE_HASH_SIZE_SHA256;
return GIT_SHA256_RAWSZ;
} }
abort(); abort();
} }

View File

@ -148,6 +148,14 @@ char *reftable_strdup(const char *str);
/* Find the longest shared prefix size of `a` and `b` */ /* Find the longest shared prefix size of `a` and `b` */
int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b); int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b);
int hash_size(uint32_t id); int hash_size(enum reftable_hash id);
/*
* Format IDs that identify the hash function used by a reftable. Note that
* these constants end up on disk and thus mustn't change. The format IDs are
* "sha1" and "s256" in big endian, respectively.
*/
#define REFTABLE_FORMAT_ID_SHA1 ((uint32_t) 0x73686131)
#define REFTABLE_FORMAT_ID_SHA256 ((uint32_t) 0x73323536)
#endif #endif

View File

@ -181,7 +181,7 @@ static void iterator_from_merged_iter(struct reftable_iterator *it,
int reftable_merged_table_new(struct reftable_merged_table **dest, int reftable_merged_table_new(struct reftable_merged_table **dest,
struct reftable_reader **readers, size_t n, struct reftable_reader **readers, size_t n,
uint32_t hash_id) enum reftable_hash hash_id)
{ {
struct reftable_merged_table *m = NULL; struct reftable_merged_table *m = NULL;
uint64_t last_max = 0; uint64_t last_max = 0;
@ -293,7 +293,7 @@ int reftable_merged_table_init_log_iterator(struct reftable_merged_table *mt,
return merged_table_init_iter(mt, it, BLOCK_TYPE_LOG); return merged_table_init_iter(mt, it, BLOCK_TYPE_LOG);
} }
uint32_t reftable_merged_table_hash_id(struct reftable_merged_table *mt) enum reftable_hash reftable_merged_table_hash_id(struct reftable_merged_table *mt)
{ {
return mt->hash_id; return mt->hash_id;
} }

View File

@ -10,11 +10,12 @@ https://developers.google.com/open-source/licenses/bsd
#define MERGED_H #define MERGED_H
#include "system.h" #include "system.h"
#include "reftable-basics.h"
struct reftable_merged_table { struct reftable_merged_table {
struct reftable_reader **readers; struct reftable_reader **readers;
size_t readers_len; size_t readers_len;
uint32_t hash_id; enum reftable_hash hash_id;
/* If unset, produce deletions. This is useful for compaction. For the /* If unset, produce deletions. This is useful for compaction. For the
* full stack, deletions should be produced. */ * full stack, deletions should be produced. */

View File

@ -67,7 +67,7 @@ static int reader_get_block(struct reftable_reader *r,
return block_source_read_block(&r->source, dest, off, sz); return block_source_read_block(&r->source, dest, off, sz);
} }
uint32_t reftable_reader_hash_id(struct reftable_reader *r) enum reftable_hash reftable_reader_hash_id(struct reftable_reader *r)
{ {
return r->hash_id; return r->hash_id;
} }
@ -107,18 +107,20 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer,
f += 8; f += 8;
if (r->version == 1) { if (r->version == 1) {
r->hash_id = GIT_SHA1_FORMAT_ID; r->hash_id = REFTABLE_HASH_SHA1;
} else { } else {
r->hash_id = get_be32(f); switch (get_be32(f)) {
switch (r->hash_id) { case REFTABLE_FORMAT_ID_SHA1:
case GIT_SHA1_FORMAT_ID: r->hash_id = REFTABLE_HASH_SHA1;
break; break;
case GIT_SHA256_FORMAT_ID: case REFTABLE_FORMAT_ID_SHA256:
r->hash_id = REFTABLE_HASH_SHA256;
break; break;
default: default:
err = REFTABLE_FORMAT_ERROR; err = REFTABLE_FORMAT_ERROR;
goto done; goto done;
} }
f += 4; f += 4;
} }

View File

@ -37,8 +37,8 @@ struct reftable_reader {
/* Size of the file, excluding the footer. */ /* Size of the file, excluding the footer. */
uint64_t size; uint64_t size;
/* 'sha1' for SHA1, 's256' for SHA-256 */ /* The hash function used for ref records. */
uint32_t hash_id; enum reftable_hash hash_id;
uint32_t block_size; uint32_t block_size;
uint64_t min_update_index; uint64_t min_update_index;

View File

@ -11,6 +11,19 @@
#include <stddef.h> #include <stddef.h>
/*
* Hash functions understood by the reftable library. Note that the values are
* arbitrary and somewhat random such that we can easily detect cases where the
* hash hasn't been properly set up.
*/
enum reftable_hash {
REFTABLE_HASH_SHA1 = 89,
REFTABLE_HASH_SHA256 = 247,
};
#define REFTABLE_HASH_SIZE_SHA1 20
#define REFTABLE_HASH_SIZE_SHA256 32
#define REFTABLE_HASH_SIZE_MAX REFTABLE_HASH_SIZE_SHA256
/* Overrides the functions to use for memory management. */ /* Overrides the functions to use for memory management. */
void reftable_set_alloc(void *(*malloc)(size_t), void reftable_set_alloc(void *(*malloc)(size_t),
void *(*realloc)(void *, size_t), void (*free)(void *)); void *(*realloc)(void *, size_t), void (*free)(void *));

View File

@ -34,7 +34,7 @@ struct reftable_reader;
*/ */
int reftable_merged_table_new(struct reftable_merged_table **dest, int reftable_merged_table_new(struct reftable_merged_table **dest,
struct reftable_reader **readers, size_t n, struct reftable_reader **readers, size_t n,
uint32_t hash_id); enum reftable_hash hash_id);
/* Initialize a merged table iterator for reading refs. */ /* Initialize a merged table iterator for reading refs. */
int reftable_merged_table_init_ref_iterator(struct reftable_merged_table *mt, int reftable_merged_table_init_ref_iterator(struct reftable_merged_table *mt,
@ -56,6 +56,6 @@ reftable_merged_table_min_update_index(struct reftable_merged_table *mt);
void reftable_merged_table_free(struct reftable_merged_table *m); void reftable_merged_table_free(struct reftable_merged_table *m);
/* return the hash ID of the merged table. */ /* return the hash ID of the merged table. */
uint32_t reftable_merged_table_hash_id(struct reftable_merged_table *m); enum reftable_hash reftable_merged_table_hash_id(struct reftable_merged_table *m);
#endif #endif

View File

@ -54,7 +54,7 @@ int reftable_reader_init_log_iterator(struct reftable_reader *r,
struct reftable_iterator *it); struct reftable_iterator *it);
/* returns the hash ID used in this table. */ /* returns the hash ID used in this table. */
uint32_t reftable_reader_hash_id(struct reftable_reader *r); enum reftable_hash reftable_reader_hash_id(struct reftable_reader *r);
/* return an iterator for the refs pointing to `oid`. */ /* return an iterator for the refs pointing to `oid`. */
int reftable_reader_refs_for(struct reftable_reader *r, int reftable_reader_refs_for(struct reftable_reader *r,

View File

@ -9,7 +9,7 @@ https://developers.google.com/open-source/licenses/bsd
#ifndef REFTABLE_RECORD_H #ifndef REFTABLE_RECORD_H
#define REFTABLE_RECORD_H #define REFTABLE_RECORD_H
#include "hash.h" #include "reftable-basics.h"
#include <stdint.h> #include <stdint.h>
/* /*
@ -40,10 +40,10 @@ struct reftable_ref_record {
#define REFTABLE_NR_REF_VALUETYPES 4 #define REFTABLE_NR_REF_VALUETYPES 4
} value_type; } value_type;
union { union {
unsigned char val1[GIT_MAX_RAWSZ]; unsigned char val1[REFTABLE_HASH_SIZE_MAX];
struct { struct {
unsigned char value[GIT_MAX_RAWSZ]; /* first hash */ unsigned char value[REFTABLE_HASH_SIZE_MAX]; /* first hash */
unsigned char target_value[GIT_MAX_RAWSZ]; /* second hash */ unsigned char target_value[REFTABLE_HASH_SIZE_MAX]; /* second hash */
} val2; } val2;
char *symref; /* referent, malloced 0-terminated string */ char *symref; /* referent, malloced 0-terminated string */
} value; } value;
@ -85,8 +85,8 @@ struct reftable_log_record {
union { union {
struct { struct {
unsigned char new_hash[GIT_MAX_RAWSZ]; unsigned char new_hash[REFTABLE_HASH_SIZE_MAX];
unsigned char old_hash[GIT_MAX_RAWSZ]; unsigned char old_hash[REFTABLE_HASH_SIZE_MAX];
char *name; char *name;
char *email; char *email;
uint64_t time; uint64_t time;

View File

@ -33,7 +33,7 @@ struct reftable_write_options {
/* 4-byte identifier ("sha1", "s256") of the hash. /* 4-byte identifier ("sha1", "s256") of the hash.
* Defaults to SHA1 if unset * Defaults to SHA1 if unset
*/ */
uint32_t hash_id; enum reftable_hash hash_id;
/* Default mode for creating files. If unset, use 0666 (+umask) */ /* Default mode for creating files. If unset, use 0666 (+umask) */
unsigned int default_permissions; unsigned int default_permissions;
@ -62,6 +62,12 @@ struct reftable_write_options {
* negative value will cause us to block indefinitely. * negative value will cause us to block indefinitely.
*/ */
long lock_timeout_ms; long lock_timeout_ms;
/*
* Optional callback used to fsync files to disk. Falls back to using
* fsync(3P) when unset.
*/
int (*fsync)(int fd);
}; };
/* reftable_block_stats holds statistics for a single block type */ /* reftable_block_stats holds statistics for a single block type */

View File

@ -8,7 +8,6 @@ https://developers.google.com/open-source/licenses/bsd
#include "stack.h" #include "stack.h"
#include "../write-or-die.h"
#include "system.h" #include "system.h"
#include "constants.h" #include "constants.h"
#include "merged.h" #include "merged.h"
@ -17,7 +16,6 @@ https://developers.google.com/open-source/licenses/bsd
#include "reftable-record.h" #include "reftable-record.h"
#include "reftable-merged.h" #include "reftable-merged.h"
#include "writer.h" #include "writer.h"
#include "tempfile.h"
static int stack_try_add(struct reftable_stack *st, static int stack_try_add(struct reftable_stack *st,
int (*write_table)(struct reftable_writer *wr, int (*write_table)(struct reftable_writer *wr,
@ -43,17 +41,28 @@ static int stack_filename(struct reftable_buf *dest, struct reftable_stack *st,
return 0; return 0;
} }
static ssize_t reftable_fd_write(void *arg, const void *data, size_t sz) static int stack_fsync(const struct reftable_write_options *opts, int fd)
{ {
int *fdp = (int *)arg; if (opts->fsync)
return write_in_full(*fdp, data, sz); return opts->fsync(fd);
return fsync(fd);
} }
static int reftable_fd_flush(void *arg) struct fd_writer {
{ const struct reftable_write_options *opts;
int *fdp = (int *)arg; int fd;
};
return fsync_component(FSYNC_COMPONENT_REFERENCE, *fdp); static ssize_t fd_writer_write(void *arg, const void *data, size_t sz)
{
struct fd_writer *writer = arg;
return write_in_full(writer->fd, data, sz);
}
static int fd_writer_flush(void *arg)
{
struct fd_writer *writer = arg;
return stack_fsync(writer->opts, writer->fd);
} }
int reftable_new_stack(struct reftable_stack **dest, const char *dir, int reftable_new_stack(struct reftable_stack **dest, const char *dir,
@ -73,7 +82,7 @@ int reftable_new_stack(struct reftable_stack **dest, const char *dir,
if (_opts) if (_opts)
opts = *_opts; opts = *_opts;
if (opts.hash_id == 0) if (opts.hash_id == 0)
opts.hash_id = GIT_SHA1_FORMAT_ID; opts.hash_id = REFTABLE_HASH_SHA1;
*dest = NULL; *dest = NULL;
@ -648,7 +657,7 @@ static int format_name(struct reftable_buf *dest, uint64_t min, uint64_t max)
} }
struct reftable_addition { struct reftable_addition {
struct lock_file tables_list_lock; struct reftable_flock tables_list_lock;
struct reftable_stack *stack; struct reftable_stack *stack;
char **new_tables; char **new_tables;
@ -667,10 +676,8 @@ static int reftable_stack_init_addition(struct reftable_addition *add,
add->stack = st; add->stack = st;
err = hold_lock_file_for_update_timeout(&add->tables_list_lock, err = flock_acquire(&add->tables_list_lock, st->list_file,
st->list_file, st->opts.lock_timeout_ms);
LOCK_NO_DEREF,
st->opts.lock_timeout_ms);
if (err < 0) { if (err < 0) {
if (errno == EEXIST) { if (errno == EEXIST) {
err = REFTABLE_LOCK_ERROR; err = REFTABLE_LOCK_ERROR;
@ -680,7 +687,7 @@ static int reftable_stack_init_addition(struct reftable_addition *add,
goto done; goto done;
} }
if (st->opts.default_permissions) { if (st->opts.default_permissions) {
if (chmod(get_lock_file_path(&add->tables_list_lock), if (chmod(add->tables_list_lock.path,
st->opts.default_permissions) < 0) { st->opts.default_permissions) < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
@ -724,7 +731,7 @@ static void reftable_addition_close(struct reftable_addition *add)
add->new_tables_len = 0; add->new_tables_len = 0;
add->new_tables_cap = 0; add->new_tables_cap = 0;
rollback_lock_file(&add->tables_list_lock); flock_release(&add->tables_list_lock);
reftable_buf_release(&nm); reftable_buf_release(&nm);
} }
@ -740,7 +747,6 @@ void reftable_addition_destroy(struct reftable_addition *add)
int reftable_addition_commit(struct reftable_addition *add) int reftable_addition_commit(struct reftable_addition *add)
{ {
struct reftable_buf table_list = REFTABLE_BUF_INIT; struct reftable_buf table_list = REFTABLE_BUF_INIT;
int lock_file_fd = get_lock_file_fd(&add->tables_list_lock);
int err = 0; int err = 0;
size_t i; size_t i;
@ -758,20 +764,20 @@ int reftable_addition_commit(struct reftable_addition *add)
goto done; goto done;
} }
err = write_in_full(lock_file_fd, table_list.buf, table_list.len); err = write_in_full(add->tables_list_lock.fd, table_list.buf, table_list.len);
reftable_buf_release(&table_list); reftable_buf_release(&table_list);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
} }
err = fsync_component(FSYNC_COMPONENT_REFERENCE, lock_file_fd); err = stack_fsync(&add->stack->opts, add->tables_list_lock.fd);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
} }
err = commit_lock_file(&add->tables_list_lock); err = flock_commit(&add->tables_list_lock);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
@ -857,9 +863,11 @@ int reftable_addition_add(struct reftable_addition *add,
struct reftable_buf tab_file_name = REFTABLE_BUF_INIT; struct reftable_buf tab_file_name = REFTABLE_BUF_INIT;
struct reftable_buf next_name = REFTABLE_BUF_INIT; struct reftable_buf next_name = REFTABLE_BUF_INIT;
struct reftable_writer *wr = NULL; struct reftable_writer *wr = NULL;
struct tempfile *tab_file = NULL; struct reftable_tmpfile tab_file = REFTABLE_TMPFILE_INIT;
struct fd_writer writer = {
.opts = &add->stack->opts,
};
int err = 0; int err = 0;
int tab_fd;
reftable_buf_reset(&next_name); reftable_buf_reset(&next_name);
@ -875,22 +883,20 @@ int reftable_addition_add(struct reftable_addition *add,
if (err < 0) if (err < 0)
goto done; goto done;
tab_file = mks_tempfile(temp_tab_file_name.buf); err = tmpfile_from_pattern(&tab_file, temp_tab_file_name.buf);
if (!tab_file) { if (err < 0)
err = REFTABLE_IO_ERROR;
goto done; goto done;
}
if (add->stack->opts.default_permissions) { if (add->stack->opts.default_permissions) {
if (chmod(get_tempfile_path(tab_file), if (chmod(tab_file.path,
add->stack->opts.default_permissions)) { add->stack->opts.default_permissions)) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
} }
} }
tab_fd = get_tempfile_fd(tab_file);
err = reftable_writer_new(&wr, reftable_fd_write, reftable_fd_flush, writer.fd = tab_file.fd;
&tab_fd, &add->stack->opts); err = reftable_writer_new(&wr, fd_writer_write, fd_writer_flush,
&writer, &add->stack->opts);
if (err < 0) if (err < 0)
goto done; goto done;
@ -906,11 +912,9 @@ int reftable_addition_add(struct reftable_addition *add,
if (err < 0) if (err < 0)
goto done; goto done;
err = close_tempfile_gently(tab_file); err = tmpfile_close(&tab_file);
if (err < 0) { if (err < 0)
err = REFTABLE_IO_ERROR;
goto done; goto done;
}
if (wr->min_update_index < add->next_update_index) { if (wr->min_update_index < add->next_update_index) {
err = REFTABLE_API_ERROR; err = REFTABLE_API_ERROR;
@ -933,11 +937,9 @@ int reftable_addition_add(struct reftable_addition *add,
On windows, this relies on rand() picking a unique destination name. On windows, this relies on rand() picking a unique destination name.
Maybe we should do retry loop as well? Maybe we should do retry loop as well?
*/ */
err = rename_tempfile(&tab_file, tab_file_name.buf); err = tmpfile_rename(&tab_file, tab_file_name.buf);
if (err < 0) { if (err < 0)
err = REFTABLE_IO_ERROR;
goto done; goto done;
}
REFTABLE_ALLOC_GROW(add->new_tables, add->new_tables_len + 1, REFTABLE_ALLOC_GROW(add->new_tables, add->new_tables_len + 1,
add->new_tables_cap); add->new_tables_cap);
@ -948,7 +950,7 @@ int reftable_addition_add(struct reftable_addition *add,
add->new_tables[add->new_tables_len++] = reftable_buf_detach(&next_name); add->new_tables[add->new_tables_len++] = reftable_buf_detach(&next_name);
done: done:
delete_tempfile(&tab_file); tmpfile_delete(&tab_file);
reftable_buf_release(&temp_tab_file_name); reftable_buf_release(&temp_tab_file_name);
reftable_buf_release(&tab_file_name); reftable_buf_release(&tab_file_name);
reftable_buf_release(&next_name); reftable_buf_release(&next_name);
@ -968,13 +970,16 @@ uint64_t reftable_stack_next_update_index(struct reftable_stack *st)
static int stack_compact_locked(struct reftable_stack *st, static int stack_compact_locked(struct reftable_stack *st,
size_t first, size_t last, size_t first, size_t last,
struct reftable_log_expiry_config *config, struct reftable_log_expiry_config *config,
struct tempfile **tab_file_out) struct reftable_tmpfile *tab_file_out)
{ {
struct reftable_buf next_name = REFTABLE_BUF_INIT; struct reftable_buf next_name = REFTABLE_BUF_INIT;
struct reftable_buf tab_file_path = REFTABLE_BUF_INIT; struct reftable_buf tab_file_path = REFTABLE_BUF_INIT;
struct reftable_writer *wr = NULL; struct reftable_writer *wr = NULL;
struct tempfile *tab_file; struct fd_writer writer= {
int tab_fd, err = 0; .opts = &st->opts,
};
struct reftable_tmpfile tab_file = REFTABLE_TMPFILE_INIT;
int err = 0;
err = format_name(&next_name, reftable_reader_min_update_index(st->readers[first]), err = format_name(&next_name, reftable_reader_min_update_index(st->readers[first]),
reftable_reader_max_update_index(st->readers[last])); reftable_reader_max_update_index(st->readers[last]));
@ -989,21 +994,19 @@ static int stack_compact_locked(struct reftable_stack *st,
if (err < 0) if (err < 0)
goto done; goto done;
tab_file = mks_tempfile(tab_file_path.buf); err = tmpfile_from_pattern(&tab_file, tab_file_path.buf);
if (!tab_file) { if (err < 0)
err = REFTABLE_IO_ERROR;
goto done; goto done;
}
tab_fd = get_tempfile_fd(tab_file);
if (st->opts.default_permissions && if (st->opts.default_permissions &&
chmod(get_tempfile_path(tab_file), st->opts.default_permissions) < 0) { chmod(tab_file.path, st->opts.default_permissions) < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
} }
err = reftable_writer_new(&wr, reftable_fd_write, reftable_fd_flush, writer.fd = tab_file.fd;
&tab_fd, &st->opts); err = reftable_writer_new(&wr, fd_writer_write, fd_writer_flush,
&writer, &st->opts);
if (err < 0) if (err < 0)
goto done; goto done;
@ -1015,15 +1018,15 @@ static int stack_compact_locked(struct reftable_stack *st,
if (err < 0) if (err < 0)
goto done; goto done;
err = close_tempfile_gently(tab_file); err = tmpfile_close(&tab_file);
if (err < 0) if (err < 0)
goto done; goto done;
*tab_file_out = tab_file; *tab_file_out = tab_file;
tab_file = NULL; tab_file = REFTABLE_TMPFILE_INIT;
done: done:
delete_tempfile(&tab_file); tmpfile_delete(&tab_file);
reftable_writer_free(wr); reftable_writer_free(wr);
reftable_buf_release(&next_name); reftable_buf_release(&next_name);
reftable_buf_release(&tab_file_path); reftable_buf_release(&tab_file_path);
@ -1154,9 +1157,9 @@ static int stack_compact_range(struct reftable_stack *st,
struct reftable_buf new_table_name = REFTABLE_BUF_INIT; struct reftable_buf new_table_name = REFTABLE_BUF_INIT;
struct reftable_buf new_table_path = REFTABLE_BUF_INIT; struct reftable_buf new_table_path = REFTABLE_BUF_INIT;
struct reftable_buf table_name = REFTABLE_BUF_INIT; struct reftable_buf table_name = REFTABLE_BUF_INIT;
struct lock_file tables_list_lock = LOCK_INIT; struct reftable_flock tables_list_lock = REFTABLE_FLOCK_INIT;
struct lock_file *table_locks = NULL; struct reftable_flock *table_locks = NULL;
struct tempfile *new_table = NULL; struct reftable_tmpfile new_table = REFTABLE_TMPFILE_INIT;
int is_empty_table = 0, err = 0; int is_empty_table = 0, err = 0;
size_t first_to_replace, last_to_replace; size_t first_to_replace, last_to_replace;
size_t i, nlocks = 0; size_t i, nlocks = 0;
@ -1173,10 +1176,7 @@ static int stack_compact_range(struct reftable_stack *st,
* Hold the lock so that we can read "tables.list" and lock all tables * Hold the lock so that we can read "tables.list" and lock all tables
* which are part of the user-specified range. * which are part of the user-specified range.
*/ */
err = hold_lock_file_for_update_timeout(&tables_list_lock, err = flock_acquire(&tables_list_lock, st->list_file, st->opts.lock_timeout_ms);
st->list_file,
LOCK_NO_DEREF,
st->opts.lock_timeout_ms);
if (err < 0) { if (err < 0) {
if (errno == EEXIST) if (errno == EEXIST)
err = REFTABLE_LOCK_ERROR; err = REFTABLE_LOCK_ERROR;
@ -1199,19 +1199,20 @@ static int stack_compact_range(struct reftable_stack *st,
* older process is still busy compacting tables which are preexisting * older process is still busy compacting tables which are preexisting
* from the point of view of the newer process. * from the point of view of the newer process.
*/ */
REFTABLE_CALLOC_ARRAY(table_locks, last - first + 1); REFTABLE_ALLOC_ARRAY(table_locks, last - first + 1);
if (!table_locks) { if (!table_locks) {
err = REFTABLE_OUT_OF_MEMORY_ERROR; err = REFTABLE_OUT_OF_MEMORY_ERROR;
goto done; goto done;
} }
for (i = 0; i < last - first + 1; i++)
table_locks[i] = REFTABLE_FLOCK_INIT;
for (i = last + 1; i > first; i--) { for (i = last + 1; i > first; i--) {
err = stack_filename(&table_name, st, reader_name(st->readers[i - 1])); err = stack_filename(&table_name, st, reader_name(st->readers[i - 1]));
if (err < 0) if (err < 0)
goto done; goto done;
err = hold_lock_file_for_update(&table_locks[nlocks], err = flock_acquire(&table_locks[nlocks], table_name.buf, 0);
table_name.buf, LOCK_NO_DEREF);
if (err < 0) { if (err < 0) {
/* /*
* When the table is locked already we may do a * When the table is locked already we may do a
@ -1247,7 +1248,7 @@ static int stack_compact_range(struct reftable_stack *st,
* run into file descriptor exhaustion when we compress a lot * run into file descriptor exhaustion when we compress a lot
* of tables. * of tables.
*/ */
err = close_lock_file_gently(&table_locks[nlocks++]); err = flock_close(&table_locks[nlocks++]);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
@ -1259,7 +1260,7 @@ static int stack_compact_range(struct reftable_stack *st,
* "tables.list" lock while compacting the locked tables. This allows * "tables.list" lock while compacting the locked tables. This allows
* concurrent updates to the stack to proceed. * concurrent updates to the stack to proceed.
*/ */
err = rollback_lock_file(&tables_list_lock); err = flock_release(&tables_list_lock);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
@ -1282,10 +1283,7 @@ static int stack_compact_range(struct reftable_stack *st,
* "tables.list". We'll then replace the compacted range of tables with * "tables.list". We'll then replace the compacted range of tables with
* the new table. * the new table.
*/ */
err = hold_lock_file_for_update_timeout(&tables_list_lock, err = flock_acquire(&tables_list_lock, st->list_file, st->opts.lock_timeout_ms);
st->list_file,
LOCK_NO_DEREF,
st->opts.lock_timeout_ms);
if (err < 0) { if (err < 0) {
if (errno == EEXIST) if (errno == EEXIST)
err = REFTABLE_LOCK_ERROR; err = REFTABLE_LOCK_ERROR;
@ -1295,7 +1293,7 @@ static int stack_compact_range(struct reftable_stack *st,
} }
if (st->opts.default_permissions) { if (st->opts.default_permissions) {
if (chmod(get_lock_file_path(&tables_list_lock), if (chmod(tables_list_lock.path,
st->opts.default_permissions) < 0) { st->opts.default_permissions) < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
goto done; goto done;
@ -1424,11 +1422,9 @@ static int stack_compact_range(struct reftable_stack *st,
if (err < 0) if (err < 0)
goto done; goto done;
err = rename_tempfile(&new_table, new_table_path.buf); err = tmpfile_rename(&new_table, new_table_path.buf);
if (err < 0) { if (err < 0)
err = REFTABLE_IO_ERROR;
goto done; goto done;
}
} }
/* /*
@ -1452,7 +1448,7 @@ static int stack_compact_range(struct reftable_stack *st,
goto done; goto done;
} }
err = write_in_full(get_lock_file_fd(&tables_list_lock), err = write_in_full(tables_list_lock.fd,
tables_list_buf.buf, tables_list_buf.len); tables_list_buf.buf, tables_list_buf.len);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
@ -1460,14 +1456,14 @@ static int stack_compact_range(struct reftable_stack *st,
goto done; goto done;
} }
err = fsync_component(FSYNC_COMPONENT_REFERENCE, get_lock_file_fd(&tables_list_lock)); err = stack_fsync(&st->opts, tables_list_lock.fd);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
unlink(new_table_path.buf); unlink(new_table_path.buf);
goto done; goto done;
} }
err = commit_lock_file(&tables_list_lock); err = flock_commit(&tables_list_lock);
if (err < 0) { if (err < 0) {
err = REFTABLE_IO_ERROR; err = REFTABLE_IO_ERROR;
unlink(new_table_path.buf); unlink(new_table_path.buf);
@ -1488,19 +1484,24 @@ static int stack_compact_range(struct reftable_stack *st,
* readers, so it is expected that unlinking tables may fail. * readers, so it is expected that unlinking tables may fail.
*/ */
for (i = 0; i < nlocks; i++) { for (i = 0; i < nlocks; i++) {
struct lock_file *table_lock = &table_locks[i]; struct reftable_flock *table_lock = &table_locks[i];
char *table_path = get_locked_file_path(table_lock);
unlink(table_path); reftable_buf_reset(&table_name);
reftable_free(table_path); err = reftable_buf_add(&table_name, table_lock->path,
strlen(table_lock->path) - strlen(".lock"));
if (err)
continue;
unlink(table_name.buf);
} }
done: done:
rollback_lock_file(&tables_list_lock); flock_release(&tables_list_lock);
for (i = 0; table_locks && i < nlocks; i++) for (i = 0; table_locks && i < nlocks; i++)
rollback_lock_file(&table_locks[i]); flock_release(&table_locks[i]);
reftable_free(table_locks); reftable_free(table_locks);
delete_tempfile(&new_table); tmpfile_delete(&new_table);
reftable_buf_release(&new_table_name); reftable_buf_release(&new_table_name);
reftable_buf_release(&new_table_path); reftable_buf_release(&new_table_path);
reftable_buf_release(&tables_list_buf); reftable_buf_release(&tables_list_buf);
@ -1603,7 +1604,7 @@ struct segment suggest_compaction_segment(uint64_t *sizes, size_t n,
static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st) static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
{ {
int version = (st->opts.hash_id == GIT_SHA1_FORMAT_ID) ? 1 : 2; int version = (st->opts.hash_id == REFTABLE_HASH_SHA1) ? 1 : 2;
int overhead = header_size(version) - 1; int overhead = header_size(version) - 1;
uint64_t *sizes; uint64_t *sizes;

126
reftable/system.c Normal file
View File

@ -0,0 +1,126 @@
#include "system.h"
#include "basics.h"
#include "reftable-error.h"
#include "../lockfile.h"
#include "../tempfile.h"
int tmpfile_from_pattern(struct reftable_tmpfile *out, const char *pattern)
{
struct tempfile *tempfile;
tempfile = mks_tempfile(pattern);
if (!tempfile)
return REFTABLE_IO_ERROR;
out->path = tempfile->filename.buf;
out->fd = tempfile->fd;
out->priv = tempfile;
return 0;
}
int tmpfile_close(struct reftable_tmpfile *t)
{
struct tempfile *tempfile = t->priv;
int ret = close_tempfile_gently(tempfile);
t->fd = -1;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}
int tmpfile_delete(struct reftable_tmpfile *t)
{
struct tempfile *tempfile = t->priv;
int ret = delete_tempfile(&tempfile);
*t = REFTABLE_TMPFILE_INIT;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}
int tmpfile_rename(struct reftable_tmpfile *t, const char *path)
{
struct tempfile *tempfile = t->priv;
int ret = rename_tempfile(&tempfile, path);
*t = REFTABLE_TMPFILE_INIT;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}
int flock_acquire(struct reftable_flock *l, const char *target_path,
long timeout_ms)
{
struct lock_file *lockfile;
int err;
lockfile = reftable_malloc(sizeof(*lockfile));
if (!lockfile)
return REFTABLE_OUT_OF_MEMORY_ERROR;
err = hold_lock_file_for_update_timeout(lockfile, target_path, LOCK_NO_DEREF,
timeout_ms);
if (err < 0) {
reftable_free(lockfile);
if (errno == EEXIST)
return REFTABLE_LOCK_ERROR;
return -1;
}
l->fd = get_lock_file_fd(lockfile);
l->path = get_lock_file_path(lockfile);
l->priv = lockfile;
return 0;
}
int flock_close(struct reftable_flock *l)
{
struct lock_file *lockfile = l->priv;
int ret;
if (!lockfile)
return REFTABLE_API_ERROR;
ret = close_lock_file_gently(lockfile);
l->fd = -1;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}
int flock_release(struct reftable_flock *l)
{
struct lock_file *lockfile = l->priv;
int ret;
if (!lockfile)
return 0;
ret = rollback_lock_file(lockfile);
reftable_free(lockfile);
*l = REFTABLE_FLOCK_INIT;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}
int flock_commit(struct reftable_flock *l)
{
struct lock_file *lockfile = l->priv;
int ret;
if (!lockfile)
return REFTABLE_API_ERROR;
ret = commit_lock_file(lockfile);
reftable_free(lockfile);
*l = REFTABLE_FLOCK_INIT;
if (ret < 0)
return REFTABLE_IO_ERROR;
return 0;
}

View File

@ -12,11 +12,90 @@ https://developers.google.com/open-source/licenses/bsd
/* This header glues the reftable library to the rest of Git */ /* This header glues the reftable library to the rest of Git */
#include "git-compat-util.h" #include "git-compat-util.h"
#include "lockfile.h"
#include "tempfile.h"
#include "hash.h" /* hash ID, sizes.*/
#include "dir.h" /* remove_dir_recursively, for tests.*/
int hash_size(uint32_t id); /*
* An implementation-specific temporary file. By making this specific to the
* implementation it becomes possible to tie temporary files into any kind of
* signal or atexit handlers for cleanup on abnormal situations.
*/
struct reftable_tmpfile {
const char *path;
int fd;
void *priv;
};
#define REFTABLE_TMPFILE_INIT ((struct reftable_tmpfile) { .fd = -1, })
/*
* Create a temporary file from a pattern similar to how mkstemp(3p) would.
* The `pattern` shall not be modified. On success, the structure at `out` has
* been initialized such that it is ready for use. Returns 0 on success, a
* reftable error code on error.
*/
int tmpfile_from_pattern(struct reftable_tmpfile *out, const char *pattern);
/*
* Close the temporary file's file descriptor without removing the file itself.
* This is a no-op in case the file has already been closed beforehand. Returns
* 0 on success, a reftable error code on error.
*/
int tmpfile_close(struct reftable_tmpfile *t);
/*
* Close the temporary file and delete it. This is a no-op in case the file has
* already been deleted or renamed beforehand. Returns 0 on success, a reftable
* error code on error.
*/
int tmpfile_delete(struct reftable_tmpfile *t);
/*
* Rename the temporary file to the provided path. The temporary file must be
* active. Return 0 on success, a reftable error code on error. Deactivates the
* temporary file.
*/
int tmpfile_rename(struct reftable_tmpfile *t, const char *path);
/*
* An implementation-specific file lock. Same as with `reftable_tmpfile`,
* making this specific to the implementation makes it possible to tie this
* into signal or atexit handlers such that we know to clean up stale locks on
* abnormal exits.
*/
struct reftable_flock {
const char *path;
int fd;
void *priv;
};
#define REFTABLE_FLOCK_INIT ((struct reftable_flock){ .fd = -1, })
/*
* Acquire the lock for the given target path by exclusively creating a file
* with ".lock" appended to it. If that lock exists, we wait up to `timeout_ms`
* to acquire the lock. If `timeout_ms` is 0 we don't wait, if it is negative
* we block indefinitely.
*
* Retrun 0 on success, a reftable error code on error.
*/
int flock_acquire(struct reftable_flock *l, const char *target_path,
long timeout_ms);
/*
* Close the lockfile's file descriptor without removing the lock itself. This
* is a no-op in case the lockfile has already been closed beforehand. Returns
* 0 on success, a reftable error code on error.
*/
int flock_close(struct reftable_flock *l);
/*
* Release the lock by unlinking the lockfile. This is a no-op in case the
* lockfile has already been released or committed beforehand. Returns 0 on
* success, a reftable error code on error.
*/
int flock_release(struct reftable_flock *l);
/*
* Commit the lock by renaming the lockfile into place. Returns 0 on success, a
* reftable error code on error.
*/
int flock_commit(struct reftable_flock *l);
#endif #endif

View File

@ -79,7 +79,7 @@ static void options_set_defaults(struct reftable_write_options *opts)
} }
if (opts->hash_id == 0) { if (opts->hash_id == 0) {
opts->hash_id = GIT_SHA1_FORMAT_ID; opts->hash_id = REFTABLE_HASH_SHA1;
} }
if (opts->block_size == 0) { if (opts->block_size == 0) {
opts->block_size = DEFAULT_BLOCK_SIZE; opts->block_size = DEFAULT_BLOCK_SIZE;
@ -88,7 +88,7 @@ static void options_set_defaults(struct reftable_write_options *opts)
static int writer_version(struct reftable_writer *w) static int writer_version(struct reftable_writer *w)
{ {
return (w->opts.hash_id == 0 || w->opts.hash_id == GIT_SHA1_FORMAT_ID) ? return (w->opts.hash_id == 0 || w->opts.hash_id == REFTABLE_HASH_SHA1) ?
1 : 1 :
2; 2;
} }
@ -103,8 +103,22 @@ static int writer_write_header(struct reftable_writer *w, uint8_t *dest)
put_be64(dest + 8, w->min_update_index); put_be64(dest + 8, w->min_update_index);
put_be64(dest + 16, w->max_update_index); put_be64(dest + 16, w->max_update_index);
if (writer_version(w) == 2) { if (writer_version(w) == 2) {
put_be32(dest + 24, w->opts.hash_id); uint32_t hash_id;
switch (w->opts.hash_id) {
case REFTABLE_HASH_SHA1:
hash_id = REFTABLE_FORMAT_ID_SHA1;
break;
case REFTABLE_HASH_SHA256:
hash_id = REFTABLE_FORMAT_ID_SHA256;
break;
default:
return -1;
}
put_be32(dest + 24, hash_id);
} }
return header_size(writer_version(w)); return header_size(writer_version(w));
} }

View File

@ -156,7 +156,7 @@ int cmd__dump_reftable(int argc, const char **argv)
int opt_dump_blocks = 0; int opt_dump_blocks = 0;
int opt_dump_table = 0; int opt_dump_table = 0;
int opt_dump_stack = 0; int opt_dump_stack = 0;
uint32_t opt_hash_id = GIT_SHA1_FORMAT_ID; uint32_t opt_hash_id = REFTABLE_HASH_SHA1;
const char *arg = NULL, *argv0 = argv[0]; const char *arg = NULL, *argv0 = argv[0];
for (; argc > 1; argv++, argc--) for (; argc > 1; argv++, argc--)
@ -167,7 +167,7 @@ int cmd__dump_reftable(int argc, const char **argv)
else if (!strcmp("-t", argv[1])) else if (!strcmp("-t", argv[1]))
opt_dump_table = 1; opt_dump_table = 1;
else if (!strcmp("-6", argv[1])) else if (!strcmp("-6", argv[1]))
opt_hash_id = GIT_SHA256_FORMAT_ID; opt_hash_id = REFTABLE_HASH_SHA256;
else if (!strcmp("-s", argv[1])) else if (!strcmp("-s", argv[1]))
opt_dump_stack = 1; opt_dump_stack = 1;
else if (!strcmp("-?", argv[1]) || !strcmp("-h", argv[1])) { else if (!strcmp("-?", argv[1]) || !strcmp("-h", argv[1])) {

View File

@ -2,8 +2,9 @@
#include "test-lib.h" #include "test-lib.h"
#include "reftable/constants.h" #include "reftable/constants.h"
#include "reftable/writer.h" #include "reftable/writer.h"
#include "strbuf.h"
void t_reftable_set_hash(uint8_t *p, int i, uint32_t id) void t_reftable_set_hash(uint8_t *p, int i, enum reftable_hash id)
{ {
memset(p, (uint8_t)i, hash_size(id)); memset(p, (uint8_t)i, hash_size(id));
} }
@ -82,7 +83,7 @@ void t_reftable_write_to_buf(struct reftable_buf *buf,
size_t off = i * (opts.block_size ? opts.block_size size_t off = i * (opts.block_size ? opts.block_size
: DEFAULT_BLOCK_SIZE); : DEFAULT_BLOCK_SIZE);
if (!off) if (!off)
off = header_size(opts.hash_id == GIT_SHA256_FORMAT_ID ? 2 : 1); off = header_size(opts.hash_id == REFTABLE_HASH_SHA256 ? 2 : 1);
check_char(buf->buf[off], ==, 'r'); check_char(buf->buf[off], ==, 'r');
} }

View File

@ -6,7 +6,7 @@
struct reftable_buf; struct reftable_buf;
void t_reftable_set_hash(uint8_t *p, int i, uint32_t id); void t_reftable_set_hash(uint8_t *p, int i, enum reftable_hash id);
struct reftable_writer *t_reftable_strbuf_writer(struct reftable_buf *buf, struct reftable_writer *t_reftable_strbuf_writer(struct reftable_buf *buf,
struct reftable_write_options *opts); struct reftable_write_options *opts);

View File

@ -11,6 +11,7 @@ https://developers.google.com/open-source/licenses/bsd
#include "reftable/blocksource.h" #include "reftable/blocksource.h"
#include "reftable/constants.h" #include "reftable/constants.h"
#include "reftable/reftable-error.h" #include "reftable/reftable-error.h"
#include "strbuf.h"
static void t_ref_block_read_write(void) static void t_ref_block_read_write(void)
{ {
@ -36,7 +37,7 @@ static void t_ref_block_read_write(void)
block.len = block_size; block.len = block_size;
block_source_from_buf(&block.source ,&buf); block_source_from_buf(&block.source ,&buf);
ret = block_writer_init(&bw, BLOCK_TYPE_REF, block.data, block_size, ret = block_writer_init(&bw, BLOCK_TYPE_REF, block.data, block_size,
header_off, hash_size(GIT_SHA1_FORMAT_ID)); header_off, hash_size(REFTABLE_HASH_SHA1));
check(!ret); check(!ret);
rec.u.ref.refname = (char *) ""; rec.u.ref.refname = (char *) "";
@ -47,7 +48,7 @@ static void t_ref_block_read_write(void)
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
rec.u.ref.refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i); rec.u.ref.refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i);
rec.u.ref.value_type = REFTABLE_REF_VAL1; rec.u.ref.value_type = REFTABLE_REF_VAL1;
memset(rec.u.ref.value.val1, i, GIT_SHA1_RAWSZ); memset(rec.u.ref.value.val1, i, REFTABLE_HASH_SIZE_SHA1);
recs[i] = rec; recs[i] = rec;
ret = block_writer_add(&bw, &rec); ret = block_writer_add(&bw, &rec);
@ -61,7 +62,7 @@ static void t_ref_block_read_write(void)
block_writer_release(&bw); block_writer_release(&bw);
block_reader_init(&br, &block, header_off, block_size, GIT_SHA1_RAWSZ); block_reader_init(&br, &block, header_off, block_size, REFTABLE_HASH_SIZE_SHA1);
block_iter_seek_start(&it, &br); block_iter_seek_start(&it, &br);
@ -72,7 +73,7 @@ static void t_ref_block_read_write(void)
check_int(i, ==, N); check_int(i, ==, N);
break; break;
} }
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -85,7 +86,7 @@ static void t_ref_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
want.len--; want.len--;
ret = block_iter_seek_key(&it, &br, &want); ret = block_iter_seek_key(&it, &br, &want);
@ -93,7 +94,7 @@ static void t_ref_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[10 * (i / 10)], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[10 * (i / 10)], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
block_reader_release(&br); block_reader_release(&br);
@ -130,7 +131,7 @@ static void t_log_block_read_write(void)
block.len = block_size; block.len = block_size;
block_source_from_buf(&block.source ,&buf); block_source_from_buf(&block.source ,&buf);
ret = block_writer_init(&bw, BLOCK_TYPE_LOG, block.data, block_size, ret = block_writer_init(&bw, BLOCK_TYPE_LOG, block.data, block_size,
header_off, hash_size(GIT_SHA1_FORMAT_ID)); header_off, hash_size(REFTABLE_HASH_SHA1));
check(!ret); check(!ret);
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -150,7 +151,7 @@ static void t_log_block_read_write(void)
block_writer_release(&bw); block_writer_release(&bw);
block_reader_init(&br, &block, header_off, block_size, GIT_SHA1_RAWSZ); block_reader_init(&br, &block, header_off, block_size, REFTABLE_HASH_SIZE_SHA1);
block_iter_seek_start(&it, &br); block_iter_seek_start(&it, &br);
@ -161,7 +162,7 @@ static void t_log_block_read_write(void)
check_int(i, ==, N); check_int(i, ==, N);
break; break;
} }
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -175,7 +176,7 @@ static void t_log_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
want.len--; want.len--;
ret = block_iter_seek_key(&it, &br, &want); ret = block_iter_seek_key(&it, &br, &want);
@ -183,7 +184,7 @@ static void t_log_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[10 * (i / 10)], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[10 * (i / 10)], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
block_reader_release(&br); block_reader_release(&br);
@ -220,7 +221,7 @@ static void t_obj_block_read_write(void)
block.len = block_size; block.len = block_size;
block_source_from_buf(&block.source, &buf); block_source_from_buf(&block.source, &buf);
ret = block_writer_init(&bw, BLOCK_TYPE_OBJ, block.data, block_size, ret = block_writer_init(&bw, BLOCK_TYPE_OBJ, block.data, block_size,
header_off, hash_size(GIT_SHA1_FORMAT_ID)); header_off, hash_size(REFTABLE_HASH_SHA1));
check(!ret); check(!ret);
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -242,7 +243,7 @@ static void t_obj_block_read_write(void)
block_writer_release(&bw); block_writer_release(&bw);
block_reader_init(&br, &block, header_off, block_size, GIT_SHA1_RAWSZ); block_reader_init(&br, &block, header_off, block_size, REFTABLE_HASH_SIZE_SHA1);
block_iter_seek_start(&it, &br); block_iter_seek_start(&it, &br);
@ -253,7 +254,7 @@ static void t_obj_block_read_write(void)
check_int(i, ==, N); check_int(i, ==, N);
break; break;
} }
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -266,7 +267,7 @@ static void t_obj_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
block_reader_release(&br); block_reader_release(&br);
@ -304,7 +305,7 @@ static void t_index_block_read_write(void)
block.len = block_size; block.len = block_size;
block_source_from_buf(&block.source, &buf); block_source_from_buf(&block.source, &buf);
ret = block_writer_init(&bw, BLOCK_TYPE_INDEX, block.data, block_size, ret = block_writer_init(&bw, BLOCK_TYPE_INDEX, block.data, block_size,
header_off, hash_size(GIT_SHA1_FORMAT_ID)); header_off, hash_size(REFTABLE_HASH_SHA1));
check(!ret); check(!ret);
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -326,7 +327,7 @@ static void t_index_block_read_write(void)
block_writer_release(&bw); block_writer_release(&bw);
block_reader_init(&br, &block, header_off, block_size, GIT_SHA1_RAWSZ); block_reader_init(&br, &block, header_off, block_size, REFTABLE_HASH_SIZE_SHA1);
block_iter_seek_start(&it, &br); block_iter_seek_start(&it, &br);
@ -337,7 +338,7 @@ static void t_index_block_read_write(void)
check_int(i, ==, N); check_int(i, ==, N);
break; break;
} }
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -350,7 +351,7 @@ static void t_index_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[i], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[i], &rec, REFTABLE_HASH_SIZE_SHA1));
want.len--; want.len--;
ret = block_iter_seek_key(&it, &br, &want); ret = block_iter_seek_key(&it, &br, &want);
@ -358,7 +359,7 @@ static void t_index_block_read_write(void)
ret = block_iter_next(&it, &rec); ret = block_iter_next(&it, &rec);
check_int(ret, ==, 0); check_int(ret, ==, 0);
check(reftable_record_equal(&recs[10 * (i / 10)], &rec, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&recs[10 * (i / 10)], &rec, REFTABLE_HASH_SIZE_SHA1));
} }
block_reader_release(&br); block_reader_release(&br);

View File

@ -42,7 +42,7 @@ merged_table_from_records(struct reftable_ref_record **refs,
check(!err); check(!err);
} }
err = reftable_merged_table_new(&mt, *readers, n, GIT_SHA1_FORMAT_ID); err = reftable_merged_table_new(&mt, *readers, n, REFTABLE_HASH_SHA1);
check(!err); check(!err);
return mt; return mt;
} }
@ -91,7 +91,7 @@ static void t_merged_single_record(void)
err = reftable_iterator_next_ref(&it, &ref); err = reftable_iterator_next_ref(&it, &ref);
check(!err); check(!err);
check(reftable_ref_record_equal(&r2[0], &ref, GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&r2[0], &ref, REFTABLE_HASH_SIZE_SHA1));
reftable_ref_record_release(&ref); reftable_ref_record_release(&ref);
reftable_iterator_destroy(&it); reftable_iterator_destroy(&it);
readers_destroy(readers, 3); readers_destroy(readers, 3);
@ -168,7 +168,7 @@ static void t_merged_refs(void)
check(!err); check(!err);
err = reftable_iterator_seek_ref(&it, "a"); err = reftable_iterator_seek_ref(&it, "a");
check(!err); check(!err);
check_int(reftable_merged_table_hash_id(mt), ==, GIT_SHA1_FORMAT_ID); check_int(reftable_merged_table_hash_id(mt), ==, REFTABLE_HASH_SHA1);
check_int(reftable_merged_table_min_update_index(mt), ==, 1); check_int(reftable_merged_table_min_update_index(mt), ==, 1);
check_int(reftable_merged_table_max_update_index(mt), ==, 3); check_int(reftable_merged_table_max_update_index(mt), ==, 3);
@ -186,7 +186,7 @@ static void t_merged_refs(void)
check_int(ARRAY_SIZE(want), ==, len); check_int(ARRAY_SIZE(want), ==, len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
check(reftable_ref_record_equal(want[i], &out[i], check(reftable_ref_record_equal(want[i], &out[i],
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
reftable_ref_record_release(&out[i]); reftable_ref_record_release(&out[i]);
reftable_free(out); reftable_free(out);
@ -252,12 +252,12 @@ static void t_merged_seek_multiple_times(void)
err = reftable_iterator_next_ref(&it, &rec); err = reftable_iterator_next_ref(&it, &rec);
check(!err); check(!err);
err = reftable_ref_record_equal(&rec, &r1[1], GIT_SHA1_RAWSZ); err = reftable_ref_record_equal(&rec, &r1[1], REFTABLE_HASH_SIZE_SHA1);
check(err == 1); check(err == 1);
err = reftable_iterator_next_ref(&it, &rec); err = reftable_iterator_next_ref(&it, &rec);
check(!err); check(!err);
err = reftable_ref_record_equal(&rec, &r2[1], GIT_SHA1_RAWSZ); err = reftable_ref_record_equal(&rec, &r2[1], REFTABLE_HASH_SIZE_SHA1);
check(err == 1); check(err == 1);
err = reftable_iterator_next_ref(&it, &rec); err = reftable_iterator_next_ref(&it, &rec);
@ -300,7 +300,7 @@ merged_table_from_log_records(struct reftable_log_record **logs,
check(!err); check(!err);
} }
err = reftable_merged_table_new(&mt, *readers, n, GIT_SHA1_FORMAT_ID); err = reftable_merged_table_new(&mt, *readers, n, REFTABLE_HASH_SHA1);
check(!err); check(!err);
return mt; return mt;
} }
@ -377,7 +377,7 @@ static void t_merged_logs(void)
check(!err); check(!err);
err = reftable_iterator_seek_log(&it, "a"); err = reftable_iterator_seek_log(&it, "a");
check(!err); check(!err);
check_int(reftable_merged_table_hash_id(mt), ==, GIT_SHA1_FORMAT_ID); check_int(reftable_merged_table_hash_id(mt), ==, REFTABLE_HASH_SHA1);
check_int(reftable_merged_table_min_update_index(mt), ==, 1); check_int(reftable_merged_table_min_update_index(mt), ==, 1);
check_int(reftable_merged_table_max_update_index(mt), ==, 3); check_int(reftable_merged_table_max_update_index(mt), ==, 3);
@ -395,7 +395,7 @@ static void t_merged_logs(void)
check_int(ARRAY_SIZE(want), ==, len); check_int(ARRAY_SIZE(want), ==, len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
check(reftable_log_record_equal(want[i], &out[i], check(reftable_log_record_equal(want[i], &out[i],
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
err = merged_table_init_iter(mt, &it, BLOCK_TYPE_LOG); err = merged_table_init_iter(mt, &it, BLOCK_TYPE_LOG);
check(!err); check(!err);
@ -404,7 +404,7 @@ static void t_merged_logs(void)
reftable_log_record_release(&out[0]); reftable_log_record_release(&out[0]);
err = reftable_iterator_next_log(&it, &out[0]); err = reftable_iterator_next_log(&it, &out[0]);
check(!err); check(!err);
check(reftable_log_record_equal(&out[0], &r3[0], GIT_SHA1_RAWSZ)); check(reftable_log_record_equal(&out[0], &r3[0], REFTABLE_HASH_SIZE_SHA1));
reftable_iterator_destroy(&it); reftable_iterator_destroy(&it);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
@ -448,11 +448,11 @@ static void t_default_write_opts(void)
check(!err); check(!err);
hash_id = reftable_reader_hash_id(rd); hash_id = reftable_reader_hash_id(rd);
check_int(hash_id, ==, GIT_SHA1_FORMAT_ID); check_int(hash_id, ==, REFTABLE_HASH_SHA1);
err = reftable_merged_table_new(&merged, &rd, 1, GIT_SHA256_FORMAT_ID); err = reftable_merged_table_new(&merged, &rd, 1, REFTABLE_HASH_SHA256);
check_int(err, ==, REFTABLE_FORMAT_ERROR); check_int(err, ==, REFTABLE_FORMAT_ERROR);
err = reftable_merged_table_new(&merged, &rd, 1, GIT_SHA1_FORMAT_ID); err = reftable_merged_table_new(&merged, &rd, 1, REFTABLE_HASH_SHA1);
check(!err); check(!err);
reftable_reader_decref(rd); reftable_reader_decref(rd);

View File

@ -9,6 +9,7 @@ https://developers.google.com/open-source/licenses/bsd
#include "test-lib.h" #include "test-lib.h"
#include "reftable/constants.h" #include "reftable/constants.h"
#include "reftable/pq.h" #include "reftable/pq.h"
#include "strbuf.h"
static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq) static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq)
{ {
@ -132,7 +133,7 @@ static void t_merged_iter_pqueue_top(void)
merged_iter_pqueue_check(&pq); merged_iter_pqueue_check(&pq);
check(pq_entry_equal(&top, &e)); check(pq_entry_equal(&top, &e));
check(reftable_record_equal(top.rec, &recs[i], GIT_SHA1_RAWSZ)); check(reftable_record_equal(top.rec, &recs[i], REFTABLE_HASH_SIZE_SHA1));
for (size_t j = 0; i < pq.len; j++) { for (size_t j = 0; i < pq.len; j++) {
check(pq_less(&top, &pq.heap[j])); check(pq_less(&top, &pq.heap[j]));
check_int(top.index, >, j); check_int(top.index, >, j);

View File

@ -31,7 +31,7 @@ static int t_reader_seek_once(void)
ret = reftable_iterator_next_ref(&it, &ref); ret = reftable_iterator_next_ref(&it, &ref);
check(!ret); check(!ret);
ret = reftable_ref_record_equal(&ref, &records[0], GIT_SHA1_RAWSZ); ret = reftable_ref_record_equal(&ref, &records[0], REFTABLE_HASH_SIZE_SHA1);
check_int(ret, ==, 1); check_int(ret, ==, 1);
ret = reftable_iterator_next_ref(&it, &ref); ret = reftable_iterator_next_ref(&it, &ref);
@ -74,7 +74,7 @@ static int t_reader_reseek(void)
ret = reftable_iterator_next_ref(&it, &ref); ret = reftable_iterator_next_ref(&it, &ref);
check(!ret); check(!ret);
ret = reftable_ref_record_equal(&ref, &records[0], GIT_SHA1_RAWSZ); ret = reftable_ref_record_equal(&ref, &records[0], REFTABLE_HASH_SIZE_SHA1);
check_int(ret, ==, 1); check_int(ret, ==, 1);
ret = reftable_iterator_next_ref(&it, &ref); ret = reftable_iterator_next_ref(&it, &ref);

View File

@ -13,6 +13,7 @@ https://developers.google.com/open-source/licenses/bsd
#include "reftable/reader.h" #include "reftable/reader.h"
#include "reftable/reftable-error.h" #include "reftable/reftable-error.h"
#include "reftable/reftable-writer.h" #include "reftable/reftable-writer.h"
#include "strbuf.h"
static const int update_index = 5; static const int update_index = 5;
@ -41,7 +42,7 @@ static void t_buffer(void)
} }
static void write_table(char ***names, struct reftable_buf *buf, int N, static void write_table(char ***names, struct reftable_buf *buf, int N,
int block_size, uint32_t hash_id) int block_size, enum reftable_hash hash_id)
{ {
struct reftable_write_options opts = { struct reftable_write_options opts = {
.block_size = block_size, .block_size = block_size,
@ -62,7 +63,7 @@ static void write_table(char ***names, struct reftable_buf *buf, int N,
refs[i].refname = (*names)[i] = xstrfmt("refs/heads/branch%02d", i); refs[i].refname = (*names)[i] = xstrfmt("refs/heads/branch%02d", i);
refs[i].update_index = update_index; refs[i].update_index = update_index;
refs[i].value_type = REFTABLE_REF_VAL1; refs[i].value_type = REFTABLE_REF_VAL1;
t_reftable_set_hash(refs[i].value.val1, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(refs[i].value.val1, i, REFTABLE_HASH_SHA1);
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -70,7 +71,7 @@ static void write_table(char ***names, struct reftable_buf *buf, int N,
logs[i].update_index = update_index; logs[i].update_index = update_index;
logs[i].value_type = REFTABLE_LOG_UPDATE; logs[i].value_type = REFTABLE_LOG_UPDATE;
t_reftable_set_hash(logs[i].value.update.new_hash, i, t_reftable_set_hash(logs[i].value.update.new_hash, i,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
logs[i].value.update.message = (char *) "message"; logs[i].value.update.message = (char *) "message";
} }
@ -104,7 +105,7 @@ static void t_log_buffer_size(void)
/* This tests buffer extension for log compression. Must use a random /* This tests buffer extension for log compression. Must use a random
hash, to ensure that the compressed part is larger than the original. hash, to ensure that the compressed part is larger than the original.
*/ */
for (i = 0; i < GIT_SHA1_RAWSZ; i++) { for (i = 0; i < REFTABLE_HASH_SIZE_SHA1; i++) {
log.value.update.old_hash[i] = (uint8_t)(git_rand() % 256); log.value.update.old_hash[i] = (uint8_t)(git_rand() % 256);
log.value.update.new_hash[i] = (uint8_t)(git_rand() % 256); log.value.update.new_hash[i] = (uint8_t)(git_rand() % 256);
} }
@ -191,9 +192,9 @@ static void t_log_write_read(void)
log.update_index = i; log.update_index = i;
log.value_type = REFTABLE_LOG_UPDATE; log.value_type = REFTABLE_LOG_UPDATE;
t_reftable_set_hash(log.value.update.old_hash, i, t_reftable_set_hash(log.value.update.old_hash, i,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
t_reftable_set_hash(log.value.update.new_hash, i + 1, t_reftable_set_hash(log.value.update.new_hash, i + 1,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
err = reftable_writer_add_log(w, &log); err = reftable_writer_add_log(w, &log);
check(!err); check(!err);
@ -326,7 +327,7 @@ static void t_table_read_write_sequential(void)
int err = 0; int err = 0;
int j = 0; int j = 0;
write_table(&names, &buf, N, 256, GIT_SHA1_FORMAT_ID); write_table(&names, &buf, N, 256, REFTABLE_HASH_SHA1);
block_source_from_buf(&source, &buf); block_source_from_buf(&source, &buf);
@ -361,7 +362,7 @@ static void t_table_write_small_table(void)
char **names; char **names;
struct reftable_buf buf = REFTABLE_BUF_INIT; struct reftable_buf buf = REFTABLE_BUF_INIT;
int N = 1; int N = 1;
write_table(&names, &buf, N, 4096, GIT_SHA1_FORMAT_ID); write_table(&names, &buf, N, 4096, REFTABLE_HASH_SHA1);
check_int(buf.len, <, 200); check_int(buf.len, <, 200);
reftable_buf_release(&buf); reftable_buf_release(&buf);
free_names(names); free_names(names);
@ -378,7 +379,7 @@ static void t_table_read_api(void)
struct reftable_log_record log = { 0 }; struct reftable_log_record log = { 0 };
struct reftable_iterator it = { 0 }; struct reftable_iterator it = { 0 };
write_table(&names, &buf, N, 256, GIT_SHA1_FORMAT_ID); write_table(&names, &buf, N, 256, REFTABLE_HASH_SHA1);
block_source_from_buf(&source, &buf); block_source_from_buf(&source, &buf);
@ -400,7 +401,7 @@ static void t_table_read_api(void)
reftable_buf_release(&buf); reftable_buf_release(&buf);
} }
static void t_table_read_write_seek(int index, int hash_id) static void t_table_read_write_seek(int index, enum reftable_hash hash_id)
{ {
char **names; char **names;
struct reftable_buf buf = REFTABLE_BUF_INIT; struct reftable_buf buf = REFTABLE_BUF_INIT;
@ -467,24 +468,24 @@ static void t_table_read_write_seek(int index, int hash_id)
static void t_table_read_write_seek_linear(void) static void t_table_read_write_seek_linear(void)
{ {
t_table_read_write_seek(0, GIT_SHA1_FORMAT_ID); t_table_read_write_seek(0, REFTABLE_HASH_SHA1);
} }
static void t_table_read_write_seek_linear_sha256(void) static void t_table_read_write_seek_linear_sha256(void)
{ {
t_table_read_write_seek(0, GIT_SHA256_FORMAT_ID); t_table_read_write_seek(0, REFTABLE_HASH_SHA256);
} }
static void t_table_read_write_seek_index(void) static void t_table_read_write_seek_index(void)
{ {
t_table_read_write_seek(1, GIT_SHA1_FORMAT_ID); t_table_read_write_seek(1, REFTABLE_HASH_SHA1);
} }
static void t_table_refs_for(int indexed) static void t_table_refs_for(int indexed)
{ {
char **want_names; char **want_names;
int want_names_len = 0; int want_names_len = 0;
uint8_t want_hash[GIT_SHA1_RAWSZ]; uint8_t want_hash[REFTABLE_HASH_SIZE_SHA1];
struct reftable_write_options opts = { struct reftable_write_options opts = {
.block_size = 256, .block_size = 256,
@ -500,10 +501,10 @@ static void t_table_refs_for(int indexed)
want_names = reftable_calloc(N + 1, sizeof(*want_names)); want_names = reftable_calloc(N + 1, sizeof(*want_names));
check(want_names != NULL); check(want_names != NULL);
t_reftable_set_hash(want_hash, 4, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(want_hash, 4, REFTABLE_HASH_SHA1);
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
uint8_t hash[GIT_SHA1_RAWSZ]; uint8_t hash[REFTABLE_HASH_SIZE_SHA1];
char fill[51] = { 0 }; char fill[51] = { 0 };
char name[100]; char name[100];
struct reftable_ref_record ref = { 0 }; struct reftable_ref_record ref = { 0 };
@ -517,9 +518,9 @@ static void t_table_refs_for(int indexed)
ref.value_type = REFTABLE_REF_VAL2; ref.value_type = REFTABLE_REF_VAL2;
t_reftable_set_hash(ref.value.val2.value, i / 4, t_reftable_set_hash(ref.value.val2.value, i / 4,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
t_reftable_set_hash(ref.value.val2.target_value, 3 + i / 4, t_reftable_set_hash(ref.value.val2.target_value, 3 + i / 4,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
/* 80 bytes / entry, so 3 entries per block. Yields 17 /* 80 bytes / entry, so 3 entries per block. Yields 17
*/ */
@ -527,8 +528,8 @@ static void t_table_refs_for(int indexed)
n = reftable_writer_add_ref(w, &ref); n = reftable_writer_add_ref(w, &ref);
check_int(n, ==, 0); check_int(n, ==, 0);
if (!memcmp(ref.value.val2.value, want_hash, GIT_SHA1_RAWSZ) || if (!memcmp(ref.value.val2.value, want_hash, REFTABLE_HASH_SIZE_SHA1) ||
!memcmp(ref.value.val2.target_value, want_hash, GIT_SHA1_RAWSZ)) !memcmp(ref.value.val2.target_value, want_hash, REFTABLE_HASH_SIZE_SHA1))
want_names[want_names_len++] = xstrdup(name); want_names[want_names_len++] = xstrdup(name);
} }

View File

@ -7,6 +7,7 @@
*/ */
#include "test-lib.h" #include "test-lib.h"
#include "reftable/basics.h"
#include "reftable/constants.h" #include "reftable/constants.h"
#include "reftable/record.h" #include "reftable/record.h"
@ -17,10 +18,10 @@ static void t_copy(struct reftable_record *rec)
typ = reftable_record_type(rec); typ = reftable_record_type(rec);
reftable_record_init(&copy, typ); reftable_record_init(&copy, typ);
reftable_record_copy_from(&copy, rec, GIT_SHA1_RAWSZ); reftable_record_copy_from(&copy, rec, REFTABLE_HASH_SIZE_SHA1);
/* do it twice to catch memory leaks */ /* do it twice to catch memory leaks */
reftable_record_copy_from(&copy, rec, GIT_SHA1_RAWSZ); reftable_record_copy_from(&copy, rec, REFTABLE_HASH_SIZE_SHA1);
check(reftable_record_equal(rec, &copy, GIT_SHA1_RAWSZ)); check(reftable_record_equal(rec, &copy, REFTABLE_HASH_SIZE_SHA1));
reftable_record_release(&copy); reftable_record_release(&copy);
} }
@ -59,7 +60,7 @@ static void t_varint_roundtrip(void)
static void set_hash(uint8_t *h, int j) static void set_hash(uint8_t *h, int j)
{ {
for (int i = 0; i < hash_size(GIT_SHA1_FORMAT_ID); i++) for (int i = 0; i < hash_size(REFTABLE_HASH_SHA1); i++)
h[i] = (j >> i) & 0xff; h[i] = (j >> i) & 0xff;
} }
@ -84,14 +85,14 @@ static void t_reftable_ref_record_comparison(void)
}, },
}; };
check(!reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
check(!reftable_record_equal(&in[1], &in[2], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
in[1].u.ref.value_type = in[0].u.ref.value_type; in[1].u.ref.value_type = in[0].u.ref.value_type;
check(reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
} }
@ -155,15 +156,15 @@ static void t_reftable_ref_record_roundtrip(void)
check_int(reftable_record_is_deletion(&in), ==, i == REFTABLE_REF_DELETION); check_int(reftable_record_is_deletion(&in), ==, i == REFTABLE_REF_DELETION);
reftable_record_key(&in, &key); reftable_record_key(&in, &key);
n = reftable_record_encode(&in, dest, GIT_SHA1_RAWSZ); n = reftable_record_encode(&in, dest, REFTABLE_HASH_SIZE_SHA1);
check_int(n, >, 0); check_int(n, >, 0);
/* decode into a non-zero reftable_record to test for leaks. */ /* decode into a non-zero reftable_record to test for leaks. */
m = reftable_record_decode(&out, key, i, dest, GIT_SHA1_RAWSZ, &scratch); m = reftable_record_decode(&out, key, i, dest, REFTABLE_HASH_SIZE_SHA1, &scratch);
check_int(n, ==, m); check_int(n, ==, m);
check(reftable_ref_record_equal(&in.u.ref, &out.u.ref, check(reftable_ref_record_equal(&in.u.ref, &out.u.ref,
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
reftable_record_release(&in); reftable_record_release(&in);
reftable_buf_release(&key); reftable_buf_release(&key);
@ -193,15 +194,15 @@ static void t_reftable_log_record_comparison(void)
}, },
}; };
check(!reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_equal(&in[1], &in[2], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
/* comparison should be reversed for equal keys, because /* comparison should be reversed for equal keys, because
* comparison is now performed on the basis of update indices */ * comparison is now performed on the basis of update indices */
check_int(reftable_record_cmp(&in[0], &in[1]), <, 0); check_int(reftable_record_cmp(&in[0], &in[1]), <, 0);
in[1].u.log.update_index = in[0].u.log.update_index; in[1].u.log.update_index = in[0].u.log.update_index;
check(reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
} }
@ -303,15 +304,15 @@ static void t_reftable_log_record_roundtrip(void)
reftable_record_key(&rec, &key); reftable_record_key(&rec, &key);
n = reftable_record_encode(&rec, dest, GIT_SHA1_RAWSZ); n = reftable_record_encode(&rec, dest, REFTABLE_HASH_SIZE_SHA1);
check_int(n, >=, 0); check_int(n, >=, 0);
valtype = reftable_record_val_type(&rec); valtype = reftable_record_val_type(&rec);
m = reftable_record_decode(&out, key, valtype, dest, m = reftable_record_decode(&out, key, valtype, dest,
GIT_SHA1_RAWSZ, &scratch); REFTABLE_HASH_SIZE_SHA1, &scratch);
check_int(n, ==, m); check_int(n, ==, m);
check(reftable_log_record_equal(&in[i], &out.u.log, check(reftable_log_record_equal(&in[i], &out.u.log,
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
reftable_log_record_release(&in[i]); reftable_log_record_release(&in[i]);
reftable_buf_release(&key); reftable_buf_release(&key);
reftable_record_release(&out); reftable_record_release(&out);
@ -380,20 +381,20 @@ static void t_reftable_obj_record_comparison(void)
}, },
}; };
check(!reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
check(!reftable_record_equal(&in[1], &in[2], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
in[1].u.obj.offset_len = in[0].u.obj.offset_len; in[1].u.obj.offset_len = in[0].u.obj.offset_len;
check(reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
} }
static void t_reftable_obj_record_roundtrip(void) static void t_reftable_obj_record_roundtrip(void)
{ {
uint8_t testHash1[GIT_SHA1_RAWSZ] = { 1, 2, 3, 4, 0 }; uint8_t testHash1[REFTABLE_HASH_SIZE_SHA1] = { 1, 2, 3, 4, 0 };
uint64_t till9[] = { 1, 2, 3, 4, 500, 600, 700, 800, 9000 }; uint64_t till9[] = { 1, 2, 3, 4, 500, 600, 700, 800, 9000 };
struct reftable_obj_record recs[3] = { struct reftable_obj_record recs[3] = {
{ {
@ -435,14 +436,14 @@ static void t_reftable_obj_record_roundtrip(void)
check(!reftable_record_is_deletion(&in)); check(!reftable_record_is_deletion(&in));
t_copy(&in); t_copy(&in);
reftable_record_key(&in, &key); reftable_record_key(&in, &key);
n = reftable_record_encode(&in, dest, GIT_SHA1_RAWSZ); n = reftable_record_encode(&in, dest, REFTABLE_HASH_SIZE_SHA1);
check_int(n, >, 0); check_int(n, >, 0);
extra = reftable_record_val_type(&in); extra = reftable_record_val_type(&in);
m = reftable_record_decode(&out, key, extra, dest, m = reftable_record_decode(&out, key, extra, dest,
GIT_SHA1_RAWSZ, &scratch); REFTABLE_HASH_SIZE_SHA1, &scratch);
check_int(n, ==, m); check_int(n, ==, m);
check(reftable_record_equal(&in, &out, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in, &out, REFTABLE_HASH_SIZE_SHA1));
reftable_buf_release(&key); reftable_buf_release(&key);
reftable_record_release(&out); reftable_record_release(&out);
} }
@ -473,14 +474,14 @@ static void t_reftable_index_record_comparison(void)
check(!reftable_buf_addstr(&in[1].u.idx.last_key, "refs/heads/master")); check(!reftable_buf_addstr(&in[1].u.idx.last_key, "refs/heads/master"));
check(!reftable_buf_addstr(&in[2].u.idx.last_key, "refs/heads/branch")); check(!reftable_buf_addstr(&in[2].u.idx.last_key, "refs/heads/branch"));
check(!reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
check(!reftable_record_equal(&in[1], &in[2], GIT_SHA1_RAWSZ)); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
in[1].u.idx.offset = in[0].u.idx.offset; in[1].u.idx.offset = in[0].u.idx.offset;
check(reftable_record_equal(&in[0], &in[1], GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
check(!reftable_record_cmp(&in[0], &in[1])); check(!reftable_record_cmp(&in[0], &in[1]));
for (size_t i = 0; i < ARRAY_SIZE(in); i++) for (size_t i = 0; i < ARRAY_SIZE(in); i++)
@ -516,15 +517,15 @@ static void t_reftable_index_record_roundtrip(void)
check(!reftable_record_is_deletion(&in)); check(!reftable_record_is_deletion(&in));
check(!reftable_buf_cmp(&key, &in.u.idx.last_key)); check(!reftable_buf_cmp(&key, &in.u.idx.last_key));
n = reftable_record_encode(&in, dest, GIT_SHA1_RAWSZ); n = reftable_record_encode(&in, dest, REFTABLE_HASH_SIZE_SHA1);
check_int(n, >, 0); check_int(n, >, 0);
extra = reftable_record_val_type(&in); extra = reftable_record_val_type(&in);
m = reftable_record_decode(&out, key, extra, dest, GIT_SHA1_RAWSZ, m = reftable_record_decode(&out, key, extra, dest, REFTABLE_HASH_SIZE_SHA1,
&scratch); &scratch);
check_int(m, ==, n); check_int(m, ==, n);
check(reftable_record_equal(&in, &out, GIT_SHA1_RAWSZ)); check(reftable_record_equal(&in, &out, REFTABLE_HASH_SIZE_SHA1));
reftable_record_release(&out); reftable_record_release(&out);
reftable_buf_release(&key); reftable_buf_release(&key);

View File

@ -8,10 +8,13 @@ https://developers.google.com/open-source/licenses/bsd
#include "test-lib.h" #include "test-lib.h"
#include "lib-reftable.h" #include "lib-reftable.h"
#include "dir.h"
#include "reftable/merged.h" #include "reftable/merged.h"
#include "reftable/reader.h" #include "reftable/reader.h"
#include "reftable/reftable-error.h" #include "reftable/reftable-error.h"
#include "reftable/stack.h" #include "reftable/stack.h"
#include "strbuf.h"
#include "tempfile.h"
#include <dirent.h> #include <dirent.h>
static void clear_dir(const char *dirname) static void clear_dir(const char *dirname)
@ -120,7 +123,7 @@ static void write_n_ref_tables(struct reftable_stack *st,
snprintf(buf, sizeof(buf), "refs/heads/branch-%04"PRIuMAX, (uintmax_t)i); snprintf(buf, sizeof(buf), "refs/heads/branch-%04"PRIuMAX, (uintmax_t)i);
ref.refname = buf; ref.refname = buf;
t_reftable_set_hash(ref.value.val1, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(ref.value.val1, i, REFTABLE_HASH_SHA1);
err = reftable_stack_add(st, &write_test_ref, &ref); err = reftable_stack_add(st, &write_test_ref, &ref);
check(!err); check(!err);
@ -168,7 +171,7 @@ static void t_reftable_stack_add_one(void)
err = reftable_stack_read_ref(st, ref.refname, &dest); err = reftable_stack_read_ref(st, ref.refname, &dest);
check(!err); check(!err);
check(reftable_ref_record_equal(&ref, &dest, GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&ref, &dest, REFTABLE_HASH_SIZE_SHA1));
check_int(st->readers_len, >, 0); check_int(st->readers_len, >, 0);
#ifndef GIT_WINDOWS_NATIVE #ifndef GIT_WINDOWS_NATIVE
@ -279,7 +282,7 @@ static void t_reftable_stack_transaction_api(void)
err = reftable_stack_read_ref(st, ref.refname, &dest); err = reftable_stack_read_ref(st, ref.refname, &dest);
check(!err); check(!err);
check_int(REFTABLE_REF_SYMREF, ==, dest.value_type); check_int(REFTABLE_REF_SYMREF, ==, dest.value_type);
check(reftable_ref_record_equal(&ref, &dest, GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&ref, &dest, REFTABLE_HASH_SIZE_SHA1));
reftable_ref_record_release(&dest); reftable_ref_record_release(&dest);
reftable_stack_destroy(st); reftable_stack_destroy(st);
@ -339,7 +342,7 @@ static void t_reftable_stack_transaction_with_reload(void)
for (size_t i = 0; i < ARRAY_SIZE(refs); i++) { for (size_t i = 0; i < ARRAY_SIZE(refs); i++) {
err = reftable_stack_read_ref(st2, refs[i].refname, &ref); err = reftable_stack_read_ref(st2, refs[i].refname, &ref);
check(!err); check(!err);
check(reftable_ref_record_equal(&refs[i], &ref, GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&refs[i], &ref, REFTABLE_HASH_SIZE_SHA1));
} }
reftable_ref_record_release(&ref); reftable_ref_record_release(&ref);
@ -529,13 +532,13 @@ static void t_reftable_stack_add(void)
refs[i].refname = xstrdup(buf); refs[i].refname = xstrdup(buf);
refs[i].update_index = i + 1; refs[i].update_index = i + 1;
refs[i].value_type = REFTABLE_REF_VAL1; refs[i].value_type = REFTABLE_REF_VAL1;
t_reftable_set_hash(refs[i].value.val1, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(refs[i].value.val1, i, REFTABLE_HASH_SHA1);
logs[i].refname = xstrdup(buf); logs[i].refname = xstrdup(buf);
logs[i].update_index = N + i + 1; logs[i].update_index = N + i + 1;
logs[i].value_type = REFTABLE_LOG_UPDATE; logs[i].value_type = REFTABLE_LOG_UPDATE;
logs[i].value.update.email = xstrdup("identity@invalid"); logs[i].value.update.email = xstrdup("identity@invalid");
t_reftable_set_hash(logs[i].value.update.new_hash, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(logs[i].value.update.new_hash, i, REFTABLE_HASH_SHA1);
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -561,7 +564,7 @@ static void t_reftable_stack_add(void)
int err = reftable_stack_read_ref(st, refs[i].refname, &dest); int err = reftable_stack_read_ref(st, refs[i].refname, &dest);
check(!err); check(!err);
check(reftable_ref_record_equal(&dest, refs + i, check(reftable_ref_record_equal(&dest, refs + i,
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
reftable_ref_record_release(&dest); reftable_ref_record_release(&dest);
} }
@ -570,7 +573,7 @@ static void t_reftable_stack_add(void)
int err = reftable_stack_read_log(st, refs[i].refname, &dest); int err = reftable_stack_read_log(st, refs[i].refname, &dest);
check(!err); check(!err);
check(reftable_log_record_equal(&dest, logs + i, check(reftable_log_record_equal(&dest, logs + i,
GIT_SHA1_RAWSZ)); REFTABLE_HASH_SIZE_SHA1));
reftable_log_record_release(&dest); reftable_log_record_release(&dest);
} }
@ -621,14 +624,14 @@ static void t_reftable_stack_iterator(void)
refs[i].refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i); refs[i].refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i);
refs[i].update_index = i + 1; refs[i].update_index = i + 1;
refs[i].value_type = REFTABLE_REF_VAL1; refs[i].value_type = REFTABLE_REF_VAL1;
t_reftable_set_hash(refs[i].value.val1, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(refs[i].value.val1, i, REFTABLE_HASH_SHA1);
logs[i].refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i); logs[i].refname = xstrfmt("branch%02"PRIuMAX, (uintmax_t)i);
logs[i].update_index = i + 1; logs[i].update_index = i + 1;
logs[i].value_type = REFTABLE_LOG_UPDATE; logs[i].value_type = REFTABLE_LOG_UPDATE;
logs[i].value.update.email = xstrdup("johndoe@invalid"); logs[i].value.update.email = xstrdup("johndoe@invalid");
logs[i].value.update.message = xstrdup("commit\n"); logs[i].value.update.message = xstrdup("commit\n");
t_reftable_set_hash(logs[i].value.update.new_hash, i, GIT_SHA1_FORMAT_ID); t_reftable_set_hash(logs[i].value.update.new_hash, i, REFTABLE_HASH_SHA1);
} }
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -655,7 +658,7 @@ static void t_reftable_stack_iterator(void)
if (err > 0) if (err > 0)
break; break;
check(!err); check(!err);
check(reftable_ref_record_equal(&ref, &refs[i], GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&ref, &refs[i], REFTABLE_HASH_SIZE_SHA1));
reftable_ref_record_release(&ref); reftable_ref_record_release(&ref);
} }
check_int(i, ==, N); check_int(i, ==, N);
@ -673,7 +676,7 @@ static void t_reftable_stack_iterator(void)
if (err > 0) if (err > 0)
break; break;
check(!err); check(!err);
check(reftable_log_record_equal(&log, &logs[i], GIT_SHA1_RAWSZ)); check(reftable_log_record_equal(&log, &logs[i], REFTABLE_HASH_SIZE_SHA1));
reftable_log_record_release(&log); reftable_log_record_release(&log);
} }
check_int(i, ==, N); check_int(i, ==, N);
@ -766,7 +769,7 @@ static void t_reftable_stack_tombstone(void)
if (i % 2 == 0) { if (i % 2 == 0) {
refs[i].value_type = REFTABLE_REF_VAL1; refs[i].value_type = REFTABLE_REF_VAL1;
t_reftable_set_hash(refs[i].value.val1, i, t_reftable_set_hash(refs[i].value.val1, i,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
} }
logs[i].refname = xstrdup(buf); logs[i].refname = xstrdup(buf);
@ -775,7 +778,7 @@ static void t_reftable_stack_tombstone(void)
if (i % 2 == 0) { if (i % 2 == 0) {
logs[i].value_type = REFTABLE_LOG_UPDATE; logs[i].value_type = REFTABLE_LOG_UPDATE;
t_reftable_set_hash(logs[i].value.update.new_hash, i, t_reftable_set_hash(logs[i].value.update.new_hash, i,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
logs[i].value.update.email = logs[i].value.update.email =
xstrdup("identity@invalid"); xstrdup("identity@invalid");
} }
@ -835,7 +838,7 @@ static void t_reftable_stack_hash_id(void)
.value.symref = (char *) "target", .value.symref = (char *) "target",
.update_index = 1, .update_index = 1,
}; };
struct reftable_write_options opts32 = { .hash_id = GIT_SHA256_FORMAT_ID }; struct reftable_write_options opts32 = { .hash_id = REFTABLE_HASH_SHA256 };
struct reftable_stack *st32 = NULL; struct reftable_stack *st32 = NULL;
struct reftable_write_options opts_default = { 0 }; struct reftable_write_options opts_default = { 0 };
struct reftable_stack *st_default = NULL; struct reftable_stack *st_default = NULL;
@ -858,7 +861,7 @@ static void t_reftable_stack_hash_id(void)
err = reftable_stack_read_ref(st_default, "master", &dest); err = reftable_stack_read_ref(st_default, "master", &dest);
check(!err); check(!err);
check(reftable_ref_record_equal(&ref, &dest, GIT_SHA1_RAWSZ)); check(reftable_ref_record_equal(&ref, &dest, REFTABLE_HASH_SIZE_SHA1));
reftable_ref_record_release(&dest); reftable_ref_record_release(&dest);
reftable_stack_destroy(st); reftable_stack_destroy(st);
reftable_stack_destroy(st_default); reftable_stack_destroy(st_default);
@ -908,7 +911,7 @@ static void t_reflog_expire(void)
logs[i].value.update.time = i; logs[i].value.update.time = i;
logs[i].value.update.email = xstrdup("identity@invalid"); logs[i].value.update.email = xstrdup("identity@invalid");
t_reftable_set_hash(logs[i].value.update.new_hash, i, t_reftable_set_hash(logs[i].value.update.new_hash, i,
GIT_SHA1_FORMAT_ID); REFTABLE_HASH_SHA1);
} }
for (i = 1; i <= N; i++) { for (i = 1; i <= N; i++) {