Skip to content

Commit 32de866

Browse files
author
Vicent Marti
committed
Merge pull request #568 from libgit2/cmn/extract-signature
Add Commit::extract_signature
2 parents 79f1a0d + aed0e24 commit 32de866

File tree

3 files changed

+116
-1
lines changed

3 files changed

+116
-1
lines changed

ext/rugged/rugged_commit.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,11 +612,58 @@ static VALUE rb_git_commit_header(VALUE self)
612612
return rb_str_new_utf8(raw_header);
613613
}
614614

615+
/*
616+
* call-seq:
617+
* Rugged::Commit.extract_signature(repo, commit, field_name) -> [str, str]
618+
*
619+
* Returns +commit+'s signature in 'field' and the signed data
620+
*
621+
* The signature is done over the contents of the commit without the
622+
* signature block in the header, which is the data in the second
623+
* element in the return array.
624+
*/
625+
static VALUE rb_git_commit_extract_signature(int argc, VALUE *argv, VALUE self)
626+
{
627+
int error;
628+
VALUE ret_arr;
629+
git_oid commit_id;
630+
const char *field;
631+
git_repository *repo;
632+
git_buf signature = {0}, signed_data = {0};
633+
VALUE rb_repo, rb_commit, rb_field = Qnil;
634+
635+
rb_scan_args(argc, argv, "21", &rb_repo, &rb_commit, &rb_field);
636+
637+
rugged_check_repo(rb_repo);
638+
Data_Get_Struct(rb_repo, git_repository, repo);
639+
640+
error = git_oid_fromstr(&commit_id, StringValueCStr(rb_commit));
641+
rugged_exception_check(error);
642+
643+
field = NIL_P(rb_field) ? NULL : StringValueCStr(rb_field);
644+
error = git_commit_extract_signature(&signature, &signed_data, repo, &commit_id, field);
645+
if (error < 0) {
646+
git_buf_free(&signature);
647+
git_buf_free(&signed_data);
648+
}
649+
650+
rugged_exception_check(error);
651+
652+
ret_arr = rb_ary_new3(2, rb_str_new(signature.ptr, signature.size),
653+
rb_str_new(signed_data.ptr, signed_data.size));
654+
655+
git_buf_free(&signature);
656+
git_buf_free(&signed_data);
657+
658+
return ret_arr;
659+
}
660+
615661
void Init_rugged_commit(void)
616662
{
617663
rb_cRuggedCommit = rb_define_class_under(rb_mRugged, "Commit", rb_cRuggedObject);
618664

619665
rb_define_singleton_method(rb_cRuggedCommit, "create", rb_git_commit_create, 2);
666+
rb_define_singleton_method(rb_cRuggedCommit, "extract_signature", rb_git_commit_extract_signature, -1);
620667

621668
rb_define_method(rb_cRuggedCommit, "message", rb_git_commit_message_GET, 0);
622669
rb_define_method(rb_cRuggedCommit, "epoch_time", rb_git_commit_epoch_time_GET, 0);

test/commit_test.rb

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,74 @@ def test_header
204204

205205
assert_equal expected_header, obj.header
206206
end
207+
208+
def test_extract_signature
209+
210+
raw_commit = <<-COMMIT
211+
tree 6b79e22d69bf46e289df0345a14ca059dfc9bdf6
212+
parent 34734e478d6cf50c27c9d69026d93974d052c454
213+
author Ben Burkert <[email protected]> 1358451456 -0800
214+
committer Ben Burkert <[email protected]> 1358451456 -0800
215+
gpgsig -----BEGIN PGP SIGNATURE-----
216+
Version: GnuPG v1.4.12 (Darwin)
217+
218+
iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al
219+
o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8
220+
JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq
221+
AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq
222+
SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW
223+
who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok
224+
6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG
225+
cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu
226+
c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9
227+
ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J
228+
7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc
229+
cpxtDQQMGYFpXK/71stq
230+
=ozeK
231+
-----END PGP SIGNATURE-----
232+
233+
a simple commit which works
234+
COMMIT
235+
236+
exp_signature = <<-SIGNATURE.strip
237+
-----BEGIN PGP SIGNATURE-----
238+
Version: GnuPG v1.4.12 (Darwin)
239+
240+
iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al
241+
o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8
242+
JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq
243+
AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq
244+
SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW
245+
who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok
246+
6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG
247+
cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu
248+
c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9
249+
ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J
250+
7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc
251+
cpxtDQQMGYFpXK/71stq
252+
=ozeK
253+
-----END PGP SIGNATURE-----
254+
SIGNATURE
255+
256+
exp_signed_data = <<-SIGNEDDATA
257+
tree 6b79e22d69bf46e289df0345a14ca059dfc9bdf6
258+
parent 34734e478d6cf50c27c9d69026d93974d052c454
259+
author Ben Burkert <[email protected]> 1358451456 -0800
260+
committer Ben Burkert <[email protected]> 1358451456 -0800
261+
262+
a simple commit which works
263+
SIGNEDDATA
264+
265+
commit_sha = @repo.write(raw_commit, :commit)
266+
267+
signature, signed_data = Rugged::Commit.extract_signature(@repo, commit_sha, "gpgsig")
268+
assert_equal exp_signature, signature
269+
assert_equal exp_signed_data, signed_data
270+
271+
signature, signed_data = Rugged::Commit.extract_signature(@repo, commit_sha)
272+
assert_equal exp_signature, signature
273+
assert_equal exp_signed_data, signed_data
274+
end
207275
end
208276

209277
class CommitWriteTest < Rugged::TestCase

0 commit comments

Comments
 (0)