From: David Turner <dturner@twopensource.com>
To: git@vger.kernel.org, mhagger@alum.mit.edu
Cc: Ronnie Sahlberg <sahlberg@google.com>,
David Turner <dturner@twitter.com>
Subject: [PATCH 01/43] refs.c: create a public version of verify_refname_available
Date: Wed, 2 Sep 2015 21:54:31 -0400 [thread overview]
Message-ID: <1441245313-11907-2-git-send-email-dturner@twopensource.com> (raw)
In-Reply-To: <1441245313-11907-1-git-send-email-dturner@twopensource.com>
From: Ronnie Sahlberg <sahlberg@google.com>
Create a public version of verify_refname_available that backends can
provide.
Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Signed-off-by: David Turner <dturner@twitter.com>
---
refs.c | 53 ++++++++++++++++++++++++++++++-----------------------
refs.h | 17 +++++++++++++++++
2 files changed, 47 insertions(+), 23 deletions(-)
diff --git a/refs.c b/refs.c
index 8857c02..76b05f1 100644
--- a/refs.c
+++ b/refs.c
@@ -279,7 +279,7 @@ struct ref_dir {
* presence of an empty subdirectory does not block the creation of a
* similarly-named reference. (The fact that reference names with the
* same leading components can conflict *with each other* is a
- * separate issue that is regulated by verify_refname_available().)
+ * separate issue that is regulated by verify_refname_available_dir().)
*
* Please note that the name field contains the fully-qualified
* reference (or subdirectory) name. Space could be saved by only
@@ -911,11 +911,11 @@ static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
*
* extras and skip must be sorted.
*/
-static int verify_refname_available(const char *refname,
- const struct string_list *extras,
- const struct string_list *skip,
- struct ref_dir *dir,
- struct strbuf *err)
+static int verify_refname_available_dir(const char *refname,
+ const struct string_list *extras,
+ const struct string_list *skip,
+ struct ref_dir *dir,
+ struct strbuf *err)
{
const char *slash;
int pos;
@@ -2462,9 +2462,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
*/
strbuf_git_path(&orig_ref_file, "%s", orig_refname);
if (remove_empty_directories(&orig_ref_file)) {
+ struct ref_dir *loose_refs;
+ loose_refs = get_loose_refs(&ref_cache);
last_errno = errno;
- if (!verify_refname_available(orig_refname, extras, skip,
- get_loose_refs(&ref_cache), err))
+ if (!verify_refname_available_dir(orig_refname, extras,
+ skip, loose_refs,
+ err))
strbuf_addf(err, "there are still refs under '%s'",
orig_refname);
goto error_return;
@@ -2477,8 +2480,9 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
if (!refname) {
last_errno = errno;
if (last_errno != ENOTDIR ||
- !verify_refname_available(orig_refname, extras, skip,
- get_loose_refs(&ref_cache), err))
+ !verify_refname_available_dir(orig_refname, extras, skip,
+ get_loose_refs(&ref_cache),
+ err))
strbuf_addf(err, "unable to resolve reference %s: %s",
orig_refname, strerror(last_errno));
@@ -2491,8 +2495,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
* our refname.
*/
if (is_null_oid(&lock->old_oid) &&
- verify_refname_available(refname, extras, skip,
- get_packed_refs(&ref_cache), err)) {
+ verify_refname_available_dir(refname, extras, skip,
+ get_packed_refs(&ref_cache), err)) {
last_errno = ENOTDIR;
goto error_return;
}
@@ -2827,7 +2831,7 @@ int pack_refs(unsigned int flags)
*
* The refs in 'refnames' needn't be sorted. `err` must not be NULL.
*/
-static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
+int repack_without_refs(struct string_list *refnames, struct strbuf *err)
{
struct ref_dir *packed;
struct string_list_item *refname;
@@ -3125,10 +3129,7 @@ static int rename_ref_available(const char *oldname, const char *newname)
int ret;
string_list_insert(&skip, oldname);
- ret = !verify_refname_available(newname, NULL, &skip,
- get_packed_refs(&ref_cache), &err)
- && !verify_refname_available(newname, NULL, &skip,
- get_loose_refs(&ref_cache), &err);
+ ret = !verify_refname_available(newname, NULL, &skip, &err);
if (!ret)
error("%s", err.buf);
@@ -3297,6 +3298,17 @@ static int should_autocreate_reflog(const char *refname)
!strcmp(refname, "HEAD");
}
+int verify_refname_available(const char *newname, struct string_list *extra,
+ struct string_list *skip, struct strbuf *err)
+{
+ struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
+ struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
+ return verify_refname_available_dir(newname, extra, skip,
+ packed_refs, err) ||
+ verify_refname_available_dir(newname, extra, skip,
+ loose_refs, err);
+}
+
/*
* Create a reflog for a ref. If force_create = 0, the reflog will
* only be created for certain refs (those for which
@@ -4332,8 +4344,6 @@ static int ref_present(const char *refname,
int initial_ref_transaction_commit(struct ref_transaction *transaction,
struct strbuf *err)
{
- struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
- struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
int ret = 0, i;
int n = transaction->nr;
struct ref_update **updates = transaction->updates;
@@ -4376,10 +4386,7 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
die("BUG: initial ref transaction with old_sha1 set");
if (verify_refname_available(update->refname,
&affected_refnames, NULL,
- loose_refs, err) ||
- verify_refname_available(update->refname,
- &affected_refnames, NULL,
- packed_refs, err)) {
+ err)) {
ret = TRANSACTION_NAME_CONFLICT;
goto cleanup;
}
diff --git a/refs.h b/refs.h
index 6e913ee..140aa8b 100644
--- a/refs.h
+++ b/refs.h
@@ -218,6 +218,23 @@ extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct st
int pack_refs(unsigned int flags);
/*
+ * Return true iff a reference named refname could be created without
+ * conflicting with the name of an existing reference. If
+ * skip is non-NULL, ignore potential conflicts with refs in skip
+ * (e.g., because they are scheduled for deletion in the same
+ * operation).
+ *
+ * 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".
+ *
+ * skip must be sorted.
+ */
+int verify_refname_available(const char *newname, struct string_list *extra,
+ struct string_list *skip, struct strbuf *err);
+
+/*
* Flags controlling ref_transaction_update(), ref_transaction_create(), etc.
* REF_NODEREF: act on the ref directly, instead of dereferencing
* symbolic references.
--
2.0.4.315.gad8727a-twtrsrc
next prev parent reply other threads:[~2015-09-03 1:55 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-03 1:54 [PATCH 00/43] refs lmdb backend David Turner
2015-09-03 1:54 ` David Turner [this message]
2015-09-03 23:08 ` [PATCH 01/43] refs.c: create a public version of verify_refname_available Junio C Hamano
2015-09-04 15:45 ` David Turner
2015-09-03 1:54 ` [PATCH 02/43] refs: make repack_without_refs and is_branch public David Turner
2015-09-03 1:54 ` [PATCH 04/43] refs.c: add a new refs.c file to hold all common refs code David Turner
2015-09-03 1:54 ` [PATCH 05/43] refs.c: move update_ref to refs.c David Turner
2015-09-03 1:54 ` [PATCH 06/43] refs.c: move delete_ref and delete_refs to the common code David Turner
2015-09-03 1:54 ` [PATCH 07/43] refs.c: move read_ref_at to the common refs file David Turner
2015-09-03 1:54 ` [PATCH 08/43] refs.c: move the hidden refs functions to the common code David Turner
2015-09-03 1:54 ` [PATCH 09/43] refs.c: move dwim and friend functions to the common refs code David Turner
2015-09-03 1:54 ` [PATCH 10/43] refs.c: move warn_if_dangling_symref* to the common code David Turner
2015-09-03 1:54 ` [PATCH 11/43] refs.c: move read_ref, read_ref_full and ref_exists " David Turner
2015-09-03 1:54 ` [PATCH 12/43] refs.c: move resolve_refdup to common David Turner
2015-09-03 1:54 ` [PATCH 13/43] refs.c: move check_refname_format to the common code David Turner
2015-09-03 1:54 ` [PATCH 14/43] refs.c: move is_branch " David Turner
2015-09-03 1:54 ` [PATCH 15/43] refs.c: move prettify_refname " David Turner
2015-09-03 1:54 ` [PATCH 16/43] refs.c: move ref iterators " David Turner
2015-09-03 1:54 ` [PATCH 17/43] refs.c: move head_ref_namespaced " David Turner
2015-09-03 1:54 ` [PATCH 18/43] refs-be-files.c: add a backend method structure with transaction functions David Turner
2015-09-03 1:54 ` [PATCH 19/43] refs-be-files.c: add methods for misc ref operations David Turner
2015-09-03 1:54 ` [PATCH 20/43] refs-be-files.c: add methods for the ref iterators David Turner
2015-09-25 20:54 ` Junio C Hamano
2015-09-25 21:28 ` David Turner
2015-09-25 21:33 ` Junio C Hamano
2015-09-03 1:54 ` [PATCH 21/43] refs-be-files.c: add method for for_each_reftype_ David Turner
2015-09-03 1:54 ` [PATCH 22/43] refs-be-files.c: add do_for_each_per_worktree_ref David Turner
2015-09-03 1:54 ` [PATCH 23/43] refs.c: move refname_is_safe to the common code David Turner
2015-09-03 1:54 ` [PATCH 24/43] refs.h: document make refname_is_safe and add it to header David Turner
2015-09-03 2:06 ` David Turner
2015-09-03 1:54 ` [PATCH 25/43] refs.c: move copy_msg to the common code David Turner
2015-09-03 1:54 ` [PATCH 26/43] refs.c: move peel_object " David Turner
2015-09-03 1:54 ` [PATCH 27/43] refs.c: move should_autocreate_reflog to " David Turner
2015-09-03 1:54 ` [PATCH 28/43] refs.c: add ref backend init function David Turner
2015-09-03 1:54 ` [PATCH 29/43] refs.c: add methods for reflog David Turner
2015-09-03 1:55 ` [PATCH 30/43] refs.c: add method for initial ref transaction commit David Turner
2015-09-03 1:55 ` [PATCH 31/43] initdb: move safe_create_dir into common code David Turner
2015-09-03 1:55 ` [PATCH 32/43] refs.c: add method for initializing refs db David Turner
2015-09-03 1:55 ` [PATCH 33/43] refs.c: make struct ref_transaction generic David Turner
2015-09-03 1:55 ` [PATCH 34/43] refs-be-files.c: add method to rename refs David Turner
2015-09-03 1:55 ` [PATCH 35/43] refs-be-files.c: add method to expire reflogs David Turner
2015-09-03 1:55 ` [PATCH 36/43] run-command: track total number of commands run David Turner
2015-09-03 1:55 ` [PATCH 37/43] refs: move some defines from refs-be-files.c to refs.h David Turner
2015-09-03 1:55 ` [PATCH 38/43] refs: make some files backend functions public David Turner
2015-09-03 1:55 ` [PATCH 39/43] refs: break out a ref conflict check David Turner
2015-09-03 1:55 ` [PATCH 40/43] refs: allow ref backend to be set for clone David Turner
2015-09-03 1:55 ` [PATCH 41/43] refs: add register_refs_backend David Turner
2015-09-03 1:55 ` [PATCH 42/43] refs: add LMDB refs backend David Turner
2015-09-03 23:16 ` Junio C Hamano
2015-09-03 1:55 ` [PATCH 43/43] refs: tests for db backend David Turner
2015-09-03 23:10 ` [PATCH 00/43] refs lmdb backend Junio C Hamano
2015-09-04 16:01 ` David Turner
2015-09-17 0:09 ` David Turner
2015-09-17 16:33 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1441245313-11907-2-git-send-email-dturner@twopensource.com \
--to=dturner@twopensource.com \
--cc=dturner@twitter.com \
--cc=git@vger.kernel.org \
--cc=mhagger@alum.mit.edu \
--cc=sahlberg@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).