[PATCH/RFC 6/7] ruby: remove one fork

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is an example of how to start moving out of Git commands, towards
using Git's internal library.

Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx>
---
 git-request-pull.rb |  8 +++++++-
 ruby.c              | 21 +++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/git-request-pull.rb b/git-request-pull.rb
index 6a96a98..fc3175c 100644
--- a/git-request-pull.rb
+++ b/git-request-pull.rb
@@ -37,7 +37,13 @@ head = ARGV[2] || 'HEAD'
 status = 0
 branch_name = nil
 
-headref = `git symbolic-ref -q "#{head}"`.chomp
+def get_symbolic_ref(refname)
+  refname, sha1, flags = resolve_ref_unsafe(refname, 0)
+  return nil if (flags & REF_ISSYMREF) == 0
+  return refname
+end
+
+headref = get_symbolic_ref(head)
 
 if system(%[git show-ref -q --verify "#{headref}"])
   branch_name = headref.gsub(/^refs\/heads\//, '')
diff --git a/ruby.c b/ruby.c
index 733215a..b4e874d 100644
--- a/ruby.c
+++ b/ruby.c
@@ -26,9 +26,30 @@ static VALUE git_rb_for_each_ref(void)
 	return INT2FIX(r);
 }
 
+static VALUE git_rb_resolve_ref_unsafe(VALUE self, VALUE refname, VALUE reading)
+{
+	VALUE a = rb_ary_new2(3);
+	unsigned char sha1[20];
+	int flag;
+	const char *r;
+
+	r = resolve_ref_unsafe(RSTRING_PTR(refname), sha1, FIX2INT(reading), &flag);
+	if (!r)
+		return Qnil;
+	rb_ary_store(a, 0, rb_str_new2(r));
+	rb_ary_store(a, 1, sha1_to_str(sha1));
+	rb_ary_store(a, 2, INT2FIX(flag));
+	return a;
+}
+
 static void git_init(void)
 {
+	rb_define_global_const("REF_ISSYMREF", INT2FIX(REF_ISSYMREF));
+	rb_define_global_const("REF_ISPACKED", INT2FIX(REF_ISPACKED));
+	rb_define_global_const("REF_ISBROKEN", INT2FIX(REF_ISBROKEN));
+
 	rb_define_global_function("for_each_ref", git_rb_for_each_ref, 0);
+	rb_define_global_function("resolve_ref_unsafe", git_rb_resolve_ref_unsafe, 2);
 }
 
 static const char *commands[] = {
-- 
1.8.4-fc

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]