Signed-off-by: Felipe Contreras <[email protected]>
---
Notes:
We could call it get_merge_bases_many(), but the fact that it's awkward to
pass arrays in C is a limitation we don't have in Ruby. We can pass as many
commits as we want easily.
ruby.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/ruby.c b/ruby.c
index 53afa32..cc8fe0e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -11,6 +11,7 @@
static VALUE git_rb_object;
static VALUE git_rb_commit;
+static VALUE git_rb_commit_list;
static inline VALUE sha1_to_str(const unsigned char *sha1)
{
@@ -152,6 +153,36 @@ static VALUE git_rb_commit_buffer(VALUE self)
return cstr_to_str(commit->buffer);
}
+static VALUE git_rb_commit_list_each(VALUE self)
+{
+ struct commit_list *e, *list;
+ Data_Get_Struct(self, struct commit_list, list);
+
+ for (e = list; e; e = e->next) {
+ VALUE c;
+ c = Data_Wrap_Struct(git_rb_commit, NULL, NULL, e->item);
+ rb_yield(c);
+ }
+
+ return self;
+}
+
+static VALUE git_rb_get_merge_bases(VALUE self, VALUE commits, VALUE cleanup)
+{
+ struct commit *g_commits[RARRAY_LEN(commits)];
+ struct commit_list *result;
+ int i;
+
+ for (i = 0; i < RARRAY_LEN(commits); i++) {
+ VALUE commit = RARRAY_PTR(commits)[i];
+ Data_Get_Struct(commit, struct commit, g_commits[i]);
+ }
+ result = get_merge_bases_many(g_commits[0], RARRAY_LEN(commits) - 1,
g_commits + 1, NUM2INT(cleanup));
+ if (!result)
+ return Qnil;
+ return Data_Wrap_Struct(git_rb_commit_list, NULL, NULL, result);
+}
+
static void git_ruby_init(void)
{
VALUE mod;
@@ -176,6 +207,7 @@ static void git_ruby_init(void)
rb_define_global_function("read_ref", git_rb_read_ref, 1);
rb_define_global_function("peel_ref", git_rb_peel_ref, 1);
rb_define_global_function("get_sha1", git_rb_get_sha1, 1);
+ rb_define_global_function("get_merge_bases", git_rb_get_merge_bases, 2);
git_rb_object = rb_define_class_under(mod, "Object", rb_cData);
rb_define_singleton_method(git_rb_object, "get", git_rb_object_get, 1);
@@ -186,6 +218,10 @@ static void git_ruby_init(void)
git_rb_commit = rb_define_class_under(mod, "Commit", git_rb_object);
rb_define_singleton_method(git_rb_commit, "get", git_rb_commit_get, 1);
rb_define_method(git_rb_commit, "buffer", git_rb_commit_buffer, 0);
+
+ git_rb_commit_list = rb_define_class_under(mod, "CommitList", rb_cData);
+ rb_include_module(git_rb_commit_list, rb_mEnumerable);
+ rb_define_method(git_rb_commit_list, "each", git_rb_commit_list_each,
0);
}
static int run_ruby_command(const char *cmd, int argc, const char **argv)
--
1.8.4-fc
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html