diff --git a/refs.c b/refs.c index 30e505a9d3..597800a5ed 100644 --- a/refs.c +++ b/refs.c @@ -1049,8 +1049,15 @@ static int remove_empty_directories(const char *file) return result; } +/* + * Return true iff a reference named refname could be created without + * conflicting with the name of an existing reference. If oldrefname + * is non-NULL, ignore potential conflicts with oldrefname (e.g., + * because oldrefname is scheduled for deletion in the same + * operation). + */ static int is_refname_available(const char *refname, const char *oldrefname, - struct ref_array *array, int quiet) + struct ref_array *array) { int i, namlen = strlen(refname); /* e.g. 'foo/bar' */ for (i = 0; i < array->nr; i++ ) { @@ -1062,9 +1069,8 @@ static int is_refname_available(const char *refname, const char *oldrefname, const char *lead = (namlen < len) ? entry->name : refname; if (!strncmp(refname, entry->name, cmplen) && lead[cmplen] == '/') { - if (!quiet) - error("'%s' exists; cannot create '%s'", - entry->name, refname); + error("'%s' exists; cannot create '%s'", + entry->name, refname); return 0; } } @@ -1117,7 +1123,7 @@ 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, NULL, get_packed_refs(NULL), 0)) { + !is_refname_available(refname, NULL, get_packed_refs(NULL))) { last_errno = ENOTDIR; goto error_return; } @@ -1272,10 +1278,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms if (!symref) return error("refname %s not found", oldrefname); - if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL))) return 1; - if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL))) return 1; lock = lock_ref_sha1_basic(renamed_ref, NULL, 0, NULL);