Commit 858dba58 by Vicent Marti

refs: Cleanup reference renaming

`git_futils_rmdir_r`: rename, clean up.

`git_reference_rename`: cleanup. Do not use 3x4096 buffers on the stack
or things will get ugly very fast. We can reuse the same buffer.
parent b8e2db5f
...@@ -205,6 +205,14 @@ void git_futils_mmap_free(git_map *out) ...@@ -205,6 +205,14 @@ void git_futils_mmap_free(git_map *out)
p_munmap(out); p_munmap(out);
} }
/* Taken from git.git */
GIT_INLINE(int) is_dot_or_dotdot(const char *name)
{
return (name[0] == '.' &&
(name[1] == '\0' ||
(name[1] == '.' && name[2] == '\0')));
}
int git_futils_direach( int git_futils_direach(
char *path, char *path,
size_t path_sz, size_t path_sz,
...@@ -301,34 +309,32 @@ int git_futils_mkdir_r(const char *path, int mode) ...@@ -301,34 +309,32 @@ int git_futils_mkdir_r(const char *path, int mode)
return GIT_SUCCESS; return GIT_SUCCESS;
} }
static int _rmdir_recurs_foreach(void *force_removal_of_non_empty_directory, char *path) static int _rmdir_recurs_foreach(void *opaque, char *path)
{ {
int error = GIT_SUCCESS; int error = GIT_SUCCESS;
int force = *(int *)opaque;
GIT_UNUSED_ARG(nil) if (git_futils_isdir(path) == GIT_SUCCESS) {
error = git_futils_isdir(path);
if (error == GIT_SUCCESS) {
size_t root_size = strlen(path); size_t root_size = strlen(path);
if ((error = git_futils_direach(path, GIT_PATH_MAX, _rmdir_recurs_foreach, force_removal_of_non_empty_directory)) < GIT_SUCCESS) if ((error = git_futils_direach(path, GIT_PATH_MAX, _rmdir_recurs_foreach, opaque)) < GIT_SUCCESS)
return git__rethrow(error, "Failed to remove directory `%s`", path); return git__rethrow(error, "Failed to remove directory `%s`", path);
path[root_size] = '\0'; path[root_size] = '\0';
return p_rmdir(path); return p_rmdir(path);
}
if (*(int *)(force_removal_of_non_empty_directory)) } else if (force) {
return p_unlink(path); return p_unlink(path);
else }
return git__rethrow(error, "Failed to remove directory. `%s` is not a directory", path);
return git__rethrow(error, "Failed to remove directory. `%s` is not empty", path);
} }
int git_futils_rmdir_recurs(const char *path, int force_removal_of_non_empty_directory) int git_futils_rmdir_r(const char *path, int force)
{ {
char p[GIT_PATH_MAX]; char p[GIT_PATH_MAX];
strncpy(p, path, GIT_PATH_MAX); strncpy(p, path, GIT_PATH_MAX);
return _rmdir_recurs_foreach(&force_removal_of_non_empty_directory, p); return _rmdir_recurs_foreach(&force, p);
} }
int git_futils_cmp_path(const char *name1, int len1, int isdir1, int git_futils_cmp_path(const char *name1, int len1, int isdir1,
......
...@@ -80,7 +80,7 @@ extern int git_futils_mkdir_r(const char *path, int mode); ...@@ -80,7 +80,7 @@ extern int git_futils_mkdir_r(const char *path, int mode);
*/ */
extern int git_futils_mkpath2file(const char *path); extern int git_futils_mkpath2file(const char *path);
extern int git_futils_rmdir_recurs(const char *path, int force_removal_of_non_empty_directory); extern int git_futils_rmdir_r(const char *path, int force);
/** /**
* Create and open a temporary file with a `_git2_` suffix * Create and open a temporary file with a `_git2_` suffix
...@@ -104,14 +104,6 @@ extern int git_futils_mv_withpath(const char *from, const char *to); ...@@ -104,14 +104,6 @@ extern int git_futils_mv_withpath(const char *from, const char *to);
*/ */
extern git_off_t git_futils_filesize(git_file fd); extern git_off_t git_futils_filesize(git_file fd);
/* Taken from git.git */
GIT_INLINE(int) is_dot_or_dotdot(const char *name)
{
return (name[0] == '.' &&
(name[1] == '\0' ||
(name[1] == '.' && name[2] == '\0')));
}
/** /**
* Read-only map all or part of a file into memory. * Read-only map all or part of a file into memory.
* When possible this function should favor a virtual memory * When possible this function should favor a virtual memory
......
...@@ -1291,10 +1291,10 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force) ...@@ -1291,10 +1291,10 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
{ {
int error; int error;
char *old_name = git__strdup(ref->name); char *old_name = git__strdup(ref->name);
char new_path[GIT_PATH_MAX];
char old_path[GIT_PATH_MAX]; char aux_path[GIT_PATH_MAX];
char old_logs[GIT_PATH_MAX];
char normalized[GIT_REFNAME_MAX]; char normalized[GIT_REFNAME_MAX];
const char *target_ref = NULL; const char *target_ref = NULL;
const char *head_target = NULL; const char *head_target = NULL;
const git_oid *target_oid = NULL; const git_oid *target_oid = NULL;
...@@ -1344,18 +1344,19 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force) ...@@ -1344,18 +1344,19 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
if ((error = packed_write(ref->owner)) < GIT_SUCCESS) if ((error = packed_write(ref->owner)) < GIT_SUCCESS)
goto rollback; goto rollback;
} else { } else {
git_path_join(old_path, ref->owner->path_repository, old_name); git_path_join(aux_path, ref->owner->path_repository, old_name);
if ((error = p_unlink(old_path)) < GIT_SUCCESS) if ((error = p_unlink(aux_path)) < GIT_SUCCESS)
goto cleanup; goto cleanup;
git_hashtable_remove(ref->owner->references.loose_cache, old_name); git_hashtable_remove(ref->owner->references.loose_cache, old_name);
} }
git_path_join(new_path, ref->owner->path_repository, new_name); /* build new path */
git_path_join(aux_path, ref->owner->path_repository, new_name);
if (git_futils_exists(new_path) == GIT_SUCCESS) { if (git_futils_exists(aux_path) == GIT_SUCCESS) {
if (git_futils_isdir(new_path) == GIT_SUCCESS) { if (git_futils_isdir(aux_path) == GIT_SUCCESS) {
if ((error = git_futils_rmdir_recurs(new_path, 0)) < GIT_SUCCESS) if ((error = git_futils_rmdir_r(aux_path, 0)) < GIT_SUCCESS)
goto rollback; goto rollback;
} else goto rollback; } else goto rollback;
} }
...@@ -1377,17 +1378,15 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force) ...@@ -1377,17 +1378,15 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
* *
*/ */
git_path_join_n(old_logs, 3, ref->owner->path_repository, "logs", old_name); git_path_join_n(aux_path, 3, ref->owner->path_repository, "logs", old_name);
if (git_futils_exists(old_logs) == GIT_SUCCESS) { if (git_futils_isfile(aux_path) == GIT_SUCCESS) {
if (git_futils_isfile(old_logs) == GIT_SUCCESS) if ((error = p_unlink(aux_path)) < GIT_SUCCESS)
if ((error = p_unlink(old_logs)) < GIT_SUCCESS) goto rollback;
goto rollback;
} }
/* /*
* Finally we can create the new reference. * Finally we can create the new reference.
*/ */
if (ref->type & GIT_REF_SYMBOLIC) { if (ref->type & GIT_REF_SYMBOLIC) {
if ((error = git_reference_create_symbolic(&new_ref, ref->owner, new_name, target_ref, 0)) < GIT_SUCCESS) if ((error = git_reference_create_symbolic(&new_ref, ref->owner, new_name, target_ref, 0)) < GIT_SUCCESS)
goto rollback; goto rollback;
......
...@@ -508,7 +508,7 @@ static int setup_empty_tmp_dir() ...@@ -508,7 +508,7 @@ static int setup_empty_tmp_dir()
BEGIN_TEST(rmdir0, "make sure empty dir can be deleted recusively") BEGIN_TEST(rmdir0, "make sure empty dir can be deleted recusively")
must_pass(setup_empty_tmp_dir()); must_pass(setup_empty_tmp_dir());
must_pass(git_futils_rmdir_recurs(empty_tmp_dir, 0)); must_pass(git_futils_rmdir_r(empty_tmp_dir, 0));
END_TEST END_TEST
BEGIN_TEST(rmdir1, "make sure non-empty dir cannot be deleted recusively") BEGIN_TEST(rmdir1, "make sure non-empty dir cannot be deleted recusively")
...@@ -520,9 +520,9 @@ BEGIN_TEST(rmdir1, "make sure non-empty dir cannot be deleted recusively") ...@@ -520,9 +520,9 @@ BEGIN_TEST(rmdir1, "make sure non-empty dir cannot be deleted recusively")
fd = p_creat(file, 0755); fd = p_creat(file, 0755);
must_pass(fd); must_pass(fd);
must_pass(p_close(fd)); must_pass(p_close(fd));
must_fail(git_futils_rmdir_recurs(empty_tmp_dir, 0)); must_fail(git_futils_rmdir_r(empty_tmp_dir, 0));
must_pass(p_unlink(file)); must_pass(p_unlink(file));
must_pass(git_futils_rmdir_recurs(empty_tmp_dir, 0)); must_pass(git_futils_rmdir_r(empty_tmp_dir, 0));
END_TEST END_TEST
BEGIN_SUITE(core) BEGIN_SUITE(core)
......
...@@ -210,7 +210,7 @@ BEGIN_TEST(add0, "add a new file to the index") ...@@ -210,7 +210,7 @@ BEGIN_TEST(add0, "add a new file to the index")
git_index_free(index); git_index_free(index);
git_repository_free(repo); git_repository_free(repo);
must_pass(git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1)); must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1));
END_TEST END_TEST
BEGIN_SUITE(index) BEGIN_SUITE(index)
......
...@@ -141,13 +141,13 @@ static int ensure_repository_init( ...@@ -141,13 +141,13 @@ static int ensure_repository_init(
goto cleanup; goto cleanup;
git_repository_free(repo); git_repository_free(repo);
git_futils_rmdir_recurs(working_directory, 1); git_futils_rmdir_r(working_directory, 1);
return GIT_SUCCESS; return GIT_SUCCESS;
cleanup: cleanup:
git_repository_free(repo); git_repository_free(repo);
git_futils_rmdir_recurs(working_directory, 1); git_futils_rmdir_r(working_directory, 1);
return GIT_ERROR; return GIT_ERROR;
} }
...@@ -193,7 +193,7 @@ BEGIN_TEST(init2, "Initialize and open a bare repo with a relative path escaping ...@@ -193,7 +193,7 @@ BEGIN_TEST(init2, "Initialize and open a bare repo with a relative path escaping
git_repository_free(repo); git_repository_free(repo);
must_pass(chdir(current_workdir)); must_pass(chdir(current_workdir));
must_pass(git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1)); must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1));
END_TEST END_TEST
#define EMPTY_BARE_REPOSITORY_NAME "empty_bare.git" #define EMPTY_BARE_REPOSITORY_NAME "empty_bare.git"
...@@ -210,7 +210,7 @@ BEGIN_TEST(open0, "Open a bare repository that has just been initialized by git" ...@@ -210,7 +210,7 @@ BEGIN_TEST(open0, "Open a bare repository that has just been initialized by git"
must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) == NULL); must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) == NULL);
git_repository_free(repo); git_repository_free(repo);
must_pass(git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1)); must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1));
END_TEST END_TEST
#define SOURCE_EMPTY_REPOSITORY_NAME "empty_standard_repo/.gitted" #define SOURCE_EMPTY_REPOSITORY_NAME "empty_standard_repo/.gitted"
...@@ -229,7 +229,7 @@ BEGIN_TEST(open1, "Open a standard repository that has just been initialized by ...@@ -229,7 +229,7 @@ BEGIN_TEST(open1, "Open a standard repository that has just been initialized by
must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) != NULL); must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) != NULL);
git_repository_free(repo); git_repository_free(repo);
must_pass(git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1)); must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1));
END_TEST END_TEST
...@@ -257,7 +257,7 @@ BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of t ...@@ -257,7 +257,7 @@ BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of t
git_repository_free(repo); git_repository_free(repo);
must_pass(chdir(current_workdir)); must_pass(chdir(current_workdir));
must_pass(git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1)); must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1));
END_TEST END_TEST
BEGIN_TEST(empty0, "test if a repository is empty or not") BEGIN_TEST(empty0, "test if a repository is empty or not")
...@@ -446,7 +446,7 @@ BEGIN_TEST(discover0, "test discover") ...@@ -446,7 +446,7 @@ BEGIN_TEST(discover0, "test discover")
must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path));
must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path));
must_pass(git_futils_rmdir_recurs(DISCOVER_FOLDER, 1)); must_pass(git_futils_rmdir_r(DISCOVER_FOLDER, 1));
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
......
...@@ -227,7 +227,7 @@ int open_temp_repo(git_repository **repo, const char *path) ...@@ -227,7 +227,7 @@ int open_temp_repo(git_repository **repo, const char *path)
void close_temp_repo(git_repository *repo) void close_temp_repo(git_repository *repo)
{ {
git_repository_free(repo); git_repository_free(repo);
git_futils_rmdir_recurs(TEMP_REPO_FOLDER, 1); git_futils_rmdir_r(TEMP_REPO_FOLDER, 1);
} }
static int remove_placeholders_recurs(void *filename, char *path) static int remove_placeholders_recurs(void *filename, char *path)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment