Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2013-05-30 00:47:37 +0400
committerVicent Marti <tanoku@gmail.com>2013-05-30 00:47:37 +0400
commitec24e542969f9d49e41e4c2cb3eac2259b1818c2 (patch)
treefd201dedeabda91e8a0e63b27eeb24093a759988 /src/refdb.c
parent56960b8396d3aef0b39f32aa7a9749202f925ada (diff)
What are the chances, really
Diffstat (limited to 'src/refdb.c')
-rw-r--r--src/refdb.c80
1 files changed, 23 insertions, 57 deletions
diff --git a/src/refdb.c b/src/refdb.c
index 6cb879288..e0701d347 100644
--- a/src/refdb.c
+++ b/src/refdb.c
@@ -114,99 +114,65 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name)
assert(db && db->backend && out && ref_name);
- if (!(error = db->backend->lookup(&ref, db->backend, ref_name))) {
- ref->db = db;
- *out = ref;
- } else {
- *out = NULL;
- }
+ error = db->backend->lookup(&ref, db->backend, ref_name);
+ if (error < 0)
+ return error;
+
+ GIT_REFCOUNT_INC(db);
+ ref->db = db;
- return error;
+ *out = ref;
+ return 0;
}
-int git_refdb_iterator(git_reference_iterator **out, git_refdb *db)
+int git_refdb_iterator(git_reference_iterator **out, git_refdb *db, const char *glob)
{
if (!db->backend || !db->backend->iterator) {
giterr_set(GITERR_REFERENCE, "This backend doesn't support iterators");
return -1;
}
- if (db->backend->iterator(out, db->backend) < 0)
+ if (db->backend->iterator(out, db->backend, glob) < 0)
return -1;
+ GIT_REFCOUNT_INC(db);
+ (*out)->db = db;
+
return 0;
}
-int git_refdb_iterator_glob(git_reference_iterator **out, git_refdb *db, const char *glob)
+int git_refdb_iterator_next(git_reference **out, git_reference_iterator *iter)
{
- if (!db->backend) {
- giterr_set(GITERR_REFERENCE, "There are no backends loaded");
- return -1;
- }
-
- if (db->backend->iterator_glob)
- return db->backend->iterator_glob(out, db->backend, glob);
+ int error;
- /* If the backend doesn't support glob-filtering themselves, we have to do it */
- if (db->backend->iterator(out, db->backend) < 0)
- return -1;
+ if ((error = iter->next(out, iter)) < 0)
+ return error;
- (*out)->glob = git__strdup(glob);
- if (!(*out)->glob) {
- db->backend->iterator_free(*out);
- return -1;
- }
+ GIT_REFCOUNT_INC(iter->db);
+ (*out)->db = iter->db;
return 0;
}
-int git_refdb_next(git_reference **out, git_reference_iterator *iter)
+int git_refdb_iterator_next_name(const char **out, git_reference_iterator *iter)
{
- int error;
-
- if (!iter->glob) {
- if ((error = iter->backend->next(out, iter)) < 0)
- return error;
-
- (*out)->db = iter->backend;
- return 0;
- }
-
- /* If the iterator has a glob, we need to filter */
- while ((error = iter->backend->next(out, iter)) == 0) {
- if (!p_fnmatch(iter->glob, (*out)->name, 0)) {
- (*out)->db = iter->backend;
- return 0;
- }
-
- git_reference_free(*out);
- }
-
- return error;
+ return iter->next_name(out, iter);
}
void git_refdb_iterator_free(git_reference_iterator *iter)
{
- git__free(iter->glob);
- iter->backend->iterator_free(iter);
+ GIT_REFCOUNT_DEC(iter->db, refdb_free);
+ iter->free(iter);
}
-struct glob_cb_data {
- const char *glob;
- git_reference_foreach_cb callback;
- void *payload;
-};
-
int git_refdb_write(git_refdb *db, const git_reference *ref)
{
assert(db && db->backend);
-
return db->backend->write(db->backend, ref);
}
int git_refdb_delete(struct git_refdb *db, const git_reference *ref)
{
assert(db && db->backend);
-
return db->backend->delete(db->backend, ref);
}