summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2013-11-23 14:39:53 +0100
committerCarlos Martín Nieto <cmn@dwim.me>2013-12-09 15:55:11 +0100
commitf21051297cc698644ea0dc9c7122ec944dba2863 (patch)
treeb94a20b868860f84c5a674bbada254e789f4e43a
parent8d5ec9106afbca346a8def84ef20de0a7ba2240a (diff)
downloadlibgit2-f21051297cc698644ea0dc9c7122ec944dba2863.tar.gz
refs: expose has_log() on the backend
The frontend used to look at the file directly, but that's obviously not the right thing to do. Expose it on the backend and use that function instead.
-rw-r--r--include/git2/refs.h6
-rw-r--r--include/git2/sys/refdb_backend.h5
-rw-r--r--src/refdb.c7
-rw-r--r--src/refdb.h1
-rw-r--r--src/refdb_fs.c12
-rw-r--r--src/refs.c19
-rw-r--r--tests/refs/reflog/reflog.c8
7 files changed, 36 insertions, 22 deletions
diff --git a/include/git2/refs.h b/include/git2/refs.h
index 31bf997fe..f88f448f0 100644
--- a/include/git2/refs.h
+++ b/include/git2/refs.h
@@ -548,12 +548,12 @@ GIT_EXTERN(int) git_reference_foreach_glob(
/**
* Check if a reflog exists for the specified reference.
*
- * @param ref A git reference
- *
+ * @param repo the repository
+ * @param refname the reference's name
* @return 0 when no reflog can be found, 1 when it exists;
* otherwise an error code.
*/
-GIT_EXTERN(int) git_reference_has_log(git_reference *ref);
+GIT_EXTERN(int) git_reference_has_log(git_repository *repo, const char *refname);
/**
* Ensure there is a reflog for a particular reference.
diff --git a/include/git2/sys/refdb_backend.h b/include/git2/sys/refdb_backend.h
index 1485ed73a..5bbd4ba4c 100644
--- a/include/git2/sys/refdb_backend.h
+++ b/include/git2/sys/refdb_backend.h
@@ -117,6 +117,11 @@ struct git_refdb_backend {
int (*compress)(git_refdb_backend *backend);
/**
+ * Query whether a particular reference has a log (may be empty)
+ */
+ int (*has_log)(git_refdb_backend *backend, const char *refname);
+
+ /**
* Make sure a particular reference will have a reflog which
* will be appended to on writes.
*/
diff --git a/src/refdb.c b/src/refdb.c
index 4f3169f88..411423d57 100644
--- a/src/refdb.c
+++ b/src/refdb.c
@@ -222,6 +222,13 @@ int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name)
return 0;
}
+int git_refdb_has_log(git_refdb *db, const char *refname)
+{
+ assert(db && refname);
+
+ return db->backend->has_log(db->backend, refname);
+}
+
int git_refdb_ensure_log(git_refdb *db, const char *refname)
{
assert(db && refname);
diff --git a/src/refdb.h b/src/refdb.h
index 12c15cb9f..91eecb782 100644
--- a/src/refdb.h
+++ b/src/refdb.h
@@ -48,6 +48,7 @@ int git_refdb_delete(git_refdb *refdb, const char *ref_name);
int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name);
int git_refdb_reflog_write(git_reflog *reflog);
+int git_refdb_has_log(git_refdb *db, const char *refname);
int git_refdb_ensure_log(git_refdb *refdb, const char *refname);
diff --git a/src/refdb_fs.c b/src/refdb_fs.c
index 2cdea8274..e9ce648e1 100644
--- a/src/refdb_fs.c
+++ b/src/refdb_fs.c
@@ -1278,6 +1278,17 @@ cleanup:
return ret;
}
+static int refdb_reflog_fs__has_log(git_refdb_backend *_backend, const char *name)
+{
+ refdb_fs_backend *backend;
+
+ assert(_backend && name);
+
+ backend = (refdb_fs_backend *) _backend;
+
+ return has_reflog(backend->repo, name);
+}
+
static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend, const char *name)
{
int error = -1;
@@ -1608,6 +1619,7 @@ int git_refdb_backend_fs(
backend->parent.del = &refdb_fs_backend__delete;
backend->parent.rename = &refdb_fs_backend__rename;
backend->parent.compress = &refdb_fs_backend__compress;
+ backend->parent.has_log = &refdb_reflog_fs__has_log;
backend->parent.ensure_log = &refdb_reflog_fs__ensure_log;
backend->parent.free = &refdb_fs_backend__free;
backend->parent.reflog_read = &refdb_reflog_fs__read;
diff --git a/src/refs.c b/src/refs.c
index 902a17cfc..519770d2d 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -1050,22 +1050,17 @@ int git_reference__update_terminal(
return reference__update_terminal(repo, ref_name, oid, 0);
}
-int git_reference_has_log(
- git_reference *ref)
+int git_reference_has_log(git_repository *repo, const char *refname)
{
- git_buf path = GIT_BUF_INIT;
- int result;
-
- assert(ref);
+ int error;
+ git_refdb *refdb;
- if (git_buf_join_n(&path, '/', 3, ref->db->repo->path_repository,
- GIT_REFLOG_DIR, ref->name) < 0)
- return -1;
+ assert(repo && refname);
- result = git_path_isfile(git_buf_cstr(&path));
- git_buf_free(&path);
+ if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0)
+ return error;
- return result;
+ return git_refdb_has_log(refdb, refname);
}
int git_reference_ensure_log(git_repository *repo, const char *refname)
diff --git a/tests/refs/reflog/reflog.c b/tests/refs/reflog/reflog.c
index 9f414f21d..a1c5adaf4 100644
--- a/tests/refs/reflog/reflog.c
+++ b/tests/refs/reflog/reflog.c
@@ -127,13 +127,7 @@ void test_refs_reflog_reflog__renaming_the_reference_moves_the_reflog(void)
static void assert_has_reflog(bool expected_result, const char *name)
{
- git_reference *ref;
-
- cl_git_pass(git_reference_lookup(&ref, g_repo, name));
-
- cl_assert_equal_i(expected_result, git_reference_has_log(ref));
-
- git_reference_free(ref);
+ cl_assert_equal_i(expected_result, git_reference_has_log(g_repo, name));
}
void test_refs_reflog_reflog__reference_has_reflog(void)