git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 18/24] refs: add new ref-store api

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 22, 2017, 14:04 UTC
Message-ID
<20170222140450.30886-19-pclouds@gmail.com>
In-Reply-To
<20170222140450.30886-1-pclouds@gmail.com>

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>
---
 refs.c               | 235 +++++++++++++++++++++++++++++++++++++--------------
 refs.h               |  71 ++++++++++++++++
 refs/files-backend.c |  13 +--
 refs/refs-internal.h |  31 +------
 4 files changed, 253 insertions(+), 97 deletions(-)
diff --git a/refs.c b/refs.c
index 7843d3085..9137ac283 100644
--- a/refs.c
+++ b/refs.c
@@ -185,13 +185,20 @@ struct ref_filter {
 	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 -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)
 {
 	return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
@@ -286,34 +293,52 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li
 	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)
 {
-	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)
 {
-	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)
 {
-	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)
 {
-	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)
 {
-	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)
 {
-	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)
@@ -1120,14 +1145,17 @@ const char *find_descendant_ref(const char *dirname,
 	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 strbuf err = STRBUF_INIT;
 	int ok;
 
 	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)
 		error("%s", err.buf);
 
@@ -1168,10 +1196,9 @@ int head_ref(each_ref_fn fn, void *cb_data)
  * non-zero value, stop the iteration and return that value;
  * 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)
 {
-	struct ref_store *refs = get_submodule_ref_store(submodule);
 	struct ref_iterator *iter;
 
 	if (!refs)
@@ -1183,19 +1210,30 @@ static int do_for_each_ref(const char *submodule, const char *prefix,
 	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)
 {
-	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)
 {
-	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)
 {
-	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)
@@ -1204,19 +1242,23 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsig
 
 	if (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,
-		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)
 {
-	return do_for_each_ref(NULL, git_replace_ref_base, fn,
-			       strlen(git_replace_ref_base), 0, cb_data);
+	return do_for_each_ref(get_main_ref_store(),
+			       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)
@@ -1224,19 +1266,25 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
 	struct strbuf buf = STRBUF_INIT;
 	int ret;
 	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);
 	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);
 }
 
+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 */
-const char *resolve_ref_recursively(struct ref_store *refs,
+const char *refs_resolve_ref_unsafe(struct ref_store *refs,
 				    const char *refname,
 				    int resolve_flags,
 				    unsigned char *sha1, int *flags)
@@ -1323,7 +1371,7 @@ int refs_init_db(struct strbuf *err)
 const char *resolve_ref_unsafe(const char *refname, int resolve_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);
 }
 
@@ -1353,7 +1401,7 @@ int resolve_gitlink_ref(const char *submodule, const char *refname,
 	if (!refs)
 		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))
 		return -1;
 	return 0;
@@ -1511,27 +1559,42 @@ void base_ref_store_init(struct ref_store *refs,
 }
 
 /* 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)
 {
-	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)
 {
-	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,
 		  const char *logmsg)
 {
-	struct ref_store *refs = get_main_ref_store();
-
-	return refs->be->create_symref(refs, ref_target, refs_heads_master,
-				       logmsg);
+	return refs_create_symref(get_main_ref_store(), ref_target,
+				  refs_heads_master, logmsg);
 }
 
 int ref_transaction_commit(struct ref_transaction *transaction,
@@ -1542,19 +1605,17 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 	return refs->be->transaction_commit(refs, transaction, err);
 }
 
-int verify_refname_available(const char *refname,
-			     const struct string_list *extra,
-			     const struct string_list *skip,
-			     struct strbuf *err)
+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)
 {
-	struct ref_store *refs = get_main_ref_store();
-
 	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;
 
 	iter = refs->be->reflog_iterator_begin(refs);
@@ -1562,43 +1623,84 @@ int for_each_reflog(each_ref_fn fn, void *cb_data)
 	return do_for_each_ref_iterator(iter, fn, cb_data);
 }
 
-int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
-				void *cb_data)
+int for_each_reflog(each_ref_fn fn, void *cb_data)
 {
-	struct ref_store *refs = get_main_ref_store();
+	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,
+				void *cb_data)
+{
+	return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
+						refname, fn, cb_data);
+}
+
+int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
+			     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,
 			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)
 {
-	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,
 		       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)
 {
-	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,
@@ -1608,11 +1710,10 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
 		  reflog_expiry_cleanup_fn cleanup_fn,
 		  void *policy_cb_data)
 {
-	struct ref_store *refs = get_main_ref_store();
-
-	return refs->be->reflog_expire(refs, refname, sha1, flags,
-				       prepare_fn, should_prune_fn,
-				       cleanup_fn, policy_cb_data);
+	return refs_reflog_expire(get_main_ref_store(),
+				  refname, sha1, flags,
+				  prepare_fn, should_prune_fn,
+				  cleanup_fn, policy_cb_data);
 }
 
 int initial_ref_transaction_commit(struct ref_transaction *transaction,
@@ -1623,16 +1724,24 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
 	return refs->be->initial_transaction_commit(refs, transaction, err);
 }
 
-int delete_refs(struct string_list *refnames, unsigned int flags)
+int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
+		     unsigned int flags)
 {
-	struct ref_store *refs = get_main_ref_store();
-
 	return refs->be->delete_refs(refs, refnames, flags);
 }
 
-int rename_ref(const char *oldref, const char *newref, const char *logmsg)
+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);
+}
 
+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)
+{
+	return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
+}
diff --git a/refs.h b/refs.h
index 2efba6ba9..70d4eb87c 100644
--- a/refs.h
+++ b/refs.h
@@ -58,16 +58,47 @@ struct string_list;
 #define RESOLVE_REF_NO_RECURSE 0x02
 #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,
 			       unsigned char *sha1, int *flags);
 
 char *resolve_refdup(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);
 int read_ref_full(const char *refname, int resolve_flags,
 		  unsigned char *sha1, int *flags);
 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 should_autocreate_reflog(const char *refname);
@@ -84,6 +115,8 @@ extern int refs_init_db(struct strbuf *err);
  * Symbolic references are considered unpeelable, even if they
  * 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);
 
 /**
@@ -196,6 +229,17 @@ typedef int each_ref_fn(const char *refname,
  * modifies the reference also returns a nonzero value to immediately
  * 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 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);
@@ -225,6 +269,7 @@ int head_ref_namespaced(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 */
+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);
 
 static inline const char *has_glob_specials(const char *pattern)
@@ -248,6 +293,7 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt,
  * Write a packed-refs file for the current repository.
  * 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);
 
 /*
@@ -263,6 +309,8 @@ int pack_refs(unsigned int flags);
 /*
  * 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);
 
 /** Reads log for the value of ref during at_time. **/
@@ -272,6 +320,7 @@ int read_ref_at(const char *refname, unsigned int flags,
 		unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
 
 /** Check if a particular reflog exists */
+int refs_reflog_exists(struct ref_store *refs, const char *refname);
 int reflog_exists(const char *refname);
 
 /*
@@ -290,9 +339,12 @@ int delete_ref(const char *refname, const unsigned char *old_sha1,
  * an all-or-nothing transaction). flags is passed through to
  * 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);
 
 /** Delete a reflog */
+int refs_delete_reflog(struct ref_store *refs, const char *refname);
 int delete_reflog(const char *refname);
 
 /* iterate over reflog entries */
@@ -301,6 +353,12 @@ typedef int each_reflog_ent_fn(
 		const char *committer, unsigned long timestamp,
 		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_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data);
 
@@ -308,6 +366,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,
  * 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);
 
 #define REFNAME_ALLOW_ONELEVEL 1
@@ -328,8 +387,12 @@ const char *prettify_refname(const char *refname);
 char *shorten_unambiguous_ref(const char *refname, int strict);
 
 /** 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 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);
 
 /*
@@ -551,6 +614,14 @@ typedef void reflog_expiry_cleanup_fn(void *cb_data);
  * enum expire_reflog_flags. The three function pointers are described
  * 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,
 		  unsigned int flags,
 		  reflog_expiry_prepare_fn prepare_fn,
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 474d1027c..dafddefd3 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1320,7 +1320,7 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
 					 create_dir_entry(refs, refname.buf,
 							  refname.len, 1));
 		} else {
-			if (!resolve_ref_recursively(&refs->base,
+			if (!refs_resolve_ref_unsafe(&refs->base,
 						     refname.buf,
 						     RESOLVE_REF_READING,
 						     sha1, &flag)) {
@@ -1629,7 +1629,8 @@ static int lock_raw_ref(struct files_ref_store *refs,
 		 * another reference such as "refs/foo". There is no
 		 * 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) {
 				/*
 				 * To the user the relevant error is
@@ -2671,7 +2672,7 @@ static int files_rename_ref(struct ref_store *ref_store,
 	if (flag & REF_ISSYMREF)
 		return error("refname %s is a symbolic ref, renaming it is not supported",
 			oldrefname);
-	if (!rename_ref_available(oldrefname, newrefname))
+	if (!refs_rename_ref_available(&refs->base, oldrefname, newrefname))
 		return 1;
 
 	files_reflog_path(refs, &sb_oldref, oldrefname);
@@ -4055,9 +4056,9 @@ static int files_initial_transaction_commit(struct ref_store *ref_store,
 		if ((update->flags & REF_HAVE_OLD) &&
 		    !is_null_sha1(update->old_sha1))
 			die("BUG: initial ref transaction with old_sha1 set");
-		if (verify_refname_available(update->refname,
-					     &affected_refnames, NULL,
-					     err)) {
+		if (refs_verify_refname_available(&refs->base, update->refname,
+						  &affected_refnames, NULL,
+						  err)) {
 			ret = TRANSACTION_NAME_CONFLICT;
 			goto cleanup;
 		}
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index f20dde39e..5f26208c2 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -112,28 +112,6 @@ enum peel_status {
 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
  * large, while cleaning up the whitespaces.  Especially, convert LF to space,
  * because reflog file is one line per entry.
@@ -252,7 +230,9 @@ const char *find_descendant_ref(const char *dirname,
  * processes (though rename_ref() catches some races that might get by
  * 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 */
 #define SYMREF_MAXDEPTH 5
@@ -646,9 +626,4 @@ struct ref_store {
 void base_ref_store_init(struct ref_store *refs,
 			 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 */
-- 
2.11.0.157.gd943d85
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 139 of 250 in “Remove submodule from files-backend.c”
  1. 00/11 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Feb 13, 2017
  2. 03/11 files-backend: add files_path()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  3. Ramsay JonesFeb 13, 2017
  4. 02/11 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  5. Ramsay JonesFeb 13, 2017
  6. 01/11 refs-internal.c: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Feb 13, 2017
  7. Ramsay JonesFeb 13, 2017
  8. Duy NguyenFeb 14, 2017
  9. 04/11 files-backend: replace *git_path*() with files_path()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  10. Ramsay JonesFeb 13, 2017
  11. Duy NguyenFeb 14, 2017
  12. 06/11 refs-internal.h: correct is_per_worktree_ref()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  13. Stefan BellerFeb 13, 2017
  14. Duy NguyenFeb 14, 2017
  15. Stefan BellerFeb 14, 2017
  16. 07/11 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  17. Stefan BellerFeb 13, 2017
  18. Duy NguyenFeb 14, 2017
  19. 05/11 refs.c: share is_per_worktree_ref() to files-backend.cNguyễn Thái Ngọc Duy, Feb 13, 2017
  20. 09/11 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Feb 13, 2017
  21. Stefan BellerFeb 13, 2017
  22. Duy NguyenFeb 14, 2017
  23. 10/11 files-backend: remove submodule_allowed from files_downcast()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  24. Stefan BellerFeb 13, 2017
  25. 11/11 refs: split and make get_*_ref_store() public APINguyễn Thái Ngọc Duy, Feb 13, 2017
  26. Stefan BellerFeb 13, 2017
  27. Duy NguyenFeb 14, 2017
  28. Junio C HamanoFeb 14, 2017
  29. Duy NguyenFeb 15, 2017
  30. Junio C HamanoFeb 15, 2017
  31. Stefan BellerFeb 14, 2017
  32. 08/11 refs.c: factor submodule code out of get_ref_store()Nguyễn Thái Ngọc Duy, Feb 13, 2017
  33. Stefan BellerFeb 13, 2017
  34. 00/16 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Feb 16, 2017
  35. 01/16 refs-internal.c: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Feb 16, 2017
  36. 02/16 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  37. 05/16 refs.c: share is_per_worktree_ref() to files-backend.cNguyễn Thái Ngọc Duy, Feb 16, 2017
  38. 06/16 refs-internal.h: correct is_per_worktree_ref()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  39. 03/16 files-backend: add files_path()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  40. 04/16 files-backend: replace *git_path*() with files_path()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  41. Michael HaggertyFeb 20, 2017
  42. Duy NguyenFeb 20, 2017
  43. 07/16 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  44. 08/16 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  45. 09/16 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  46. 10/16 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Feb 16, 2017
  47. 11/16 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  48. 12/16 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Feb 16, 2017
  49. 13/16 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  50. 14/16 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Feb 16, 2017
  51. 15/16 files-backend: remove submodule_allowed from files_downcast()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  52. 16/16 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Feb 16, 2017
  53. Stefan BellerFeb 16, 2017
  54. 00/16 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Feb 17, 2017
  55. 01/16 refs-internal.c: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Feb 17, 2017
  56. 02/16 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  57. 03/16 files-backend: add files_path()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  58. Junio C HamanoFeb 17, 2017
  59. 04/16 files-backend: replace *git_path*() with files_path()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  60. Junio C HamanoFeb 17, 2017
  61. 06/16 refs-internal.h: correct is_per_worktree_ref()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  62. 05/16 refs.c: share is_per_worktree_ref() to files-backend.cNguyễn Thái Ngọc Duy, Feb 17, 2017
  63. 07/16 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  64. 08/16 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  65. 09/16 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  66. 10/16 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Feb 17, 2017
  67. 11/16 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  68. Junio C HamanoFeb 17, 2017
  69. 12/16 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Feb 17, 2017
  70. 13/16 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  71. 14/16 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Feb 17, 2017
  72. 15/16 files-backend: remove submodule_allowed from files_downcast()Nguyễn Thái Ngọc Duy, Feb 17, 2017
  73. 16/16 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Feb 17, 2017
  74. 00/15 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Feb 18, 2017
  75. 01/15 refs-internal.c: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Feb 18, 2017
  76. 02/15 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  77. 03/15 files-backend: add files_path()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  78. 04/15 files-backend: replace *git_path*() with files_path()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  79. 05/15 refs.c: share is_per_worktree_ref() to files-backend.cNguyễn Thái Ngọc Duy, Feb 18, 2017
  80. 06/15 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  81. Michael HaggertyFeb 20, 2017
  82. Duy NguyenFeb 20, 2017
  83. 07/15 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  84. 08/15 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  85. 09/15 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Feb 18, 2017
  86. 10/15 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  87. 11/15 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Feb 18, 2017
  88. Michael HaggertyFeb 20, 2017
  89. 12/15 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  90. 13/15 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Feb 18, 2017
  91. 14/15 files-backend: remove submodule_allowed from files_downcast()Nguyễn Thái Ngọc Duy, Feb 18, 2017
  92. Michael HaggertyFeb 20, 2017
  93. Duy NguyenFeb 20, 2017
  94. Michael HaggertyFeb 20, 2017
  95. Duy NguyenFeb 20, 2017
  96. Michael HaggertyFeb 20, 2017
  97. Duy NguyenFeb 21, 2017
  98. 15/15 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Feb 18, 2017
  99. Michael HaggertyFeb 20, 2017
  100. Duy NguyenFeb 20, 2017
  101. 00/24 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Feb 22, 2017
  102. 01/24 refs.h: add forward declaration for structs used in this fileNguyễn Thái Ngọc Duy, Feb 22, 2017
  103. Stefan BellerFeb 22, 2017
  104. Duy NguyenFeb 23, 2017
  105. 02/24 files-backend: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Feb 22, 2017
  106. 03/24 files-backend: add and use files_packed_refs_path()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  107. 04/24 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  108. Michael HaggertyFeb 28, 2017
  109. Duy NguyenMar 2, 2017
  110. 05/24 files-backend: move "logs/" out of TMP_RENAMED_LOGNguyễn Thái Ngọc Duy, Feb 22, 2017
  111. Michael HaggertyFeb 28, 2017
  112. Duy NguyenMar 2, 2017
  113. 07/24 files-backend: add and use files_refname_path()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  114. Michael HaggertyFeb 28, 2017
  115. Duy NguyenMar 2, 2017
  116. Michael HaggertyMar 9, 2017
  117. 06/24 files-backend: add and use files_reflog_path()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  118. 08/24 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  119. Michael HaggertyFeb 28, 2017
  120. Duy NguyenMar 2, 2017
  121. 09/24 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  122. Michael HaggertyFeb 28, 2017
  123. Duy NguyenMar 1, 2017
  124. 10/24 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  125. 12/24 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  126. Michael HaggertyFeb 28, 2017
  127. Duy NguyenMar 1, 2017
  128. Michael HaggertyMar 1, 2017
  129. 11/24 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Feb 22, 2017
  130. 14/24 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  131. Michael HaggertyFeb 28, 2017
  132. 13/24 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Feb 22, 2017
  133. Michael HaggertyFeb 28, 2017
  134. 16/24 files-backend: replace submodule_allowed check in files_downcast()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  135. Michael HaggertyMar 3, 2017
  136. 15/24 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Feb 22, 2017
  137. Michael HaggertyMar 3, 2017
  138. 17/24 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Feb 22, 2017
  139. 18/24 refs: add new ref-store apiNguyễn Thái Ngọc Duy, Feb 22, 2017
  140. 19/24 refs: new transaction related ref-store apiNguyễn Thái Ngọc Duy, Feb 22, 2017
  141. Michael HaggertyMar 3, 2017
  142. 20/24 files-backend: avoid ref api targetting main ref storeNguyễn Thái Ngọc Duy, Feb 22, 2017
  143. Michael HaggertyMar 3, 2017
  144. 21/24 refs: delete pack_refs() in favor of refs_pack_refs()Nguyễn Thái Ngọc Duy, Feb 22, 2017
  145. 22/24 t/helper: add test-ref-store to test ref-store functionsNguyễn Thái Ngọc Duy, Feb 22, 2017
  146. 23/24 t1405: some basic tests on main ref storeNguyễn Thái Ngọc Duy, Feb 22, 2017
  147. Michael HaggertyMar 3, 2017
  148. Duy NguyenMar 6, 2017
  149. 24/24 t1406: new tests for submodule ref storeNguyễn Thái Ngọc Duy, Feb 22, 2017
  150. Michael HaggertyFeb 28, 2017
  151. Duy NguyenMar 1, 2017
  152. Michael HaggertyMar 1, 2017
  153. Duy NguyenMar 2, 2017
  154. Michael HaggertyMar 2, 2017
  155. Duy NguyenMar 2, 2017
  156. Michael HaggertyMar 3, 2017
  157. Junio C HamanoFeb 22, 2017
  158. Junio C HamanoFeb 22, 2017
  159. Michael HaggertyFeb 28, 2017
  160. Junio C HamanoFeb 28, 2017
  161. Michael HaggertyMar 3, 2017
  162. 00/27 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Mar 18, 2017
  163. 07/27 files-backend: move "logs/" out of TMP_RENAMED_LOGNguyễn Thái Ngọc Duy, Mar 18, 2017
  164. 05/27 files-backend: make sure files_rename_ref() always reach the endNguyễn Thái Ngọc Duy, Mar 18, 2017
  165. 10/27 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  166. 09/27 files-backend: add and use files_refname_path()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  167. Michael HaggertyMar 19, 2017
  168. 06/27 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  169. 15/27 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Mar 18, 2017
  170. 08/27 files-backend: add and use files_reflog_path()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  171. 12/27 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  172. 11/27 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  173. Michael HaggertyMar 19, 2017
  174. 14/27 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  175. 13/27 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Mar 18, 2017
  176. 23/27 refs: delete pack_refs() in favor of refs_pack_refs()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  177. 17/27 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Mar 18, 2017
  178. Michael HaggertyMar 19, 2017
  179. Duy NguyenMar 20, 2017
  180. Michael HaggertyMar 20, 2017
  181. 16/27 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  182. Michael HaggertyMar 19, 2017
  183. Duy NguyenMar 20, 2017
  184. 26/27 t1406: new tests for submodule ref storeNguyễn Thái Ngọc Duy, Mar 18, 2017
  185. Michael HaggertyMar 20, 2017
  186. Duy NguyenMar 20, 2017
  187. 22/27 files-backend: avoid ref api targetting main ref storeNguyễn Thái Ngọc Duy, Mar 18, 2017
  188. 27/27 refs.h: add a note about sorting order of for_each_ref_*Nguyễn Thái Ngọc Duy, Mar 18, 2017
  189. 25/27 t1405: some basic tests on main ref storeNguyễn Thái Ngọc Duy, Mar 18, 2017
  190. 24/27 t/helper: add test-ref-store to test ref-store functionsNguyễn Thái Ngọc Duy, Mar 18, 2017
  191. Jeff KingMar 22, 2017
  192. Jeff KingMar 22, 2017
  193. Duy NguyenMar 25, 2017
  194. 19/27 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Mar 18, 2017
  195. 21/27 refs: new transaction related ref-store apiNguyễn Thái Ngọc Duy, Mar 18, 2017
  196. 18/27 files-backend: replace submodule_allowed check in files_downcast()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  197. Michael HaggertyMar 19, 2017
  198. Duy NguyenMar 26, 2017
  199. Michael HaggertyMar 29, 2017
  200. 20/27 refs: add new ref-store apiNguyễn Thái Ngọc Duy, Mar 18, 2017
  201. 04/27 files-backend: add and use files_packed_refs_path()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  202. 02/27 files-backend: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Mar 18, 2017
  203. Michael HaggertyMar 19, 2017
  204. Ramsay JonesMar 19, 2017
  205. 01/27 refs.h: add forward declaration for structs used in this fileNguyễn Thái Ngọc Duy, Mar 18, 2017
  206. 03/27 files-backend: delete dead code in files_init_db()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  207. Michael HaggertyMar 19, 2017
  208. Michael HaggertyMar 20, 2017
  209. Junio C HamanoMar 20, 2017
  210. 00/28 Remove submodule from files-backend.cNguyễn Thái Ngọc Duy, Mar 26, 2017
  211. 01/28 refs.h: add forward declaration for structs used in this fileNguyễn Thái Ngọc Duy, Mar 26, 2017
  212. 02/28 files-backend: make files_log_ref_write() staticNguyễn Thái Ngọc Duy, Mar 26, 2017
  213. 04/28 files-backend: delete dead code in files_init_db()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  214. 03/28 files-backend.c: delete dead code in files_ref_iterator_begin()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  215. 05/28 files-backend: add and use files_packed_refs_path()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  216. 06/28 files-backend: make sure files_rename_ref() always reach the endNguyễn Thái Ngọc Duy, Mar 26, 2017
  217. 08/28 files-backend: move "logs/" out of TMP_RENAMED_LOGNguyễn Thái Ngọc Duy, Mar 26, 2017
  218. 07/28 files-backend: convert git_path() to strbuf_git_path()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  219. 10/28 files-backend: add and use files_ref_path()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  220. 09/28 files-backend: add and use files_reflog_path()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  221. 13/28 refs: rename lookup_ref_store() to lookup_submodule_ref_store()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  222. 15/28 refs.c: kill register_ref_store(), add register_submodule_ref_store()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  223. 11/28 files-backend: remove the use of git_path()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  224. 16/28 refs.c: make get_main_ref_store() public and use itNguyễn Thái Ngọc Duy, Mar 26, 2017
  225. 17/28 path.c: move some code out of strbuf_git_path_submodule()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  226. 12/28 refs.c: introduce get_main_ref_store()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  227. 14/28 refs.c: flatten get_ref_store() a bitNguyễn Thái Ngọc Duy, Mar 26, 2017
  228. 18/28 refs: move submodule code out of files-backend.cNguyễn Thái Ngọc Duy, Mar 26, 2017
  229. 19/28 files-backend: replace submodule_allowed check in files_downcast()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  230. Michael HaggertyApr 1, 2017
  231. Duy NguyenApr 7, 2017
  232. Junio C HamanoApr 14, 2017
  233. Duy NguyenApr 14, 2017
  234. 20/28 refs: rename get_ref_store() to get_submodule_ref_store() and make it publicNguyễn Thái Ngọc Duy, Mar 26, 2017
  235. 22/28 refs: new transaction related ref-store apiNguyễn Thái Ngọc Duy, Mar 26, 2017
  236. Michael HaggertyApr 1, 2017
  237. Duy NguyenApr 7, 2017
  238. 24/28 refs: delete pack_refs() in favor of refs_pack_refs()Nguyễn Thái Ngọc Duy, Mar 26, 2017
  239. 23/28 files-backend: avoid ref api targetting main ref storeNguyễn Thái Ngọc Duy, Mar 26, 2017
  240. Michael HaggertyApr 1, 2017
  241. 21/28 refs: add new ref-store apiNguyễn Thái Ngọc Duy, Mar 26, 2017
  242. 26/28 t1405: some basic tests on main ref storeNguyễn Thái Ngọc Duy, Mar 26, 2017
  243. 28/28 refs.h: add a note about sorting order of for_each_ref_*Nguyễn Thái Ngọc Duy, Mar 26, 2017
  244. 25/28 t/helper: add test-ref-store to test ref-store functionsNguyễn Thái Ngọc Duy, Mar 26, 2017
  245. 27/28 t1406: new tests for submodule ref storeNguyễn Thái Ngọc Duy, Mar 26, 2017
  246. Michael HaggertyApr 1, 2017
  247. Junio C HamanoApr 11, 2017
  248. Junio C HamanoFeb 17, 2017
  249. Junio C HamanoFeb 17, 2017
  250. Duy NguyenFeb 18, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.