refs.c: remove_empty_directories can take a strbuf
The first thing we do in this function is copy the input into a strbuf. Of the 4 callers, 3 of them already have a strbuf we could use. Let's just take the strbuf, and convert the remaining caller to use a strbuf, rather than a raw git_path. This is safer, anyway, as remove_dir_recursively is a non-trivial function that might use the pathname buffers itself (this is _probably_ OK, as the likely culprit would be calling resolve_gitlink_ref, but we do not pass the proper flags to ask it to avoid blowing away gitlinks). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5f8ef5b848
commit
470e28d4e1
34
refs.c
34
refs.c
@ -2290,25 +2290,14 @@ static int verify_lock(struct ref_lock *lock,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int remove_empty_directories(const char *file)
|
static int remove_empty_directories(struct strbuf *path)
|
||||||
{
|
{
|
||||||
/* we want to create a file but there is a directory there;
|
/*
|
||||||
|
* we want to create a file but there is a directory there;
|
||||||
* if that is an empty directory (or a directory that contains
|
* if that is an empty directory (or a directory that contains
|
||||||
* only empty directories), remove them.
|
* only empty directories), remove them.
|
||||||
*/
|
*/
|
||||||
struct strbuf path;
|
return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);
|
||||||
int result, save_errno;
|
|
||||||
|
|
||||||
strbuf_init(&path, 20);
|
|
||||||
strbuf_addstr(&path, file);
|
|
||||||
|
|
||||||
result = remove_dir_recursively(&path, REMOVE_DIR_EMPTY_ONLY);
|
|
||||||
save_errno = errno;
|
|
||||||
|
|
||||||
strbuf_release(&path);
|
|
||||||
errno = save_errno;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2440,7 +2429,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
|
|||||||
* to remain.
|
* to remain.
|
||||||
*/
|
*/
|
||||||
strbuf_git_path(&orig_ref_file, "%s", orig_refname);
|
strbuf_git_path(&orig_ref_file, "%s", orig_refname);
|
||||||
if (remove_empty_directories(orig_ref_file.buf)) {
|
if (remove_empty_directories(&orig_ref_file)) {
|
||||||
last_errno = errno;
|
last_errno = errno;
|
||||||
if (!verify_refname_available(orig_refname, extras, skip,
|
if (!verify_refname_available(orig_refname, extras, skip,
|
||||||
get_loose_refs(&ref_cache), err))
|
get_loose_refs(&ref_cache), err))
|
||||||
@ -2961,7 +2950,7 @@ static int rename_tmp_log(const char *newrefname)
|
|||||||
* directory ought to result in ISDIR, but
|
* directory ought to result in ISDIR, but
|
||||||
* Solaris 5.8 gives ENOTDIR. Sheesh.
|
* Solaris 5.8 gives ENOTDIR. Sheesh.
|
||||||
*/
|
*/
|
||||||
if (remove_empty_directories(path.buf)) {
|
if (remove_empty_directories(&path)) {
|
||||||
error("Directory not empty: logs/%s", newrefname);
|
error("Directory not empty: logs/%s", newrefname);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -3046,7 +3035,14 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
|
|||||||
if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
|
if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
|
||||||
delete_ref(newrefname, sha1, REF_NODEREF)) {
|
delete_ref(newrefname, sha1, REF_NODEREF)) {
|
||||||
if (errno==EISDIR) {
|
if (errno==EISDIR) {
|
||||||
if (remove_empty_directories(git_path("%s", newrefname))) {
|
struct strbuf path = STRBUF_INIT;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
strbuf_git_path(&path, "%s", newrefname);
|
||||||
|
result = remove_empty_directories(&path);
|
||||||
|
strbuf_release(&path);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
error("Directory not empty: %s", newrefname);
|
error("Directory not empty: %s", newrefname);
|
||||||
goto rollback;
|
goto rollback;
|
||||||
}
|
}
|
||||||
@ -3183,7 +3179,7 @@ static int log_ref_setup(const char *refname, struct strbuf *logfile, struct str
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (errno == EISDIR) {
|
if (errno == EISDIR) {
|
||||||
if (remove_empty_directories(logfile->buf)) {
|
if (remove_empty_directories(logfile)) {
|
||||||
strbuf_addf(err, "There are still logs under "
|
strbuf_addf(err, "There are still logs under "
|
||||||
"'%s'", logfile->buf);
|
"'%s'", logfile->buf);
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user