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:
authorCarlos Martín Nieto <carlos@cmartin.tk>2012-02-28 05:19:57 +0400
committerCarlos Martín Nieto <carlos@cmartin.tk>2012-04-12 22:25:24 +0400
commit06b9d915901b3dd9dc85016bb000e631eb1da1d7 (patch)
treec9a2984955e959cd5b4ca44809fa4e68f92d9f93 /src/revwalk.c
parent081d229106faae3c37c08940fd510a3511bfbd59 (diff)
revwalk: allow pushing/hiding a reference by name
The code was already there, so factor it out and let users push an OID by giving it a reference name. Only refs to commits are supported. Annotated tags will throw an error.
Diffstat (limited to 'src/revwalk.c')
-rw-r--r--src/revwalk.c71
1 files changed, 33 insertions, 38 deletions
diff --git a/src/revwalk.c b/src/revwalk.c
index ffa0be6f8..1a398ce2d 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -310,6 +310,23 @@ int git_revwalk_hide(git_revwalk *walk, const git_oid *oid)
return push_commit(walk, oid, 1);
}
+static int push_ref(git_revwalk *walk, const char *refname, int hide)
+{
+ git_reference *ref, *resolved;
+ int error;
+
+ error = git_reference_lookup(&ref, walk->repo, refname);
+ if (error < GIT_SUCCESS)
+ return error;
+ error = git_reference_resolve(&resolved, ref);
+ git_reference_free(ref);
+ if (error < GIT_SUCCESS)
+ return error;
+ error = push_commit(walk, git_reference_oid(resolved), hide);
+ git_reference_free(resolved);
+ return error;
+}
+
struct push_cb_data {
git_revwalk *walk;
const char *glob;
@@ -320,21 +337,8 @@ static int push_glob_cb(const char *refname, void *data_)
{
struct push_cb_data *data = (struct push_cb_data *)data_;
- if (!git__fnmatch(data->glob, refname, 0)) {
- git_reference *ref, *resolved;
- int error;
-
- error = git_reference_lookup(&ref, data->walk->repo, refname);
- if (error < GIT_SUCCESS)
- return error;
- error = git_reference_resolve(&resolved, ref);
- git_reference_free(ref);
- if (error < GIT_SUCCESS)
- return error;
- error = push_commit(data->walk, git_reference_oid(resolved), data->hide);
- git_reference_free(resolved);
- return error;
- }
+ if (!git__fnmatch(data->glob, refname, 0))
+ return push_ref(data->walk, refname, data->hide);
return GIT_SUCCESS;
}
@@ -394,37 +398,28 @@ int git_revwalk_hide_glob(git_revwalk *walk, const char *glob)
return push_glob(walk, glob, 1);
}
-static int push_head(git_revwalk *walk, int hide)
-{
- git_reference *ref, *resolved;
- int error;
-
- error = git_reference_lookup(&ref, walk->repo, "HEAD");
- if (error < GIT_SUCCESS) {
- return error;
- }
- error = git_reference_resolve(&resolved, ref);
- if (error < GIT_SUCCESS) {
- return error;
- }
- git_reference_free(ref);
-
- error = push_commit(walk, git_reference_oid(resolved), hide);
-
- git_reference_free(resolved);
- return error;
-}
-
int git_revwalk_push_head(git_revwalk *walk)
{
assert(walk);
- return push_head(walk, 0);
+ return push_ref(walk, GIT_HEAD_FILE, 0);
}
int git_revwalk_hide_head(git_revwalk *walk)
{
assert(walk);
- return push_head(walk, 1);
+ return push_ref(walk, GIT_HEAD_FILE, 1);
+}
+
+int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
+{
+ assert(walk && refname);
+ return push_ref(walk, refname, 0);
+}
+
+int git_revwalk_hide_ref(git_revwalk *walk, const char *refname)
+{
+ assert(walk && refname);
+ return push_ref(walk, refname, 1);
}
static int revwalk_enqueue_timesort(git_revwalk *walk, commit_object *commit)