summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Martí <tanoku@gmail.com>2011-11-25 21:30:08 -0800
committerVicent Martí <tanoku@gmail.com>2011-11-25 21:30:08 -0800
commite42ea1f488ae50655f31b8f09413a543b0fab9b7 (patch)
tree7697099dd809bb1e2e9fb28b4c1127853b5801ba /src
parent2869f404fd1fb345bfe86471dbcfba85abaa9f10 (diff)
parenta5cd086dffbc07ad839f3a9c320dda6970594126 (diff)
downloadlibgit2-e42ea1f488ae50655f31b8f09413a543b0fab9b7.tar.gz
Merge pull request #491 from schu/refs-cleanup
reference_rename() cleanup
Diffstat (limited to 'src')
-rw-r--r--src/fileops.h5
-rw-r--r--src/reflog.c26
-rw-r--r--src/refs.c36
3 files changed, 39 insertions, 28 deletions
diff --git a/src/fileops.h b/src/fileops.h
index 56c4770cb..e1a59f633 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -90,11 +90,6 @@ extern int git_futils_rmdir_r(const char *path, int force);
extern int git_futils_mktmp(char *path_out, const char *filename);
/**
- * Atomically rename a file on the filesystem
- */
-extern int git_futils_mv_atomic(const char *from, const char *to);
-
-/**
* Move a file on the filesystem, create the
* destination path if it doesn't exist
*/
diff --git a/src/reflog.c b/src/reflog.c
index c136987b1..fbaaaea67 100644
--- a/src/reflog.c
+++ b/src/reflog.c
@@ -255,6 +255,32 @@ int git_reflog_write(git_reference *ref, const git_oid *oid_old,
return reflog_write(log_path, old, new, committer, msg);
}
+int git_reflog_rename(git_reference *ref, const char *new_name)
+{
+ char old_path[GIT_PATH_MAX];
+ char new_path[GIT_PATH_MAX];
+
+ git_path_join_n(old_path, 3, ref->owner->path_repository,
+ GIT_REFLOG_DIR, ref->name);
+ git_path_join_n(new_path, 3, ref->owner->path_repository,
+ GIT_REFLOG_DIR, new_name);
+
+ return p_rename(old_path, new_path);
+}
+
+int git_reflog_delete(git_reference *ref)
+{
+ char path[GIT_PATH_MAX];
+
+ git_path_join_n(path, 3, ref->owner->path_repository,
+ GIT_REFLOG_DIR, ref->name);
+
+ if (git_futils_exists(path))
+ return GIT_SUCCESS;
+
+ return p_unlink(path);
+}
+
unsigned int git_reflog_entrycount(git_reflog *reflog)
{
assert(reflog);
diff --git a/src/refs.c b/src/refs.c
index 5a297a516..2374cc72f 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -10,6 +10,7 @@
#include "repository.h"
#include "fileops.h"
#include "pack.h"
+#include "reflog.h"
#include <git2/tag.h>
#include <git2/object.h>
@@ -1319,28 +1320,6 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
/*
- * Crude hack: delete any logs till we support proper reflogs.
- * Otherwise git.git will possibly fail and leave a mess. git.git
- * writes reflogs by default in any repo with a working directory:
- *
- * "We only enable reflogs in repositories that have a working directory
- * associated with them, as shared/bare repositories do not have
- * an easy means to prune away old log entries, or may fail logging
- * entirely if the user's gecos information is not valid during a push.
- * This heuristic was suggested on the mailing list by Junio."
- *
- * Shawn O. Pearce - 0bee59186976b1d9e6b2dd77332480c9480131d5
- *
- * TODO
- *
- */
- git_path_join_n(aux_path, 3, ref->owner->path_repository, "logs", ref->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->flags & GIT_REF_SYMBOLIC) {
@@ -1352,7 +1331,7 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
if (error < GIT_SUCCESS)
- goto cleanup;
+ goto rollback;
/*
* Check if we have to update HEAD.
@@ -1372,6 +1351,14 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
/*
+ * Rename the reflog file.
+ */
+ git_path_join_n(aux_path, 3, ref->owner->path_repository,
+ GIT_REFLOG_DIR, ref->name);
+ if (git_futils_exists(aux_path) == GIT_SUCCESS)
+ error = git_reflog_rename(ref, new_name);
+
+ /*
* Change the name of the reference given by the user.
*/
git__free(ref->name);
@@ -1398,6 +1385,9 @@ rollback:
error = git_reference_create_oid(
NULL, ref->owner, ref->name, &ref->target.oid, 0);
+ /* The reference is no longer packed */
+ ref->flags &= ~GIT_REF_PACKED;
+
return error == GIT_SUCCESS ?
git__rethrow(GIT_ERROR, "Failed to rename reference. Did rollback") :
git__rethrow(error, "Failed to rename reference. Failed to rollback");