summaryrefslogtreecommitdiff
path: root/src/refs.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-07-06 18:08:13 +0200
committerVicent Marti <tanoku@gmail.com>2011-07-06 18:08:13 +0200
commit858dba58bf6eaaf1293ec0da03a02f95f8f2e0b9 (patch)
tree2aca041ca299d93ce5add3a16485fe1a41d49469 /src/refs.c
parentb8e2db5f94d2a5d93bb4a328cbff5c26f65a5ebb (diff)
downloadlibgit2-858dba58bf6eaaf1293ec0da03a02f95f8f2e0b9.tar.gz
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.
Diffstat (limited to 'src/refs.c')
-rw-r--r--src/refs.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/refs.c b/src/refs.c
index 94a7a15c1..84224e88e 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -1291,10 +1291,10 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
{
int error;
char *old_name = git__strdup(ref->name);
- char new_path[GIT_PATH_MAX];
- char old_path[GIT_PATH_MAX];
- char old_logs[GIT_PATH_MAX];
+
+ char aux_path[GIT_PATH_MAX];
char normalized[GIT_REFNAME_MAX];
+
const char *target_ref = NULL;
const char *head_target = NULL;
const git_oid *target_oid = NULL;
@@ -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)
goto rollback;
} else {
- git_path_join(old_path, ref->owner->path_repository, old_name);
- if ((error = p_unlink(old_path)) < GIT_SUCCESS)
+ git_path_join(aux_path, ref->owner->path_repository, old_name);
+ if ((error = p_unlink(aux_path)) < GIT_SUCCESS)
goto cleanup;
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_isdir(new_path) == GIT_SUCCESS) {
- if ((error = git_futils_rmdir_recurs(new_path, 0)) < GIT_SUCCESS)
+ if (git_futils_exists(aux_path) == GIT_SUCCESS) {
+ if (git_futils_isdir(aux_path) == GIT_SUCCESS) {
+ if ((error = git_futils_rmdir_r(aux_path, 0)) < GIT_SUCCESS)
goto rollback;
} else goto rollback;
}
@@ -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);
- if (git_futils_exists(old_logs) == GIT_SUCCESS) {
- if (git_futils_isfile(old_logs) == GIT_SUCCESS)
- if ((error = p_unlink(old_logs)) < GIT_SUCCESS)
- goto rollback;
+ git_path_join_n(aux_path, 3, ref->owner->path_repository, "logs", old_name);
+ if (git_futils_isfile(aux_path) == GIT_SUCCESS) {
+ if ((error = p_unlink(aux_path)) < GIT_SUCCESS)
+ goto rollback;
}
/*
* Finally we can create the new reference.
*/
-
if (ref->type & GIT_REF_SYMBOLIC) {
if ((error = git_reference_create_symbolic(&new_ref, ref->owner, new_name, target_ref, 0)) < GIT_SUCCESS)
goto rollback;