rdavila-rugged 0.24.0b13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +619 -0
  4. data/ext/rugged/extconf.rb +105 -0
  5. data/ext/rugged/rugged.c +527 -0
  6. data/ext/rugged/rugged.h +185 -0
  7. data/ext/rugged/rugged_backend.c +34 -0
  8. data/ext/rugged/rugged_blame.c +292 -0
  9. data/ext/rugged/rugged_blob.c +638 -0
  10. data/ext/rugged/rugged_branch.c +195 -0
  11. data/ext/rugged/rugged_branch_collection.c +408 -0
  12. data/ext/rugged/rugged_commit.c +691 -0
  13. data/ext/rugged/rugged_config.c +404 -0
  14. data/ext/rugged/rugged_cred.c +148 -0
  15. data/ext/rugged/rugged_diff.c +686 -0
  16. data/ext/rugged/rugged_diff_delta.c +105 -0
  17. data/ext/rugged/rugged_diff_hunk.c +103 -0
  18. data/ext/rugged/rugged_diff_line.c +83 -0
  19. data/ext/rugged/rugged_index.c +1255 -0
  20. data/ext/rugged/rugged_note.c +376 -0
  21. data/ext/rugged/rugged_object.c +383 -0
  22. data/ext/rugged/rugged_patch.c +245 -0
  23. data/ext/rugged/rugged_reference.c +396 -0
  24. data/ext/rugged/rugged_reference_collection.c +446 -0
  25. data/ext/rugged/rugged_remote.c +691 -0
  26. data/ext/rugged/rugged_remote_collection.c +457 -0
  27. data/ext/rugged/rugged_repo.c +2669 -0
  28. data/ext/rugged/rugged_revwalk.c +495 -0
  29. data/ext/rugged/rugged_settings.c +155 -0
  30. data/ext/rugged/rugged_signature.c +106 -0
  31. data/ext/rugged/rugged_submodule.c +852 -0
  32. data/ext/rugged/rugged_submodule_collection.c +384 -0
  33. data/ext/rugged/rugged_tag.c +251 -0
  34. data/ext/rugged/rugged_tag_collection.c +347 -0
  35. data/ext/rugged/rugged_tree.c +919 -0
  36. data/lib/rugged.rb +23 -0
  37. data/lib/rugged/attributes.rb +41 -0
  38. data/lib/rugged/blob.rb +28 -0
  39. data/lib/rugged/branch.rb +19 -0
  40. data/lib/rugged/commit.rb +54 -0
  41. data/lib/rugged/console.rb +9 -0
  42. data/lib/rugged/credentials.rb +43 -0
  43. data/lib/rugged/diff.rb +20 -0
  44. data/lib/rugged/diff/delta.rb +53 -0
  45. data/lib/rugged/diff/hunk.rb +18 -0
  46. data/lib/rugged/diff/line.rb +47 -0
  47. data/lib/rugged/index.rb +13 -0
  48. data/lib/rugged/object.rb +7 -0
  49. data/lib/rugged/patch.rb +36 -0
  50. data/lib/rugged/reference.rb +7 -0
  51. data/lib/rugged/remote.rb +4 -0
  52. data/lib/rugged/repository.rb +227 -0
  53. data/lib/rugged/submodule_collection.rb +48 -0
  54. data/lib/rugged/tag.rb +50 -0
  55. data/lib/rugged/tree.rb +38 -0
  56. data/lib/rugged/version.rb +3 -0
  57. data/lib/rugged/walker.rb +5 -0
  58. metadata +146 -0
@@ -0,0 +1,404 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright (c) 2014 GitHub, Inc
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+
25
+ #include "rugged.h"
26
+
27
+ extern VALUE rb_mRugged;
28
+ VALUE rb_cRuggedConfig;
29
+
30
+ void rb_git_config__free(git_config *config)
31
+ {
32
+ git_config_free(config);
33
+ }
34
+
35
+ VALUE rugged_config_new(VALUE klass, VALUE owner, git_config *cfg)
36
+ {
37
+ VALUE rb_config = Data_Wrap_Struct(klass, NULL, &rb_git_config__free, cfg);
38
+ rugged_set_owner(rb_config, owner);
39
+ return rb_config;
40
+ }
41
+
42
+ /*
43
+ * call-seq:
44
+ * Config.new(path) -> new_config
45
+ *
46
+ * Open the file specified in +path+ as a +Rugged::Config+ file.
47
+ * If +path+ cannot be found, or the file is an invalid Git config,
48
+ * an exception will be raised.
49
+ */
50
+ static VALUE rb_git_config_new(VALUE klass, VALUE rb_path)
51
+ {
52
+ git_config *config = NULL;
53
+
54
+ if (TYPE(rb_path) == T_ARRAY) {
55
+ int error, i;
56
+
57
+ error = git_config_new(&config);
58
+ rugged_exception_check(error);
59
+
60
+ for (i = 0; i < RARRAY_LEN(rb_path) && !error; ++i) {
61
+ VALUE f = rb_ary_entry(rb_path, i);
62
+ Check_Type(f, T_STRING);
63
+ error = git_config_add_file_ondisk(config, StringValueCStr(f), i + 1, 1);
64
+ }
65
+
66
+ if (error) {
67
+ git_config_free(config);
68
+ rugged_exception_check(error);
69
+ }
70
+ } else if (TYPE(rb_path) == T_STRING) {
71
+ rugged_exception_check(
72
+ git_config_open_ondisk(&config, StringValueCStr(rb_path))
73
+ );
74
+ } else {
75
+ rb_raise(rb_eTypeError, "Expecting a filename or an array of filenames");
76
+ }
77
+
78
+ return rugged_config_new(klass, Qnil, config);
79
+ }
80
+
81
+ /*
82
+ * call-seq:
83
+ * cfg.get(key) -> value
84
+ * cfg[key] -> value
85
+ *
86
+ * Get the value for the given config +key+. Values are always
87
+ * returned as +String+, or +nil+ if the given key doesn't exist
88
+ * in the Config file.
89
+ *
90
+ * cfg['apply.whitespace'] #=> 'fix'
91
+ * cfg['diff.renames'] #=> 'true'
92
+ */
93
+ static VALUE rb_git_config_get(VALUE self, VALUE rb_key)
94
+ {
95
+ git_config *config;
96
+ git_buf buf = { NULL };
97
+ int error;
98
+ VALUE rb_result;
99
+
100
+ Data_Get_Struct(self, git_config, config);
101
+ Check_Type(rb_key, T_STRING);
102
+
103
+ error = git_config_get_string_buf(&buf, config, StringValueCStr(rb_key));
104
+ if (error == GIT_ENOTFOUND)
105
+ return Qnil;
106
+
107
+ rugged_exception_check(error);
108
+ rb_result = rb_str_new_utf8(buf.ptr);
109
+ git_buf_free(&buf);
110
+
111
+ return rb_result;
112
+ }
113
+
114
+ /*
115
+ * call-seq:
116
+ * cfg.store(key, value)
117
+ * cfg[key] = value
118
+ *
119
+ * Store the given +value+ in the Config file, under the section
120
+ * and name specified by +key+. Value can be any of the following
121
+ * Ruby types: +String+, +true+, +false+ and +Fixnum+.
122
+ *
123
+ * The config file will be automatically stored to disk.
124
+ *
125
+ * cfg['apply.whitespace'] = 'fix'
126
+ * cfg['diff.renames'] = true
127
+ * cfg['gc.reflogexpre'] = 90
128
+ */
129
+ static VALUE rb_git_config_store(VALUE self, VALUE rb_key, VALUE rb_val)
130
+ {
131
+ git_config *config;
132
+ const char *key;
133
+ int error;
134
+
135
+ Data_Get_Struct(self, git_config, config);
136
+ Check_Type(rb_key, T_STRING);
137
+
138
+ key = StringValueCStr(rb_key);
139
+
140
+ switch (TYPE(rb_val)) {
141
+ case T_STRING:
142
+ error = git_config_set_string(config, key, StringValueCStr(rb_val));
143
+ break;
144
+
145
+ case T_TRUE:
146
+ case T_FALSE:
147
+ error = git_config_set_bool(config, key, (rb_val == Qtrue));
148
+ break;
149
+
150
+ case T_FIXNUM:
151
+ error = git_config_set_int32(config, key, FIX2INT(rb_val));
152
+ break;
153
+
154
+ default:
155
+ rb_raise(rb_eTypeError,
156
+ "Invalid value; config files can only store string, bool or int keys");
157
+ }
158
+
159
+ rugged_exception_check(error);
160
+ return Qnil;
161
+ }
162
+
163
+ /*
164
+ * call-seq:
165
+ * cfg.delete(key) -> true or false
166
+ *
167
+ * Delete the given +key+ from the config file. Return +true+ if
168
+ * the deletion was successful, or +false+ if the key was not
169
+ * found in the Config file.
170
+ *
171
+ * The config file is immediately updated on disk.
172
+ */
173
+ static VALUE rb_git_config_delete(VALUE self, VALUE rb_key)
174
+ {
175
+ git_config *config;
176
+ int error;
177
+
178
+ Data_Get_Struct(self, git_config, config);
179
+ Check_Type(rb_key, T_STRING);
180
+
181
+ error = git_config_delete_entry(config, StringValueCStr(rb_key));
182
+ if (error == GIT_ENOTFOUND)
183
+ return Qfalse;
184
+
185
+ rugged_exception_check(error);
186
+ return Qtrue;
187
+ }
188
+
189
+ static int cb_config__each_key(const git_config_entry *entry, void *opaque)
190
+ {
191
+ rb_funcall((VALUE)opaque, rb_intern("call"), 1, rb_str_new_utf8(entry->name));
192
+ return GIT_OK;
193
+ }
194
+
195
+ static int cb_config__each_pair(const git_config_entry *entry, void *opaque)
196
+ {
197
+ rb_funcall((VALUE)opaque, rb_intern("call"), 2,
198
+ rb_str_new_utf8(entry->name),
199
+ rb_str_new_utf8(entry->value)
200
+ );
201
+
202
+ return GIT_OK;
203
+ }
204
+
205
+ static int cb_config__to_hash(const git_config_entry *entry, void *opaque)
206
+ {
207
+ rb_hash_aset((VALUE)opaque,
208
+ rb_str_new_utf8(entry->name),
209
+ rb_str_new_utf8(entry->value)
210
+ );
211
+
212
+ return GIT_OK;
213
+ }
214
+
215
+ /*
216
+ * call-seq:
217
+ * cfg.each_key { |key| block }
218
+ * cfg.each_key -> enumarator
219
+ *
220
+ * Call the given block once for each key in the config file. If no block
221
+ * is given, an enumerator is returned.
222
+ *
223
+ * cfg.each_key do |key|
224
+ * puts key
225
+ * end
226
+ */
227
+ static VALUE rb_git_config_each_key(VALUE self)
228
+ {
229
+ git_config *config;
230
+ int error;
231
+
232
+ Data_Get_Struct(self, git_config, config);
233
+
234
+ if (!rb_block_given_p())
235
+ return rb_funcall(self, rb_intern("to_enum"), 1, CSTR2SYM("each_key"));
236
+
237
+ error = git_config_foreach(config, &cb_config__each_key, (void *)rb_block_proc());
238
+ rugged_exception_check(error);
239
+ return Qnil;
240
+ }
241
+
242
+ /*
243
+ * call-seq:
244
+ * cfg.each_pair { |key, value| block }
245
+ * cfg.each_pair -> enumerator
246
+ * cfg.each { |key, value| block }
247
+ * cfg.each -> enumerator
248
+ *
249
+ * Call the given block once for each key/value pair in the config file.
250
+ * If no block is given, an enumerator is returned.
251
+ *
252
+ * cfg.each do |key, value|
253
+ * puts "#{key} => #{value}"
254
+ * end
255
+ */
256
+ static VALUE rb_git_config_each_pair(VALUE self)
257
+ {
258
+ git_config *config;
259
+ int error;
260
+
261
+ Data_Get_Struct(self, git_config, config);
262
+
263
+ if (!rb_block_given_p())
264
+ return rb_funcall(self, rb_intern("to_enum"), 1, CSTR2SYM("each_pair"));
265
+
266
+ error = git_config_foreach(config, &cb_config__each_pair, (void *)rb_block_proc());
267
+ rugged_exception_check(error);
268
+ return Qnil;
269
+ }
270
+
271
+ /*
272
+ * call-seq:
273
+ * cfg.to_hash -> hash
274
+ *
275
+ * Returns the config file represented as a Ruby hash, where
276
+ * each configuration entry appears as a key with its
277
+ * corresponding value.
278
+ *
279
+ * cfg.to_hash #=> {"core.autolf" => "true", "core.bare" => "true"}
280
+ */
281
+ static VALUE rb_git_config_to_hash(VALUE self)
282
+ {
283
+ git_config *config;
284
+ int error;
285
+ VALUE hash;
286
+
287
+ Data_Get_Struct(self, git_config, config);
288
+ hash = rb_hash_new();
289
+
290
+ error = git_config_foreach(config, &cb_config__to_hash, (void *)hash);
291
+ rugged_exception_check(error);
292
+ return hash;
293
+ }
294
+
295
+ /*
296
+ * call-seq:
297
+ * Config.global() -> new_config
298
+ * Config.open_global() -> new_config
299
+ *
300
+ * Open the default global config file as a new +Rugged::Config+ object.
301
+ * An exception will be raised if the global config file doesn't
302
+ * exist.
303
+ */
304
+ static VALUE rb_git_config_open_default(VALUE klass)
305
+ {
306
+ git_config *cfg;
307
+ int error;
308
+
309
+ error = git_config_open_default(&cfg);
310
+ rugged_exception_check(error);
311
+
312
+ return rugged_config_new(klass, Qnil, cfg);
313
+ }
314
+
315
+ /*
316
+ * call-seq:
317
+ * config.snapshot -> snapshot
318
+ *
319
+ * Create a snapshot of the configuration.
320
+ *
321
+ * Provides a consistent, read-only view of the configuration for
322
+ * looking up complex values from a configuration.
323
+ */
324
+ static VALUE rb_git_config_snapshot(VALUE self)
325
+ {
326
+ git_config *config, *snapshot;
327
+
328
+ Data_Get_Struct(self, git_config, config);
329
+
330
+ rugged_exception_check(
331
+ git_config_snapshot(&snapshot, config)
332
+ );
333
+
334
+ return rugged_config_new(rb_obj_class(self), Qnil, snapshot);
335
+ }
336
+
337
+ /*
338
+ * call-seq:
339
+ * config.transaction { |config| }
340
+ *
341
+ * Perform configuration changes in a transaction.
342
+ *
343
+ * Locks the configuration, executes the given block and stores
344
+ * any changes that were made to the configuration. If the block
345
+ * throws an exception, all changes are rolled back automatically.
346
+ *
347
+ * During the execution of the block, configuration changes don't
348
+ * get stored to disk immediately, so reading from the configuration
349
+ * will continue to return the values that were stored in the configuration
350
+ * when the transaction was started.
351
+ */
352
+ static VALUE rb_git_config_transaction(VALUE self)
353
+ {
354
+ git_config *config;
355
+ git_transaction *tx;
356
+ VALUE rb_result;
357
+ int error = 0, exception = 0;
358
+
359
+ Data_Get_Struct(self, git_config, config);
360
+
361
+ git_config_lock(&tx, config);
362
+
363
+ rb_result = rb_protect(rb_yield, self, &exception);
364
+
365
+ if (!exception)
366
+ error = git_transaction_commit(tx);
367
+
368
+ git_transaction_free(tx);
369
+
370
+ if (exception)
371
+ rb_jump_tag(exception);
372
+ else if (error)
373
+ rugged_exception_check(error);
374
+
375
+ return rb_result;
376
+ }
377
+
378
+ void Init_rugged_config(void)
379
+ {
380
+ /*
381
+ * Config
382
+ */
383
+ rb_cRuggedConfig = rb_define_class_under(rb_mRugged, "Config", rb_cObject);
384
+ rb_define_singleton_method(rb_cRuggedConfig, "new", rb_git_config_new, 1);
385
+
386
+ rb_define_singleton_method(rb_cRuggedConfig, "global", rb_git_config_open_default, 0);
387
+ rb_define_singleton_method(rb_cRuggedConfig, "open_global", rb_git_config_open_default, 0);
388
+
389
+ rb_define_method(rb_cRuggedConfig, "delete", rb_git_config_delete, 1);
390
+
391
+ rb_define_method(rb_cRuggedConfig, "store", rb_git_config_store, 2);
392
+ rb_define_method(rb_cRuggedConfig, "[]=", rb_git_config_store, 2);
393
+
394
+ rb_define_method(rb_cRuggedConfig, "get", rb_git_config_get, 1);
395
+ rb_define_method(rb_cRuggedConfig, "[]", rb_git_config_get, 1);
396
+
397
+ rb_define_method(rb_cRuggedConfig, "each_key", rb_git_config_each_key, 0);
398
+ rb_define_method(rb_cRuggedConfig, "each_pair", rb_git_config_each_pair, 0);
399
+ rb_define_method(rb_cRuggedConfig, "each", rb_git_config_each_pair, 0);
400
+ rb_define_method(rb_cRuggedConfig, "to_hash", rb_git_config_to_hash, 0);
401
+
402
+ rb_define_method(rb_cRuggedConfig, "snapshot", rb_git_config_snapshot, 0);
403
+ rb_define_method(rb_cRuggedConfig, "transaction", rb_git_config_transaction, 0);
404
+ }
@@ -0,0 +1,148 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright (c) 2014 GitHub, Inc
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+
25
+ #include "rugged.h"
26
+
27
+ extern VALUE rb_mRugged;
28
+ VALUE rb_mRuggedCred;
29
+ VALUE rb_cRuggedCredUserPassword;
30
+ VALUE rb_cRuggedCredSshKey;
31
+ VALUE rb_cRuggedCredSshKeyFromAgent;
32
+ VALUE rb_cRuggedCredDefault;
33
+
34
+ static void rugged_cred_extract_userpass(git_cred **cred, VALUE rb_credential)
35
+ {
36
+ VALUE rb_username = rb_iv_get(rb_credential, "@username");
37
+ VALUE rb_password = rb_iv_get(rb_credential, "@password");
38
+
39
+ Check_Type(rb_username, T_STRING);
40
+ Check_Type(rb_password, T_STRING);
41
+
42
+ rugged_exception_check(
43
+ git_cred_userpass_plaintext_new(cred,
44
+ StringValueCStr(rb_username),
45
+ StringValueCStr(rb_password)
46
+ )
47
+ );
48
+ }
49
+
50
+ static void rugged_cred_extract_ssh_key(git_cred **cred, VALUE rb_credential)
51
+ {
52
+ VALUE rb_username = rb_iv_get(rb_credential, "@username");
53
+ VALUE rb_publickey = rb_iv_get(rb_credential, "@publickey");
54
+ VALUE rb_privatekey = rb_iv_get(rb_credential, "@privatekey");
55
+ VALUE rb_passphrase = rb_iv_get(rb_credential, "@passphrase");
56
+
57
+ Check_Type(rb_username, T_STRING);
58
+ Check_Type(rb_privatekey, T_STRING);
59
+
60
+ if (!NIL_P(rb_publickey))
61
+ Check_Type(rb_publickey, T_STRING);
62
+ if (!NIL_P(rb_passphrase))
63
+ Check_Type(rb_passphrase, T_STRING);
64
+
65
+ rugged_exception_check(
66
+ git_cred_ssh_key_new(cred,
67
+ StringValueCStr(rb_username),
68
+ NIL_P(rb_publickey) ? NULL : StringValueCStr(rb_publickey),
69
+ StringValueCStr(rb_privatekey),
70
+ NIL_P(rb_passphrase) ? NULL : StringValueCStr(rb_passphrase)
71
+ )
72
+ );
73
+ }
74
+
75
+ static void rugged_credential_extract_ssh_key_from_agent(git_cred **cred, VALUE rb_credential)
76
+ {
77
+ VALUE rb_username = rb_iv_get(rb_credential, "@username");
78
+
79
+ Check_Type(rb_username, T_STRING);
80
+
81
+ rugged_exception_check(
82
+ git_cred_ssh_key_from_agent(cred, StringValueCStr(rb_username))
83
+ );
84
+ }
85
+
86
+ static void rugged_cred_extract_default(git_cred **cred, VALUE rb_credential)
87
+ {
88
+ rugged_exception_check(git_cred_default_new(cred));
89
+ }
90
+
91
+ static void rugged_cred_extract_username(git_cred **cred, VALUE rb_credential)
92
+ {
93
+ VALUE rb_username = rb_iv_get(rb_credential, "@username");
94
+ Check_Type(rb_username, T_STRING);
95
+
96
+ rugged_exception_check(git_cred_username_new(cred, StringValueCStr(rb_username)));
97
+ }
98
+
99
+ void rugged_cred_extract(git_cred **cred, int allowed_types, VALUE rb_credential)
100
+ {
101
+ if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredUserPassword)) {
102
+ if (allowed_types & GIT_CREDTYPE_USERNAME) {
103
+ rugged_cred_extract_username(cred, rb_credential);
104
+ return;
105
+ }
106
+
107
+ if (!(allowed_types & GIT_CREDTYPE_USERPASS_PLAINTEXT))
108
+ rb_raise(rb_eArgError, "Invalid credential type");
109
+
110
+ rugged_cred_extract_userpass(cred, rb_credential);
111
+ } else if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredSshKey)) {
112
+ if (allowed_types & GIT_CREDTYPE_USERNAME) {
113
+ rugged_cred_extract_username(cred, rb_credential);
114
+ return;
115
+ }
116
+
117
+ if (!(allowed_types & GIT_CREDTYPE_SSH_KEY))
118
+ rb_raise(rb_eArgError, "Invalid credential type");
119
+
120
+ rugged_cred_extract_ssh_key(cred, rb_credential);
121
+ } else if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredSshKeyFromAgent)) {
122
+ if (allowed_types & GIT_CREDTYPE_USERNAME) {
123
+ rugged_cred_extract_username(cred, rb_credential);
124
+ return;
125
+ }
126
+
127
+ if (!(allowed_types & GIT_CREDTYPE_SSH_KEY))
128
+ rb_raise(rb_eArgError, "Invalid credential type");
129
+
130
+ rugged_credential_extract_ssh_key_from_agent(cred, rb_credential);
131
+ } else if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredDefault)) {
132
+ if (!(allowed_types & GIT_CREDTYPE_DEFAULT))
133
+ rb_raise(rb_eArgError, "Invalid credential type");
134
+
135
+ rugged_cred_extract_default(cred, rb_credential);
136
+ }
137
+ }
138
+
139
+
140
+ void Init_rugged_cred(void)
141
+ {
142
+ rb_mRuggedCred = rb_define_module_under(rb_mRugged, "Credentials");
143
+
144
+ rb_cRuggedCredUserPassword = rb_define_class_under(rb_mRuggedCred, "UserPassword", rb_cObject);
145
+ rb_cRuggedCredSshKey = rb_define_class_under(rb_mRuggedCred, "SshKey", rb_cObject);
146
+ rb_cRuggedCredSshKeyFromAgent = rb_define_class_under(rb_mRuggedCred, "SshKeyFromAgent", rb_cObject);
147
+ rb_cRuggedCredDefault = rb_define_class_under(rb_mRuggedCred, "Default", rb_cObject);
148
+ }