Export a generic is_refname_available() function. We will need this as a public shared function later when we add additional refs backends since we want to keep using the same rules for ref naming across all backends. Signed-off-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> --- refs.c | 29 ++++++++++++++++++----------- refs.h | 6 ++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/refs.c b/refs.c index 7e13c0f..4a22513 100644 --- a/refs.c +++ b/refs.c @@ -830,9 +830,9 @@ static int name_conflict_fn(struct ref_entry *entry, void *cb_data) * operation). skip contains a list of refs we want to skip checking for * conflicts with. */ -static int is_refname_available(const char *refname, - struct ref_dir *dir, - const char **skip, int skipnum) +static int is_refname_available_dir(const char *refname, + struct ref_dir *dir, + const char **skip, int skipnum) { struct name_conflict_cb data; data.refname = refname; @@ -1238,6 +1238,18 @@ static struct ref_dir *get_loose_refs(struct ref_cache *refs) return get_ref_dir(refs->loose); } +int is_refname_available(const char *refname, const char **skip, int skipnum) +{ + if (!is_refname_available_dir(refname, get_packed_refs(&ref_cache), + skip, skipnum)) + return 0; + + if (!is_refname_available_dir(refname, get_loose_refs(&ref_cache), + skip, skipnum)) + return 0; + return 1; +} + /* We allow "recursive" symbolic refs. Only within reason, though */ #define MAXDEPTH 5 #define MAXREFLEN (1024) @@ -2168,8 +2180,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, * name is a proper prefix of our refname. */ if (missing && - !is_refname_available(refname, get_packed_refs(&ref_cache), - skip, skipnum)) { + !is_refname_available_dir(refname, get_packed_refs(&ref_cache), + skip, skipnum)) { last_errno = ENOTDIR; goto error_return; } @@ -2676,12 +2688,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms return 1; } - if (!is_refname_available(newrefname, get_packed_refs(&ref_cache), - &oldrefname, 1)) - return 1; - - if (!is_refname_available(newrefname, get_loose_refs(&ref_cache), - &oldrefname, 1)) + if (!is_refname_available(newrefname, &oldrefname, 1)) return 1; log = reflog_exists(oldrefname); diff --git a/refs.h b/refs.h index f44b5c8..d526da0 100644 --- a/refs.h +++ b/refs.h @@ -131,6 +131,12 @@ extern int ref_exists(const char *); extern int is_branch(const char *refname); /* + * Check that a particular refname is available for creation. skip contains + * a list of refnames to exclude from the refname collision tests. + */ +int is_refname_available(const char *refname, const char **skip, int skipnum); + +/* * If refname is a non-symbolic reference that refers to a tag object, * and the tag can be (recursively) dereferenced to a non-tag object, * store the SHA1 of the referred-to object to sha1 and return 0. If -- 2.0.1.556.g3edca4c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html