refs: add new ref-store api
This is not meant to cover all existing API. It adds enough to test ref stores with the new test program test-ref-store, coming soon and to be used by files-backend.c. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
18d0002d6d
commit
7d2df051d0
251
refs.c
251
refs.c
@ -171,11 +171,23 @@ int refname_is_safe(const char *refname)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *refs_resolve_refdup(struct ref_store *refs,
|
||||||
|
const char *refname, int resolve_flags,
|
||||||
|
unsigned char *sha1, int *flags)
|
||||||
|
{
|
||||||
|
const char *result;
|
||||||
|
|
||||||
|
result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
|
||||||
|
sha1, flags);
|
||||||
|
return xstrdup_or_null(result);
|
||||||
|
}
|
||||||
|
|
||||||
char *resolve_refdup(const char *refname, int resolve_flags,
|
char *resolve_refdup(const char *refname, int resolve_flags,
|
||||||
unsigned char *sha1, int *flags)
|
unsigned char *sha1, int *flags)
|
||||||
{
|
{
|
||||||
return xstrdup_or_null(resolve_ref_unsafe(refname, resolve_flags,
|
return refs_resolve_refdup(get_main_ref_store(),
|
||||||
sha1, flags));
|
refname, resolve_flags,
|
||||||
|
sha1, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The argument to filter_refs */
|
/* The argument to filter_refs */
|
||||||
@ -185,13 +197,20 @@ struct ref_filter {
|
|||||||
void *cb_data;
|
void *cb_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
|
int refs_read_ref_full(struct ref_store *refs, const char *refname,
|
||||||
|
int resolve_flags, unsigned char *sha1, int *flags)
|
||||||
{
|
{
|
||||||
if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
|
if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
|
||||||
|
{
|
||||||
|
return refs_read_ref_full(get_main_ref_store(), refname,
|
||||||
|
resolve_flags, sha1, flags);
|
||||||
|
}
|
||||||
|
|
||||||
int read_ref(const char *refname, unsigned char *sha1)
|
int read_ref(const char *refname, unsigned char *sha1)
|
||||||
{
|
{
|
||||||
return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
|
return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
|
||||||
@ -286,34 +305,52 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li
|
|||||||
for_each_rawref(warn_if_dangling_symref, &data);
|
for_each_rawref(warn_if_dangling_symref, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
int for_each_tag_ref(each_ref_fn fn, void *cb_data)
|
int for_each_tag_ref(each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in("refs/tags/", fn, cb_data);
|
return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in_submodule(submodule, "refs/tags/", fn, cb_data);
|
return refs_for_each_tag_ref(get_submodule_ref_store(submodule),
|
||||||
|
fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_branch_ref(each_ref_fn fn, void *cb_data)
|
int for_each_branch_ref(each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in("refs/heads/", fn, cb_data);
|
return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in_submodule(submodule, "refs/heads/", fn, cb_data);
|
return refs_for_each_branch_ref(get_submodule_ref_store(submodule),
|
||||||
|
fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_remote_ref(each_ref_fn fn, void *cb_data)
|
int for_each_remote_ref(each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in("refs/remotes/", fn, cb_data);
|
return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
|
return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
|
||||||
|
fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int head_ref_namespaced(each_ref_fn fn, void *cb_data)
|
int head_ref_namespaced(each_ref_fn fn, void *cb_data)
|
||||||
@ -1120,14 +1157,17 @@ const char *find_descendant_ref(const char *dirname,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rename_ref_available(const char *old_refname, const char *new_refname)
|
int refs_rename_ref_available(struct ref_store *refs,
|
||||||
|
const char *old_refname,
|
||||||
|
const char *new_refname)
|
||||||
{
|
{
|
||||||
struct string_list skip = STRING_LIST_INIT_NODUP;
|
struct string_list skip = STRING_LIST_INIT_NODUP;
|
||||||
struct strbuf err = STRBUF_INIT;
|
struct strbuf err = STRBUF_INIT;
|
||||||
int ok;
|
int ok;
|
||||||
|
|
||||||
string_list_insert(&skip, old_refname);
|
string_list_insert(&skip, old_refname);
|
||||||
ok = !verify_refname_available(new_refname, NULL, &skip, &err);
|
ok = !refs_verify_refname_available(refs, new_refname,
|
||||||
|
NULL, &skip, &err);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
error("%s", err.buf);
|
error("%s", err.buf);
|
||||||
|
|
||||||
@ -1168,10 +1208,9 @@ int head_ref(each_ref_fn fn, void *cb_data)
|
|||||||
* non-zero value, stop the iteration and return that value;
|
* non-zero value, stop the iteration and return that value;
|
||||||
* otherwise, return 0.
|
* otherwise, return 0.
|
||||||
*/
|
*/
|
||||||
static int do_for_each_ref(const char *submodule, const char *prefix,
|
static int do_for_each_ref(struct ref_store *refs, const char *prefix,
|
||||||
each_ref_fn fn, int trim, int flags, void *cb_data)
|
each_ref_fn fn, int trim, int flags, void *cb_data)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_submodule_ref_store(submodule);
|
|
||||||
struct ref_iterator *iter;
|
struct ref_iterator *iter;
|
||||||
|
|
||||||
if (!refs)
|
if (!refs)
|
||||||
@ -1183,19 +1222,30 @@ static int do_for_each_ref(const char *submodule, const char *prefix,
|
|||||||
return do_for_each_ref_iterator(iter, fn, cb_data);
|
return do_for_each_ref_iterator(iter, fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
int for_each_ref(each_ref_fn fn, void *cb_data)
|
int for_each_ref(each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(NULL, "", fn, 0, 0, cb_data);
|
return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(submodule, "", fn, 0, 0, cb_data);
|
return refs_for_each_ref(get_submodule_ref_store(submodule), fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
|
||||||
|
each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
|
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(NULL, prefix, fn, strlen(prefix), 0, cb_data);
|
return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
|
int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
|
||||||
@ -1204,19 +1254,23 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsig
|
|||||||
|
|
||||||
if (broken)
|
if (broken)
|
||||||
flag = DO_FOR_EACH_INCLUDE_BROKEN;
|
flag = DO_FOR_EACH_INCLUDE_BROKEN;
|
||||||
return do_for_each_ref(NULL, prefix, fn, 0, flag, cb_data);
|
return do_for_each_ref(get_main_ref_store(),
|
||||||
|
prefix, fn, 0, flag, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_ref_in_submodule(const char *submodule, const char *prefix,
|
int for_each_ref_in_submodule(const char *submodule, const char *prefix,
|
||||||
each_ref_fn fn, void *cb_data)
|
each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, cb_data);
|
return refs_for_each_ref_in(get_submodule_ref_store(submodule),
|
||||||
|
prefix, fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_replace_ref(each_ref_fn fn, void *cb_data)
|
int for_each_replace_ref(each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(NULL, git_replace_ref_base, fn,
|
return do_for_each_ref(get_main_ref_store(),
|
||||||
strlen(git_replace_ref_base), 0, cb_data);
|
git_replace_ref_base, fn,
|
||||||
|
strlen(git_replace_ref_base),
|
||||||
|
0, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
|
int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
|
||||||
@ -1224,19 +1278,25 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
|
|||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
int ret;
|
int ret;
|
||||||
strbuf_addf(&buf, "%srefs/", get_git_namespace());
|
strbuf_addf(&buf, "%srefs/", get_git_namespace());
|
||||||
ret = do_for_each_ref(NULL, buf.buf, fn, 0, 0, cb_data);
|
ret = do_for_each_ref(get_main_ref_store(),
|
||||||
|
buf.buf, fn, 0, 0, cb_data);
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_rawref(each_ref_fn fn, void *cb_data)
|
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
return do_for_each_ref(NULL, "", fn, 0,
|
return do_for_each_ref(refs, "", fn, 0,
|
||||||
DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
|
DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int for_each_rawref(each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
/* This function needs to return a meaningful errno on failure */
|
/* This function needs to return a meaningful errno on failure */
|
||||||
const char *resolve_ref_recursively(struct ref_store *refs,
|
const char *refs_resolve_ref_unsafe(struct ref_store *refs,
|
||||||
const char *refname,
|
const char *refname,
|
||||||
int resolve_flags,
|
int resolve_flags,
|
||||||
unsigned char *sha1, int *flags)
|
unsigned char *sha1, int *flags)
|
||||||
@ -1323,7 +1383,7 @@ int refs_init_db(struct strbuf *err)
|
|||||||
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
|
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
|
||||||
unsigned char *sha1, int *flags)
|
unsigned char *sha1, int *flags)
|
||||||
{
|
{
|
||||||
return resolve_ref_recursively(get_main_ref_store(), refname,
|
return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
|
||||||
resolve_flags, sha1, flags);
|
resolve_flags, sha1, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1353,7 +1413,7 @@ int resolve_gitlink_ref(const char *submodule, const char *refname,
|
|||||||
if (!refs)
|
if (!refs)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) ||
|
if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
|
||||||
is_null_sha1(sha1))
|
is_null_sha1(sha1))
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1506,27 +1566,42 @@ void base_ref_store_init(struct ref_store *refs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* backend functions */
|
/* backend functions */
|
||||||
|
int refs_pack_refs(struct ref_store *refs, unsigned int flags)
|
||||||
|
{
|
||||||
|
return refs->be->pack_refs(refs, flags);
|
||||||
|
}
|
||||||
|
|
||||||
int pack_refs(unsigned int flags)
|
int pack_refs(unsigned int flags)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_pack_refs(get_main_ref_store(), flags);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->pack_refs(refs, flags);
|
int refs_peel_ref(struct ref_store *refs, const char *refname,
|
||||||
|
unsigned char *sha1)
|
||||||
|
{
|
||||||
|
return refs->be->peel_ref(refs, refname, sha1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int peel_ref(const char *refname, unsigned char *sha1)
|
int peel_ref(const char *refname, unsigned char *sha1)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_peel_ref(get_main_ref_store(), refname, sha1);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->peel_ref(refs, refname, sha1);
|
int refs_create_symref(struct ref_store *refs,
|
||||||
|
const char *ref_target,
|
||||||
|
const char *refs_heads_master,
|
||||||
|
const char *logmsg)
|
||||||
|
{
|
||||||
|
return refs->be->create_symref(refs, ref_target,
|
||||||
|
refs_heads_master,
|
||||||
|
logmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int create_symref(const char *ref_target, const char *refs_heads_master,
|
int create_symref(const char *ref_target, const char *refs_heads_master,
|
||||||
const char *logmsg)
|
const char *logmsg)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_create_symref(get_main_ref_store(), ref_target,
|
||||||
|
refs_heads_master, logmsg);
|
||||||
return refs->be->create_symref(refs, ref_target, refs_heads_master,
|
|
||||||
logmsg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ref_transaction_commit(struct ref_transaction *transaction,
|
int ref_transaction_commit(struct ref_transaction *transaction,
|
||||||
@ -1537,19 +1612,17 @@ int ref_transaction_commit(struct ref_transaction *transaction,
|
|||||||
return refs->be->transaction_commit(refs, transaction, err);
|
return refs->be->transaction_commit(refs, transaction, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int verify_refname_available(const char *refname,
|
int refs_verify_refname_available(struct ref_store *refs,
|
||||||
const struct string_list *extra,
|
const char *refname,
|
||||||
const struct string_list *skip,
|
const struct string_list *extra,
|
||||||
struct strbuf *err)
|
const struct string_list *skip,
|
||||||
|
struct strbuf *err)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
|
||||||
|
|
||||||
return refs->be->verify_refname_available(refs, refname, extra, skip, err);
|
return refs->be->verify_refname_available(refs, refname, extra, skip, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_reflog(each_ref_fn fn, void *cb_data)
|
int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
|
||||||
struct ref_iterator *iter;
|
struct ref_iterator *iter;
|
||||||
|
|
||||||
iter = refs->be->reflog_iterator_begin(refs);
|
iter = refs->be->reflog_iterator_begin(refs);
|
||||||
@ -1557,43 +1630,84 @@ int for_each_reflog(each_ref_fn fn, void *cb_data)
|
|||||||
return do_for_each_ref_iterator(iter, fn, cb_data);
|
return do_for_each_ref_iterator(iter, fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int for_each_reflog(each_ref_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
|
||||||
|
const char *refname,
|
||||||
|
each_reflog_ent_fn fn,
|
||||||
|
void *cb_data)
|
||||||
|
{
|
||||||
|
return refs->be->for_each_reflog_ent_reverse(refs, refname,
|
||||||
|
fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
|
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
|
||||||
void *cb_data)
|
void *cb_data)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
|
||||||
|
refname, fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->for_each_reflog_ent_reverse(refs, refname,
|
int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
|
||||||
fn, cb_data);
|
each_reflog_ent_fn fn, void *cb_data)
|
||||||
|
{
|
||||||
|
return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
|
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
|
||||||
void *cb_data)
|
void *cb_data)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_for_each_reflog_ent(get_main_ref_store(), refname,
|
||||||
|
fn, cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
|
int refs_reflog_exists(struct ref_store *refs, const char *refname)
|
||||||
|
{
|
||||||
|
return refs->be->reflog_exists(refs, refname);
|
||||||
}
|
}
|
||||||
|
|
||||||
int reflog_exists(const char *refname)
|
int reflog_exists(const char *refname)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_reflog_exists(get_main_ref_store(), refname);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->reflog_exists(refs, refname);
|
int refs_create_reflog(struct ref_store *refs, const char *refname,
|
||||||
|
int force_create, struct strbuf *err)
|
||||||
|
{
|
||||||
|
return refs->be->create_reflog(refs, refname, force_create, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int safe_create_reflog(const char *refname, int force_create,
|
int safe_create_reflog(const char *refname, int force_create,
|
||||||
struct strbuf *err)
|
struct strbuf *err)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_create_reflog(get_main_ref_store(), refname,
|
||||||
|
force_create, err);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->create_reflog(refs, refname, force_create, err);
|
int refs_delete_reflog(struct ref_store *refs, const char *refname)
|
||||||
|
{
|
||||||
|
return refs->be->delete_reflog(refs, refname);
|
||||||
}
|
}
|
||||||
|
|
||||||
int delete_reflog(const char *refname)
|
int delete_reflog(const char *refname)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_delete_reflog(get_main_ref_store(), refname);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->delete_reflog(refs, refname);
|
int refs_reflog_expire(struct ref_store *refs,
|
||||||
|
const char *refname, const unsigned char *sha1,
|
||||||
|
unsigned int flags,
|
||||||
|
reflog_expiry_prepare_fn prepare_fn,
|
||||||
|
reflog_expiry_should_prune_fn should_prune_fn,
|
||||||
|
reflog_expiry_cleanup_fn cleanup_fn,
|
||||||
|
void *policy_cb_data)
|
||||||
|
{
|
||||||
|
return refs->be->reflog_expire(refs, refname, sha1, flags,
|
||||||
|
prepare_fn, should_prune_fn,
|
||||||
|
cleanup_fn, policy_cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int reflog_expire(const char *refname, const unsigned char *sha1,
|
int reflog_expire(const char *refname, const unsigned char *sha1,
|
||||||
@ -1603,11 +1717,10 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
|
|||||||
reflog_expiry_cleanup_fn cleanup_fn,
|
reflog_expiry_cleanup_fn cleanup_fn,
|
||||||
void *policy_cb_data)
|
void *policy_cb_data)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_reflog_expire(get_main_ref_store(),
|
||||||
|
refname, sha1, flags,
|
||||||
return refs->be->reflog_expire(refs, refname, sha1, flags,
|
prepare_fn, should_prune_fn,
|
||||||
prepare_fn, should_prune_fn,
|
cleanup_fn, policy_cb_data);
|
||||||
cleanup_fn, policy_cb_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int initial_ref_transaction_commit(struct ref_transaction *transaction,
|
int initial_ref_transaction_commit(struct ref_transaction *transaction,
|
||||||
@ -1618,16 +1731,24 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
|
|||||||
return refs->be->initial_transaction_commit(refs, transaction, err);
|
return refs->be->initial_transaction_commit(refs, transaction, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
return refs->be->delete_refs(refs, refnames, flags);
|
||||||
|
}
|
||||||
|
|
||||||
int delete_refs(struct string_list *refnames, unsigned int flags)
|
int delete_refs(struct string_list *refnames, unsigned int flags)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_delete_refs(get_main_ref_store(), refnames, flags);
|
||||||
|
}
|
||||||
|
|
||||||
return refs->be->delete_refs(refs, refnames, flags);
|
int refs_rename_ref(struct ref_store *refs, const char *oldref,
|
||||||
|
const char *newref, const char *logmsg)
|
||||||
|
{
|
||||||
|
return refs->be->rename_ref(refs, oldref, newref, logmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
int rename_ref(const char *oldref, const char *newref, const char *logmsg)
|
||||||
{
|
{
|
||||||
struct ref_store *refs = get_main_ref_store();
|
return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
|
||||||
|
|
||||||
return refs->be->rename_ref(refs, oldref, newref, logmsg);
|
|
||||||
}
|
}
|
||||||
|
74
refs.h
74
refs.h
@ -57,16 +57,50 @@ struct string_list;
|
|||||||
#define RESOLVE_REF_NO_RECURSE 0x02
|
#define RESOLVE_REF_NO_RECURSE 0x02
|
||||||
#define RESOLVE_REF_ALLOW_BAD_NAME 0x04
|
#define RESOLVE_REF_ALLOW_BAD_NAME 0x04
|
||||||
|
|
||||||
|
const char *refs_resolve_ref_unsafe(struct ref_store *refs,
|
||||||
|
const char *refname,
|
||||||
|
int resolve_flags,
|
||||||
|
unsigned char *sha1,
|
||||||
|
int *flags);
|
||||||
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
|
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
|
||||||
unsigned char *sha1, int *flags);
|
unsigned char *sha1, int *flags);
|
||||||
|
|
||||||
|
char *refs_resolve_refdup(struct ref_store *refs,
|
||||||
|
const char *refname, int resolve_flags,
|
||||||
|
unsigned char *sha1, int *flags);
|
||||||
char *resolve_refdup(const char *refname, int resolve_flags,
|
char *resolve_refdup(const char *refname, int resolve_flags,
|
||||||
unsigned char *sha1, int *flags);
|
unsigned char *sha1, int *flags);
|
||||||
|
|
||||||
|
int refs_read_ref_full(struct ref_store *refs, const char *refname,
|
||||||
|
int resolve_flags, unsigned char *sha1, int *flags);
|
||||||
int read_ref_full(const char *refname, int resolve_flags,
|
int read_ref_full(const char *refname, int resolve_flags,
|
||||||
unsigned char *sha1, int *flags);
|
unsigned char *sha1, int *flags);
|
||||||
int read_ref(const char *refname, unsigned char *sha1);
|
int read_ref(const char *refname, unsigned char *sha1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return 0 if a reference named refname could be created without
|
||||||
|
* conflicting with the name of an existing reference. Otherwise,
|
||||||
|
* return a negative value and write an explanation to err. If extras
|
||||||
|
* is non-NULL, it is a list of additional refnames with which refname
|
||||||
|
* is not allowed to conflict. If skip is non-NULL, ignore potential
|
||||||
|
* conflicts with refs in skip (e.g., because they are scheduled for
|
||||||
|
* deletion in the same operation). Behavior is undefined if the same
|
||||||
|
* name is listed in both extras and skip.
|
||||||
|
*
|
||||||
|
* Two reference names conflict if one of them exactly matches the
|
||||||
|
* leading components of the other; e.g., "foo/bar" conflicts with
|
||||||
|
* both "foo" and with "foo/bar/baz" but not with "foo/bar" or
|
||||||
|
* "foo/barbados".
|
||||||
|
*
|
||||||
|
* extras and skip must be sorted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int refs_verify_refname_available(struct ref_store *refs,
|
||||||
|
const char *refname,
|
||||||
|
const struct string_list *extra,
|
||||||
|
const struct string_list *skip,
|
||||||
|
struct strbuf *err);
|
||||||
|
|
||||||
int ref_exists(const char *refname);
|
int ref_exists(const char *refname);
|
||||||
|
|
||||||
int should_autocreate_reflog(const char *refname);
|
int should_autocreate_reflog(const char *refname);
|
||||||
@ -83,6 +117,8 @@ extern int refs_init_db(struct strbuf *err);
|
|||||||
* Symbolic references are considered unpeelable, even if they
|
* Symbolic references are considered unpeelable, even if they
|
||||||
* ultimately resolve to a peelable tag.
|
* ultimately resolve to a peelable tag.
|
||||||
*/
|
*/
|
||||||
|
int refs_peel_ref(struct ref_store *refs, const char *refname,
|
||||||
|
unsigned char *sha1);
|
||||||
int peel_ref(const char *refname, unsigned char *sha1);
|
int peel_ref(const char *refname, unsigned char *sha1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -196,6 +232,17 @@ typedef int each_ref_fn(const char *refname,
|
|||||||
* modifies the reference also returns a nonzero value to immediately
|
* modifies the reference also returns a nonzero value to immediately
|
||||||
* stop the iteration.
|
* stop the iteration.
|
||||||
*/
|
*/
|
||||||
|
int refs_for_each_ref(struct ref_store *refs,
|
||||||
|
each_ref_fn fn, void *cb_data);
|
||||||
|
int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
|
||||||
|
each_ref_fn fn, void *cb_data);
|
||||||
|
int refs_for_each_tag_ref(struct ref_store *refs,
|
||||||
|
each_ref_fn fn, void *cb_data);
|
||||||
|
int refs_for_each_branch_ref(struct ref_store *refs,
|
||||||
|
each_ref_fn fn, void *cb_data);
|
||||||
|
int refs_for_each_remote_ref(struct ref_store *refs,
|
||||||
|
each_ref_fn fn, void *cb_data);
|
||||||
|
|
||||||
int head_ref(each_ref_fn fn, void *cb_data);
|
int head_ref(each_ref_fn fn, void *cb_data);
|
||||||
int for_each_ref(each_ref_fn fn, void *cb_data);
|
int for_each_ref(each_ref_fn fn, void *cb_data);
|
||||||
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
|
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
|
||||||
@ -225,6 +272,7 @@ int head_ref_namespaced(each_ref_fn fn, void *cb_data);
|
|||||||
int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);
|
int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);
|
||||||
|
|
||||||
/* can be used to learn about broken ref and symref */
|
/* can be used to learn about broken ref and symref */
|
||||||
|
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data);
|
||||||
int for_each_rawref(each_ref_fn fn, void *cb_data);
|
int for_each_rawref(each_ref_fn fn, void *cb_data);
|
||||||
|
|
||||||
static inline const char *has_glob_specials(const char *pattern)
|
static inline const char *has_glob_specials(const char *pattern)
|
||||||
@ -248,6 +296,7 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt,
|
|||||||
* Write a packed-refs file for the current repository.
|
* Write a packed-refs file for the current repository.
|
||||||
* flags: Combination of the above PACK_REFS_* flags.
|
* flags: Combination of the above PACK_REFS_* flags.
|
||||||
*/
|
*/
|
||||||
|
int refs_pack_refs(struct ref_store *refs, unsigned int flags);
|
||||||
int pack_refs(unsigned int flags);
|
int pack_refs(unsigned int flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -263,6 +312,8 @@ int pack_refs(unsigned int flags);
|
|||||||
/*
|
/*
|
||||||
* Setup reflog before using. Fill in err and return -1 on failure.
|
* Setup reflog before using. Fill in err and return -1 on failure.
|
||||||
*/
|
*/
|
||||||
|
int refs_create_reflog(struct ref_store *refs, const char *refname,
|
||||||
|
int force_create, struct strbuf *err);
|
||||||
int safe_create_reflog(const char *refname, int force_create, struct strbuf *err);
|
int safe_create_reflog(const char *refname, int force_create, struct strbuf *err);
|
||||||
|
|
||||||
/** Reads log for the value of ref during at_time. **/
|
/** Reads log for the value of ref during at_time. **/
|
||||||
@ -272,6 +323,7 @@ int read_ref_at(const char *refname, unsigned int flags,
|
|||||||
unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
|
unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
|
||||||
|
|
||||||
/** Check if a particular reflog exists */
|
/** Check if a particular reflog exists */
|
||||||
|
int refs_reflog_exists(struct ref_store *refs, const char *refname);
|
||||||
int reflog_exists(const char *refname);
|
int reflog_exists(const char *refname);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -290,9 +342,12 @@ int delete_ref(const char *msg, const char *refname,
|
|||||||
* an all-or-nothing transaction). flags is passed through to
|
* an all-or-nothing transaction). flags is passed through to
|
||||||
* ref_transaction_delete().
|
* ref_transaction_delete().
|
||||||
*/
|
*/
|
||||||
|
int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
|
||||||
|
unsigned int flags);
|
||||||
int delete_refs(struct string_list *refnames, unsigned int flags);
|
int delete_refs(struct string_list *refnames, unsigned int flags);
|
||||||
|
|
||||||
/** Delete a reflog */
|
/** Delete a reflog */
|
||||||
|
int refs_delete_reflog(struct ref_store *refs, const char *refname);
|
||||||
int delete_reflog(const char *refname);
|
int delete_reflog(const char *refname);
|
||||||
|
|
||||||
/* iterate over reflog entries */
|
/* iterate over reflog entries */
|
||||||
@ -301,6 +356,12 @@ typedef int each_reflog_ent_fn(
|
|||||||
const char *committer, unsigned long timestamp,
|
const char *committer, unsigned long timestamp,
|
||||||
int tz, const char *msg, void *cb_data);
|
int tz, const char *msg, void *cb_data);
|
||||||
|
|
||||||
|
int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
|
||||||
|
each_reflog_ent_fn fn, void *cb_data);
|
||||||
|
int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
|
||||||
|
const char *refname,
|
||||||
|
each_reflog_ent_fn fn,
|
||||||
|
void *cb_data);
|
||||||
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
|
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
|
||||||
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data);
|
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data);
|
||||||
|
|
||||||
@ -308,6 +369,7 @@ int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void
|
|||||||
* Calls the specified function for each reflog file until it returns nonzero,
|
* Calls the specified function for each reflog file until it returns nonzero,
|
||||||
* and returns the value
|
* and returns the value
|
||||||
*/
|
*/
|
||||||
|
int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data);
|
||||||
int for_each_reflog(each_ref_fn fn, void *cb_data);
|
int for_each_reflog(each_ref_fn fn, void *cb_data);
|
||||||
|
|
||||||
#define REFNAME_ALLOW_ONELEVEL 1
|
#define REFNAME_ALLOW_ONELEVEL 1
|
||||||
@ -328,8 +390,12 @@ const char *prettify_refname(const char *refname);
|
|||||||
char *shorten_unambiguous_ref(const char *refname, int strict);
|
char *shorten_unambiguous_ref(const char *refname, int strict);
|
||||||
|
|
||||||
/** rename ref, return 0 on success **/
|
/** rename ref, return 0 on success **/
|
||||||
|
int refs_rename_ref(struct ref_store *refs, const char *oldref,
|
||||||
|
const char *newref, const char *logmsg);
|
||||||
int rename_ref(const char *oldref, const char *newref, const char *logmsg);
|
int rename_ref(const char *oldref, const char *newref, const char *logmsg);
|
||||||
|
|
||||||
|
int refs_create_symref(struct ref_store *refs, const char *refname,
|
||||||
|
const char *target, const char *logmsg);
|
||||||
int create_symref(const char *refname, const char *target, const char *logmsg);
|
int create_symref(const char *refname, const char *target, const char *logmsg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -552,6 +618,14 @@ typedef void reflog_expiry_cleanup_fn(void *cb_data);
|
|||||||
* enum expire_reflog_flags. The three function pointers are described
|
* enum expire_reflog_flags. The three function pointers are described
|
||||||
* above. On success, return zero.
|
* above. On success, return zero.
|
||||||
*/
|
*/
|
||||||
|
int refs_reflog_expire(struct ref_store *refs,
|
||||||
|
const char *refname,
|
||||||
|
const unsigned char *sha1,
|
||||||
|
unsigned int flags,
|
||||||
|
reflog_expiry_prepare_fn prepare_fn,
|
||||||
|
reflog_expiry_should_prune_fn should_prune_fn,
|
||||||
|
reflog_expiry_cleanup_fn cleanup_fn,
|
||||||
|
void *policy_cb_data);
|
||||||
int reflog_expire(const char *refname, const unsigned char *sha1,
|
int reflog_expire(const char *refname, const unsigned char *sha1,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
reflog_expiry_prepare_fn prepare_fn,
|
reflog_expiry_prepare_fn prepare_fn,
|
||||||
|
@ -1313,7 +1313,7 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
|
|||||||
create_dir_entry(refs, refname.buf,
|
create_dir_entry(refs, refname.buf,
|
||||||
refname.len, 1));
|
refname.len, 1));
|
||||||
} else {
|
} else {
|
||||||
if (!resolve_ref_recursively(&refs->base,
|
if (!refs_resolve_ref_unsafe(&refs->base,
|
||||||
refname.buf,
|
refname.buf,
|
||||||
RESOLVE_REF_READING,
|
RESOLVE_REF_READING,
|
||||||
sha1, &flag)) {
|
sha1, &flag)) {
|
||||||
@ -1622,7 +1622,8 @@ retry:
|
|||||||
* another reference such as "refs/foo". There is no
|
* another reference such as "refs/foo". There is no
|
||||||
* reason to expect this error to be transitory.
|
* reason to expect this error to be transitory.
|
||||||
*/
|
*/
|
||||||
if (verify_refname_available(refname, extras, skip, err)) {
|
if (refs_verify_refname_available(&refs->base, refname,
|
||||||
|
extras, skip, err)) {
|
||||||
if (mustexist) {
|
if (mustexist) {
|
||||||
/*
|
/*
|
||||||
* To the user the relevant error is
|
* To the user the relevant error is
|
||||||
@ -2670,7 +2671,7 @@ static int files_rename_ref(struct ref_store *ref_store,
|
|||||||
oldrefname);
|
oldrefname);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!rename_ref_available(oldrefname, newrefname)) {
|
if (!refs_rename_ref_available(&refs->base, oldrefname, newrefname)) {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -4054,9 +4055,9 @@ static int files_initial_transaction_commit(struct ref_store *ref_store,
|
|||||||
if ((update->flags & REF_HAVE_OLD) &&
|
if ((update->flags & REF_HAVE_OLD) &&
|
||||||
!is_null_sha1(update->old_sha1))
|
!is_null_sha1(update->old_sha1))
|
||||||
die("BUG: initial ref transaction with old_sha1 set");
|
die("BUG: initial ref transaction with old_sha1 set");
|
||||||
if (verify_refname_available(update->refname,
|
if (refs_verify_refname_available(&refs->base, update->refname,
|
||||||
&affected_refnames, NULL,
|
&affected_refnames, NULL,
|
||||||
err)) {
|
err)) {
|
||||||
ret = TRANSACTION_NAME_CONFLICT;
|
ret = TRANSACTION_NAME_CONFLICT;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -111,28 +111,6 @@ enum peel_status {
|
|||||||
*/
|
*/
|
||||||
enum peel_status peel_object(const unsigned char *name, unsigned char *sha1);
|
enum peel_status peel_object(const unsigned char *name, unsigned char *sha1);
|
||||||
|
|
||||||
/*
|
|
||||||
* Return 0 if a reference named refname could be created without
|
|
||||||
* conflicting with the name of an existing reference. Otherwise,
|
|
||||||
* return a negative value and write an explanation to err. If extras
|
|
||||||
* is non-NULL, it is a list of additional refnames with which refname
|
|
||||||
* is not allowed to conflict. If skip is non-NULL, ignore potential
|
|
||||||
* conflicts with refs in skip (e.g., because they are scheduled for
|
|
||||||
* deletion in the same operation). Behavior is undefined if the same
|
|
||||||
* name is listed in both extras and skip.
|
|
||||||
*
|
|
||||||
* Two reference names conflict if one of them exactly matches the
|
|
||||||
* leading components of the other; e.g., "foo/bar" conflicts with
|
|
||||||
* both "foo" and with "foo/bar/baz" but not with "foo/bar" or
|
|
||||||
* "foo/barbados".
|
|
||||||
*
|
|
||||||
* extras and skip must be sorted.
|
|
||||||
*/
|
|
||||||
int verify_refname_available(const char *newname,
|
|
||||||
const struct string_list *extras,
|
|
||||||
const struct string_list *skip,
|
|
||||||
struct strbuf *err);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the reflog message msg to buf, which has been allocated sufficiently
|
* Copy the reflog message msg to buf, which has been allocated sufficiently
|
||||||
* large, while cleaning up the whitespaces. Especially, convert LF to space,
|
* large, while cleaning up the whitespaces. Especially, convert LF to space,
|
||||||
@ -252,7 +230,9 @@ const char *find_descendant_ref(const char *dirname,
|
|||||||
* processes (though rename_ref() catches some races that might get by
|
* processes (though rename_ref() catches some races that might get by
|
||||||
* this check).
|
* this check).
|
||||||
*/
|
*/
|
||||||
int rename_ref_available(const char *old_refname, const char *new_refname);
|
int refs_rename_ref_available(struct ref_store *refs,
|
||||||
|
const char *old_refname,
|
||||||
|
const char *new_refname);
|
||||||
|
|
||||||
/* We allow "recursive" symbolic refs. Only within reason, though */
|
/* We allow "recursive" symbolic refs. Only within reason, though */
|
||||||
#define SYMREF_MAXDEPTH 5
|
#define SYMREF_MAXDEPTH 5
|
||||||
@ -646,9 +626,4 @@ struct ref_store {
|
|||||||
void base_ref_store_init(struct ref_store *refs,
|
void base_ref_store_init(struct ref_store *refs,
|
||||||
const struct ref_storage_be *be);
|
const struct ref_storage_be *be);
|
||||||
|
|
||||||
const char *resolve_ref_recursively(struct ref_store *refs,
|
|
||||||
const char *refname,
|
|
||||||
int resolve_flags,
|
|
||||||
unsigned char *sha1, int *flags);
|
|
||||||
|
|
||||||
#endif /* REFS_REFS_INTERNAL_H */
|
#endif /* REFS_REFS_INTERNAL_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user