diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2016-09-04 19:08:25 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-09-10 01:28:13 +0300 |
commit | e1e33b722c50c26546335fd5a709f89726c2ea2a (patch) | |
tree | 67a5ddc35e29923e849e841567e7746dd5a3e6b1 | |
parent | a8355bb717aaf2d5d9b3781aa78402d0053fa87a (diff) |
refs: make read_raw_ref() virtual
Reference backends will be able to customize this function to implement
reference reading.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | refs.c | 4 | ||||
-rw-r--r-- | refs/files-backend.c | 14 | ||||
-rw-r--r-- | refs/refs-internal.h | 36 |
3 files changed, 29 insertions, 25 deletions
@@ -1251,8 +1251,8 @@ static const char *resolve_ref_recursively(struct ref_store *refs, for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) { unsigned int read_flags = 0; - if (read_raw_ref(refs, refname, - sha1, &sb_refname, &read_flags)) { + if (refs->be->read_raw_ref(refs, refname, + sha1, &sb_refname, &read_flags)) { *flags |= read_flags; if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING)) return NULL; diff --git a/refs/files-backend.c b/refs/files-backend.c index 979cee884a..9cf2f82f74 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1349,9 +1349,9 @@ static int resolve_packed_ref(struct files_ref_store *refs, return -1; } -int read_raw_ref(struct ref_store *ref_store, - const char *refname, unsigned char *sha1, - struct strbuf *referent, unsigned int *type) +static int files_read_raw_ref(struct ref_store *ref_store, + const char *refname, unsigned char *sha1, + struct strbuf *referent, unsigned int *type) { struct files_ref_store *refs = files_downcast(ref_store, 1, "read_raw_ref"); @@ -1623,8 +1623,8 @@ retry: * fear that its value will change. */ - if (read_raw_ref(ref_store, refname, - lock->old_oid.hash, referent, type)) { + if (files_read_raw_ref(ref_store, refname, + lock->old_oid.hash, referent, type)) { if (errno == ENOENT) { if (mustexist) { /* Garden variety missing reference. */ @@ -4019,5 +4019,7 @@ struct ref_storage_be refs_be_files = { NULL, "files", files_ref_store_create, - files_transaction_commit + files_transaction_commit, + + files_read_raw_ref }; diff --git a/refs/refs-internal.h b/refs/refs-internal.h index fa41d510c2..19cb6e11ad 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -486,6 +486,20 @@ int do_for_each_ref_iterator(struct ref_iterator *iter, struct ref_store; +/* refs backends */ + +/* + * Initialize the ref_store for the specified submodule, or for the + * main repository if submodule == NULL. These functions should call + * base_ref_store_init() to initialize the shared part of the + * ref_store and to record the ref_store for later lookup. + */ +typedef struct ref_store *ref_store_init_fn(const char *submodule); + +typedef int ref_transaction_commit_fn(struct ref_store *refs, + struct ref_transaction *transaction, + struct strbuf *err); + /* * Read a reference from the specified reference store, non-recursively. * Set type to describe the reference, and: @@ -524,29 +538,17 @@ struct ref_store; * - in all other cases, referent will be untouched, and therefore * refname will still be valid and unchanged. */ -int read_raw_ref(struct ref_store *ref_store, - const char *refname, unsigned char *sha1, - struct strbuf *referent, unsigned int *type); - -/* refs backends */ - -/* - * Initialize the ref_store for the specified submodule, or for the - * main repository if submodule == NULL. These functions should call - * base_ref_store_init() to initialize the shared part of the - * ref_store and to record the ref_store for later lookup. - */ -typedef struct ref_store *ref_store_init_fn(const char *submodule); - -typedef int ref_transaction_commit_fn(struct ref_store *refs, - struct ref_transaction *transaction, - struct strbuf *err); +typedef int read_raw_ref_fn(struct ref_store *ref_store, + const char *refname, unsigned char *sha1, + struct strbuf *referent, unsigned int *type); struct ref_storage_be { struct ref_storage_be *next; const char *name; ref_store_init_fn *init; ref_transaction_commit_fn *transaction_commit; + + read_raw_ref_fn *read_raw_ref; }; extern struct ref_storage_be refs_be_files; |