loose: write loose objects map via their source
When a repository is configured to have a compatibility hash algorithm we keep track of object ID mappings for loose objects via the loose object map. This map simply maps an object ID of the actual hash to the object ID of the compatibility hash. This loose object map is an inherent property of the loose files backend and thus of one specific object source. Refactor the interfaces to reflect this by requiring a `struct odb_source` as input instead of a repository. This prepares for subsequent commits where we will refactor writing of loose objects to work on a `struct odb_source`, as well. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
cbb388f3e5
commit
0f9b189357
16
loose.c
16
loose.c
|
@ -166,7 +166,8 @@ errout:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_one_object(struct repository *repo, const struct object_id *oid,
|
static int write_one_object(struct odb_source *source,
|
||||||
|
const struct object_id *oid,
|
||||||
const struct object_id *compat_oid)
|
const struct object_id *compat_oid)
|
||||||
{
|
{
|
||||||
struct lock_file lock;
|
struct lock_file lock;
|
||||||
|
@ -174,7 +175,7 @@ static int write_one_object(struct repository *repo, const struct object_id *oid
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
|
||||||
|
|
||||||
repo_common_path_replace(repo, &path, "objects/loose-object-idx");
|
strbuf_addf(&path, "%s/loose-object-idx", source->path);
|
||||||
hold_lock_file_for_update_timeout(&lock, path.buf, LOCK_DIE_ON_ERROR, -1);
|
hold_lock_file_for_update_timeout(&lock, path.buf, LOCK_DIE_ON_ERROR, -1);
|
||||||
|
|
||||||
fd = open(path.buf, O_WRONLY | O_CREAT | O_APPEND, 0666);
|
fd = open(path.buf, O_WRONLY | O_CREAT | O_APPEND, 0666);
|
||||||
|
@ -190,7 +191,7 @@ static int write_one_object(struct repository *repo, const struct object_id *oid
|
||||||
goto errout;
|
goto errout;
|
||||||
if (close(fd))
|
if (close(fd))
|
||||||
goto errout;
|
goto errout;
|
||||||
adjust_shared_perm(repo, path.buf);
|
adjust_shared_perm(source->odb->repo, path.buf);
|
||||||
rollback_lock_file(&lock);
|
rollback_lock_file(&lock);
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
strbuf_release(&path);
|
strbuf_release(&path);
|
||||||
|
@ -204,17 +205,18 @@ errout:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int repo_add_loose_object_map(struct repository *repo, const struct object_id *oid,
|
int repo_add_loose_object_map(struct odb_source *source,
|
||||||
|
const struct object_id *oid,
|
||||||
const struct object_id *compat_oid)
|
const struct object_id *compat_oid)
|
||||||
{
|
{
|
||||||
int inserted = 0;
|
int inserted = 0;
|
||||||
|
|
||||||
if (!should_use_loose_object_map(repo))
|
if (!should_use_loose_object_map(source->odb->repo))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
inserted = insert_loose_map(repo->objects->sources, oid, compat_oid);
|
inserted = insert_loose_map(source, oid, compat_oid);
|
||||||
if (inserted)
|
if (inserted)
|
||||||
return write_one_object(repo, oid, compat_oid);
|
return write_one_object(source, oid, compat_oid);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
loose.h
4
loose.h
|
@ -4,6 +4,7 @@
|
||||||
#include "khash.h"
|
#include "khash.h"
|
||||||
|
|
||||||
struct repository;
|
struct repository;
|
||||||
|
struct odb_source;
|
||||||
|
|
||||||
struct loose_object_map {
|
struct loose_object_map {
|
||||||
kh_oid_map_t *to_compat;
|
kh_oid_map_t *to_compat;
|
||||||
|
@ -16,7 +17,8 @@ int repo_loose_object_map_oid(struct repository *repo,
|
||||||
const struct object_id *src,
|
const struct object_id *src,
|
||||||
const struct git_hash_algo *dest_algo,
|
const struct git_hash_algo *dest_algo,
|
||||||
struct object_id *dest);
|
struct object_id *dest);
|
||||||
int repo_add_loose_object_map(struct repository *repo, const struct object_id *oid,
|
int repo_add_loose_object_map(struct odb_source *source,
|
||||||
|
const struct object_id *oid,
|
||||||
const struct object_id *compat_oid);
|
const struct object_id *compat_oid);
|
||||||
int repo_read_loose_object_map(struct repository *repo);
|
int repo_read_loose_object_map(struct repository *repo);
|
||||||
int repo_write_loose_object_map(struct repository *repo);
|
int repo_write_loose_object_map(struct repository *repo);
|
||||||
|
|
|
@ -1025,7 +1025,7 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
|
||||||
err = finalize_object_file_flags(the_repository, tmp_file.buf, filename.buf,
|
err = finalize_object_file_flags(the_repository, tmp_file.buf, filename.buf,
|
||||||
FOF_SKIP_COLLISION_CHECK);
|
FOF_SKIP_COLLISION_CHECK);
|
||||||
if (!err && compat)
|
if (!err && compat)
|
||||||
err = repo_add_loose_object_map(the_repository, oid, &compat_oid);
|
err = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid);
|
||||||
cleanup:
|
cleanup:
|
||||||
strbuf_release(&tmp_file);
|
strbuf_release(&tmp_file);
|
||||||
strbuf_release(&filename);
|
strbuf_release(&filename);
|
||||||
|
@ -1069,7 +1069,7 @@ int write_object_file_flags(const void *buf, unsigned long len,
|
||||||
if (write_loose_object(oid, hdr, hdrlen, buf, len, 0, flags))
|
if (write_loose_object(oid, hdr, hdrlen, buf, len, 0, flags))
|
||||||
return -1;
|
return -1;
|
||||||
if (compat)
|
if (compat)
|
||||||
return repo_add_loose_object_map(repo, oid, &compat_oid);
|
return repo_add_loose_object_map(repo->objects->sources, oid, &compat_oid);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1103,7 +1103,7 @@ int force_object_loose(const struct object_id *oid, time_t mtime)
|
||||||
hdrlen = format_object_header(hdr, sizeof(hdr), type, len);
|
hdrlen = format_object_header(hdr, sizeof(hdr), type, len);
|
||||||
ret = write_loose_object(oid, hdr, hdrlen, buf, len, mtime, 0);
|
ret = write_loose_object(oid, hdr, hdrlen, buf, len, mtime, 0);
|
||||||
if (!ret && compat)
|
if (!ret && compat)
|
||||||
ret = repo_add_loose_object_map(the_repository, oid, &compat_oid);
|
ret = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue