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:
1
Makefile
1
Makefile
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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. */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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 *));
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
173
reftable/stack.c
173
reftable/stack.c
@ -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
126
reftable/system.c
Normal 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;
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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])) {
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(©, typ);
|
reftable_record_init(©, typ);
|
||||||
reftable_record_copy_from(©, rec, GIT_SHA1_RAWSZ);
|
reftable_record_copy_from(©, rec, REFTABLE_HASH_SIZE_SHA1);
|
||||||
/* do it twice to catch memory leaks */
|
/* do it twice to catch memory leaks */
|
||||||
reftable_record_copy_from(©, rec, GIT_SHA1_RAWSZ);
|
reftable_record_copy_from(©, rec, REFTABLE_HASH_SIZE_SHA1);
|
||||||
check(reftable_record_equal(rec, ©, GIT_SHA1_RAWSZ));
|
check(reftable_record_equal(rec, ©, REFTABLE_HASH_SIZE_SHA1));
|
||||||
|
|
||||||
reftable_record_release(©);
|
reftable_record_release(©);
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
|
@ -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++) {
|
||||||
|
Reference in New Issue
Block a user