rugged 0.23.0b2 → 0.23.0b4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_blob.c +39 -0
  3. data/ext/rugged/rugged_diff.c +7 -3
  4. data/ext/rugged/rugged_index.c +2 -2
  5. data/ext/rugged/rugged_remote.c +27 -148
  6. data/ext/rugged/rugged_remote_collection.c +134 -12
  7. data/ext/rugged/rugged_repo.c +74 -5
  8. data/ext/rugged/rugged_submodule.c +18 -208
  9. data/ext/rugged/rugged_submodule_collection.c +148 -0
  10. data/lib/rugged/version.rb +1 -1
  11. data/vendor/libgit2/AUTHORS +1 -0
  12. data/vendor/libgit2/CMakeLists.txt +33 -25
  13. data/vendor/libgit2/deps/winhttp/winhttp.def +29 -29
  14. data/vendor/libgit2/include/git2.h +1 -1
  15. data/vendor/libgit2/include/git2/blob.h +4 -6
  16. data/vendor/libgit2/include/git2/checkout.h +10 -1
  17. data/vendor/libgit2/include/git2/clone.h +6 -7
  18. data/vendor/libgit2/include/git2/commit.h +11 -0
  19. data/vendor/libgit2/include/git2/cred_helpers.h +2 -2
  20. data/vendor/libgit2/include/git2/describe.h +1 -1
  21. data/vendor/libgit2/include/git2/diff.h +68 -11
  22. data/vendor/libgit2/include/git2/errors.h +4 -1
  23. data/vendor/libgit2/include/git2/filter.h +16 -0
  24. data/vendor/libgit2/include/git2/index.h +38 -11
  25. data/vendor/libgit2/include/git2/odb.h +1 -1
  26. data/vendor/libgit2/include/git2/odb_backend.h +2 -2
  27. data/vendor/libgit2/include/git2/remote.h +300 -207
  28. data/vendor/libgit2/include/git2/reset.h +1 -0
  29. data/vendor/libgit2/include/git2/stash.h +135 -4
  30. data/vendor/libgit2/include/git2/status.h +1 -0
  31. data/vendor/libgit2/include/git2/submodule.h +46 -75
  32. data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
  33. data/vendor/libgit2/include/git2/sys/stream.h +2 -0
  34. data/vendor/libgit2/include/git2/sys/transport.h +1 -21
  35. data/vendor/libgit2/include/git2/transport.h +27 -0
  36. data/vendor/libgit2/include/git2/types.h +20 -10
  37. data/vendor/libgit2/include/git2/version.h +3 -3
  38. data/vendor/libgit2/libgit2.pc.in +4 -2
  39. data/vendor/libgit2/src/attr.c +2 -1
  40. data/vendor/libgit2/src/attr_file.c +18 -37
  41. data/vendor/libgit2/src/blame.c +2 -2
  42. data/vendor/libgit2/src/blob.c +4 -3
  43. data/vendor/libgit2/src/branch.c +6 -3
  44. data/vendor/libgit2/src/buf_text.c +4 -6
  45. data/vendor/libgit2/src/buf_text.h +1 -2
  46. data/vendor/libgit2/src/buffer.c +8 -6
  47. data/vendor/libgit2/src/buffer.h +1 -1
  48. data/vendor/libgit2/src/cache.c +1 -0
  49. data/vendor/libgit2/src/checkout.c +34 -20
  50. data/vendor/libgit2/src/clone.c +29 -29
  51. data/vendor/libgit2/src/commit.c +65 -0
  52. data/vendor/libgit2/src/common.h +5 -0
  53. data/vendor/libgit2/src/config.c +20 -0
  54. data/vendor/libgit2/src/config.h +6 -0
  55. data/vendor/libgit2/src/config_file.c +2 -2
  56. data/vendor/libgit2/src/crlf.c +39 -17
  57. data/vendor/libgit2/src/curl_stream.c +257 -0
  58. data/vendor/libgit2/src/curl_stream.h +14 -0
  59. data/vendor/libgit2/src/diff.c +223 -88
  60. data/vendor/libgit2/src/diff.h +21 -1
  61. data/vendor/libgit2/src/diff_file.c +23 -13
  62. data/vendor/libgit2/src/diff_file.h +4 -2
  63. data/vendor/libgit2/src/diff_patch.c +266 -71
  64. data/vendor/libgit2/src/diff_patch.h +36 -0
  65. data/vendor/libgit2/src/diff_print.c +156 -126
  66. data/vendor/libgit2/src/diff_tform.c +32 -54
  67. data/vendor/libgit2/src/fetch.c +27 -10
  68. data/vendor/libgit2/src/fetch.h +2 -2
  69. data/vendor/libgit2/src/filebuf.c +1 -1
  70. data/vendor/libgit2/src/fileops.c +6 -2
  71. data/vendor/libgit2/src/filter.c +28 -7
  72. data/vendor/libgit2/src/fnmatch.c +5 -5
  73. data/vendor/libgit2/src/global.c +16 -0
  74. data/vendor/libgit2/src/ident.c +2 -2
  75. data/vendor/libgit2/src/ignore.c +1 -0
  76. data/vendor/libgit2/src/index.c +338 -80
  77. data/vendor/libgit2/src/index.h +4 -1
  78. data/vendor/libgit2/src/indexer.c +19 -5
  79. data/vendor/libgit2/src/iterator.c +118 -11
  80. data/vendor/libgit2/src/iterator.h +25 -0
  81. data/vendor/libgit2/src/merge.c +96 -106
  82. data/vendor/libgit2/src/merge.h +14 -4
  83. data/vendor/libgit2/src/netops.c +3 -3
  84. data/vendor/libgit2/src/odb.c +17 -9
  85. data/vendor/libgit2/src/odb.h +1 -1
  86. data/vendor/libgit2/src/odb_loose.c +2 -2
  87. data/vendor/libgit2/src/odb_pack.c +1 -1
  88. data/vendor/libgit2/src/openssl_stream.c +118 -27
  89. data/vendor/libgit2/src/pack-objects.c +28 -0
  90. data/vendor/libgit2/src/pack-objects.h +1 -0
  91. data/vendor/libgit2/src/pack.c +18 -10
  92. data/vendor/libgit2/src/path.c +16 -11
  93. data/vendor/libgit2/src/path.h +1 -1
  94. data/vendor/libgit2/src/push.c +26 -42
  95. data/vendor/libgit2/src/push.h +2 -34
  96. data/vendor/libgit2/src/rebase.c +1 -1
  97. data/vendor/libgit2/src/refs.c +1 -1
  98. data/vendor/libgit2/src/refspec.c +6 -0
  99. data/vendor/libgit2/src/remote.c +381 -274
  100. data/vendor/libgit2/src/remote.h +0 -4
  101. data/vendor/libgit2/src/repository.c +33 -12
  102. data/vendor/libgit2/src/repository.h +0 -1
  103. data/vendor/libgit2/src/reset.c +1 -0
  104. data/vendor/libgit2/src/stash.c +439 -17
  105. data/vendor/libgit2/src/status.c +6 -0
  106. data/vendor/libgit2/src/stransport_stream.c +58 -21
  107. data/vendor/libgit2/src/stream.h +15 -0
  108. data/vendor/libgit2/src/submodule.c +410 -664
  109. data/vendor/libgit2/src/submodule.h +0 -24
  110. data/vendor/libgit2/src/transaction.c +1 -0
  111. data/vendor/libgit2/src/transports/cred.c +55 -1
  112. data/vendor/libgit2/src/transports/http.c +18 -2
  113. data/vendor/libgit2/src/transports/local.c +60 -59
  114. data/vendor/libgit2/src/transports/smart.h +1 -1
  115. data/vendor/libgit2/src/transports/smart_protocol.c +11 -11
  116. data/vendor/libgit2/src/transports/ssh.c +46 -7
  117. data/vendor/libgit2/src/unix/posix.h +4 -0
  118. data/vendor/libgit2/src/util.c +9 -9
  119. data/vendor/libgit2/src/util.h +9 -0
  120. data/vendor/libgit2/src/win32/posix.h +3 -0
  121. data/vendor/libgit2/src/win32/posix_w32.c +38 -0
  122. data/vendor/libgit2/src/win32/w32_util.h +10 -0
  123. metadata +4 -3
  124. data/vendor/libgit2/include/git2/push.h +0 -94
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 113f78e6f34a503f2f1f27e377f5077337e39fd9
4
- data.tar.gz: b01d276a151b57fc82070fe82392efbb1acb8473
3
+ metadata.gz: 5365f2755f87b76139a9752e291cd2a92e4cef74
4
+ data.tar.gz: 25b17d77f34a4e73cc0529cb4dd6ea23e6a1d0e6
5
5
  SHA512:
6
- metadata.gz: 2b6a7770eb347c4f368dd87f5af01d307c6631dd2dd9dc531d71f3a735e23fc6921d8fd88159bff9fa7c5c9382ba9086caa26b9a26a75c626e2ec447c1c94940
7
- data.tar.gz: 732025da8feceec8a4620025992d9833c1059c6e0d1ef21e8c4f8efbf4c3fb53e0ba872ee8f101f37ce42a3ebdc250bc5943ac8a01baca6372e2a2818e1efe66
6
+ metadata.gz: 4997a2cb895a33fc4ecacb59d7436999e6ee71965b107f9a7e098576744500baae2c506d95b9bf6bfc7e8fb5dddf332ec66ead60ed28e3e747c32911448dcc01
7
+ data.tar.gz: 55f33cc8e38044499830e2c362bf4abe0384a4e6d32cd11fa5313f6e3e15d4f53a43ed5dab76197baa60dc30f20c076eac5a2a8fdc6a161de9fe1ca49f62db4b
@@ -317,6 +317,44 @@ static VALUE rb_git_blob_from_io(int argc, VALUE *argv, VALUE klass)
317
317
  return rugged_create_oid(&oid);
318
318
  }
319
319
 
320
+ /*
321
+ * call-seq:
322
+ * blob.loc -> int
323
+ *
324
+ * Return the number of lines for this blob,
325
+ * assuming the blob is plaintext (i.e. not binary)
326
+ */
327
+ static VALUE rb_git_blob_loc(VALUE self)
328
+ {
329
+ git_blob *blob;
330
+ const char *data, *data_end;
331
+ size_t loc = 0;
332
+
333
+ Data_Get_Struct(self, git_blob, blob);
334
+
335
+ data = git_blob_rawcontent(blob);
336
+ data_end = data + git_blob_rawsize(blob);
337
+
338
+ if (data == data_end)
339
+ return INT2FIX(0);
340
+
341
+ for (; data < data_end; ++data) {
342
+ if (data[0] == '\n') {
343
+ loc++;
344
+ }
345
+ else if (data[0] == '\r') {
346
+ if (data + 1 < data_end && data[1] == '\n')
347
+ data++;
348
+ loc++;
349
+ }
350
+ }
351
+
352
+ if (data[-1] != '\n' && data[-1] != '\r')
353
+ loc++;
354
+
355
+ return INT2FIX(loc);
356
+ }
357
+
320
358
 
321
359
  /*
322
360
  * call-seq:
@@ -583,6 +621,7 @@ void Init_rugged_blob(void)
583
621
  rb_define_method(rb_cRuggedBlob, "content", rb_git_blob_content_GET, -1);
584
622
  rb_define_method(rb_cRuggedBlob, "text", rb_git_blob_text_GET, -1);
585
623
  rb_define_method(rb_cRuggedBlob, "sloc", rb_git_blob_sloc, 0);
624
+ rb_define_method(rb_cRuggedBlob, "loc", rb_git_blob_loc, 0);
586
625
  rb_define_method(rb_cRuggedBlob, "binary?", rb_git_blob_is_binary, 0);
587
626
  rb_define_method(rb_cRuggedBlob, "diff", rb_git_blob_diff, -1);
588
627
 
@@ -120,11 +120,15 @@ void rugged_parse_diff_options(git_diff_options *opts, VALUE rb_options)
120
120
  }
121
121
 
122
122
  if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("show_untracked_content")))) {
123
- opts->flags |= GIT_DIFF_SHOW_UNTRACKED_CONTENT ;
123
+ opts->flags |= GIT_DIFF_SHOW_UNTRACKED_CONTENT;
124
124
  }
125
125
 
126
126
  if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("show_unmodified")))) {
127
- opts->flags |= GIT_DIFF_SHOW_UNTRACKED_CONTENT ;
127
+ opts->flags |= GIT_DIFF_SHOW_UNMODIFIED;
128
+ }
129
+
130
+ if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("show_binary")))) {
131
+ opts->flags |= GIT_DIFF_SHOW_BINARY;
128
132
  }
129
133
 
130
134
  if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("patience")))) {
@@ -643,7 +647,7 @@ static VALUE rb_git_diff_stat(VALUE self)
643
647
  Data_Get_Struct(self, git_diff, diff);
644
648
 
645
649
  git_diff_foreach(
646
- diff, diff_file_stats_cb, NULL, diff_line_stats_cb, &stats);
650
+ diff, diff_file_stats_cb, NULL, NULL, diff_line_stats_cb, &stats);
647
651
 
648
652
  return rb_ary_new3(
649
653
  3, INT2FIX(stats.files), INT2FIX(stats.adds), INT2FIX(stats.dels));
@@ -555,7 +555,7 @@ static VALUE rb_git_indexentry_fromC(const git_index_entry *entry)
555
555
  return rb_entry;
556
556
  }
557
557
 
558
- static inline unsigned int
558
+ static inline uint32_t
559
559
  default_entry_value(VALUE rb_entry, const char *key)
560
560
  {
561
561
  VALUE val = rb_hash_aref(rb_entry, CSTR2SYM(key));
@@ -587,7 +587,7 @@ static void rb_git_indexentry_toC(git_index_entry *entry, VALUE rb_entry)
587
587
  entry->mode = default_entry_value(rb_entry, "mode");
588
588
  entry->gid = default_entry_value(rb_entry, "gid");
589
589
  entry->uid = default_entry_value(rb_entry, "uid");
590
- entry->file_size = (git_off_t)default_entry_value(rb_entry, "file_size");
590
+ entry->file_size = default_entry_value(rb_entry, "file_size");
591
591
 
592
592
  if ((val = rb_hash_aref(rb_entry, CSTR2SYM("mtime"))) != Qnil) {
593
593
  if (!rb_obj_is_kind_of(val, rb_cTime))
@@ -264,8 +264,7 @@ static VALUE rb_git_remote_ls(int argc, VALUE *argv, VALUE self)
264
264
 
265
265
  rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
266
266
 
267
- if ((error = git_remote_set_callbacks(remote, &callbacks)) ||
268
- (error = git_remote_connect(remote, GIT_DIRECTION_FETCH)) ||
267
+ if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, &callbacks)) ||
269
268
  (error = git_remote_ls(&heads, &heads_len, remote)))
270
269
  goto cleanup;
271
270
 
@@ -319,28 +318,6 @@ static VALUE rb_git_remote_url(VALUE self)
319
318
  return rb_str_new_utf8(git_remote_url(remote));
320
319
  }
321
320
 
322
- /*
323
- * call-seq:
324
- * remote.url = url -> url
325
- *
326
- * Sets the remote's url without persisting it in the config.
327
- * Existing connections will not be updated.
328
- *
329
- * remote.url = 'git://github.com/libgit2/rugged.git' #=> "git://github.com/libgit2/rugged.git"
330
- */
331
- static VALUE rb_git_remote_set_url(VALUE self, VALUE rb_url)
332
- {
333
- git_remote *remote;
334
-
335
- Check_Type(rb_url, T_STRING);
336
- Data_Get_Struct(self, git_remote, remote);
337
-
338
- rugged_exception_check(
339
- git_remote_set_url(remote, StringValueCStr(rb_url))
340
- );
341
- return rb_url;
342
- }
343
-
344
321
  /*
345
322
  * call-seq:
346
323
  * remote.push_url() -> string or nil
@@ -372,13 +349,18 @@ static VALUE rb_git_remote_push_url(VALUE self)
372
349
  */
373
350
  static VALUE rb_git_remote_set_push_url(VALUE self, VALUE rb_url)
374
351
  {
352
+ VALUE rb_repo = rugged_owner(self);
375
353
  git_remote *remote;
354
+ git_repository *repo;
355
+
356
+ rugged_check_repo(rb_repo);
357
+ Data_Get_Struct(rb_repo, git_repository, repo);
376
358
 
377
359
  Check_Type(rb_url, T_STRING);
378
360
  Data_Get_Struct(self, git_remote, remote);
379
361
 
380
362
  rugged_exception_check(
381
- git_remote_set_pushurl(remote, StringValueCStr(rb_url))
363
+ git_remote_set_pushurl(repo, git_remote_name(remote), StringValueCStr(rb_url))
382
364
  );
383
365
 
384
366
  return rb_url;
@@ -427,86 +409,6 @@ static VALUE rb_git_remote_push_refspecs(VALUE self)
427
409
  return rb_git_remote_refspecs(self, GIT_DIRECTION_PUSH);
428
410
  }
429
411
 
430
- static VALUE rb_git_remote_add_refspec(VALUE self, VALUE rb_refspec, git_direction direction)
431
- {
432
- git_remote *remote;
433
- int error = 0;
434
-
435
- Data_Get_Struct(self, git_remote, remote);
436
-
437
- Check_Type(rb_refspec, T_STRING);
438
-
439
- if (direction == GIT_DIRECTION_FETCH)
440
- error = git_remote_add_fetch(remote, StringValueCStr(rb_refspec));
441
- else
442
- error = git_remote_add_push(remote, StringValueCStr(rb_refspec));
443
-
444
- rugged_exception_check(error);
445
-
446
- return Qnil;
447
- }
448
-
449
- /*
450
- * call-seq:
451
- * remote.add_fetch(refspec) -> nil
452
- *
453
- * Add a fetch refspec to the remote.
454
- */
455
- static VALUE rb_git_remote_add_fetch(VALUE self, VALUE rb_refspec)
456
- {
457
- return rb_git_remote_add_refspec(self, rb_refspec, GIT_DIRECTION_FETCH);
458
- }
459
-
460
- /*
461
- * call-seq:
462
- * remote.add_push(refspec) -> nil
463
- *
464
- * Add a push refspec to the remote.
465
- */
466
- static VALUE rb_git_remote_add_push(VALUE self, VALUE rb_refspec)
467
- {
468
- return rb_git_remote_add_refspec(self, rb_refspec, GIT_DIRECTION_PUSH);
469
- }
470
-
471
- /*
472
- * call-seq:
473
- * remote.clear_refspecs -> nil
474
- *
475
- * Remove all configured fetch and push refspecs from the remote.
476
- */
477
- static VALUE rb_git_remote_clear_refspecs(VALUE self)
478
- {
479
- git_remote *remote;
480
-
481
- Data_Get_Struct(self, git_remote, remote);
482
-
483
- git_remote_clear_refspecs(remote);
484
-
485
- return Qnil;
486
- }
487
-
488
- /*
489
- * call-seq:
490
- * remote.save -> true
491
- *
492
- * Saves the remote data (url, fetchspecs, ...) to the config.
493
- *
494
- * Anonymous, in-memory remotes created through
495
- * +ReferenceCollection#create_anonymous+ can not be saved.
496
- * Doing so will result in an exception being raised.
497
- */
498
- static VALUE rb_git_remote_save(VALUE self)
499
- {
500
- git_remote *remote;
501
-
502
- Data_Get_Struct(self, git_remote, remote);
503
-
504
- rugged_exception_check(
505
- git_remote_save(remote)
506
- );
507
- return Qtrue;
508
- }
509
-
510
412
  /*
511
413
  * call-seq:
512
414
  * remote.check_connection(direction, options = {}) -> boolean
@@ -556,21 +458,13 @@ static VALUE rb_git_remote_check_connection(int argc, VALUE *argv, VALUE self)
556
458
 
557
459
  rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
558
460
 
559
- if ((error = git_remote_set_callbacks(remote, &callbacks)) < 0)
560
- goto cleanup;
561
-
562
- if (git_remote_connect(remote, direction))
563
- return Qfalse;
564
- else {
565
- git_remote_disconnect(remote);
566
- return Qtrue;
567
- }
461
+ error = git_remote_connect(remote, direction, &callbacks);
462
+ git_remote_disconnect(remote);
568
463
 
569
- cleanup:
570
464
  if (payload.exception)
571
465
  rb_jump_tag(payload.exception);
572
- rugged_exception_check(error);
573
- return Qfalse;
466
+
467
+ return error ? Qfalse : Qtrue;
574
468
  }
575
469
 
576
470
  /*
@@ -622,7 +516,8 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
622
516
  git_remote *remote;
623
517
  git_repository *repo;
624
518
  git_strarray refspecs;
625
- git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
519
+ git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
520
+ const git_transfer_progress *stats;
626
521
  struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
627
522
 
628
523
  char *log_message = NULL;
@@ -638,7 +533,7 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
638
533
  rugged_check_repo(rb_repo);
639
534
  Data_Get_Struct(rb_repo, git_repository, repo);
640
535
 
641
- rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
536
+ rugged_remote_init_callbacks_and_payload_from_options(rb_options, &opts.callbacks, &payload);
642
537
 
643
538
  if (!NIL_P(rb_options)) {
644
539
  VALUE rb_val = rb_hash_aref(rb_options, CSTR2SYM("message"));
@@ -646,23 +541,7 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
646
541
  log_message = StringValueCStr(rb_val);
647
542
  }
648
543
 
649
- if ((error = git_remote_set_callbacks(remote, &callbacks)))
650
- goto cleanup;
651
-
652
- if ((error = git_remote_fetch(remote, &refspecs, log_message)) == GIT_OK) {
653
- const git_transfer_progress *stats = git_remote_stats(remote);
654
-
655
- rb_result = rb_hash_new();
656
- rb_hash_aset(rb_result, CSTR2SYM("total_objects"), UINT2NUM(stats->total_objects));
657
- rb_hash_aset(rb_result, CSTR2SYM("indexed_objects"), UINT2NUM(stats->indexed_objects));
658
- rb_hash_aset(rb_result, CSTR2SYM("received_objects"), UINT2NUM(stats->received_objects));
659
- rb_hash_aset(rb_result, CSTR2SYM("local_objects"), UINT2NUM(stats->local_objects));
660
- rb_hash_aset(rb_result, CSTR2SYM("total_deltas"), UINT2NUM(stats->total_deltas));
661
- rb_hash_aset(rb_result, CSTR2SYM("indexed_deltas"), UINT2NUM(stats->indexed_deltas));
662
- rb_hash_aset(rb_result, CSTR2SYM("received_bytes"), INT2FIX(stats->received_bytes));
663
- }
664
-
665
- cleanup:
544
+ error = git_remote_fetch(remote, &refspecs, &opts, log_message);
666
545
 
667
546
  xfree(refspecs.strings);
668
547
 
@@ -671,6 +550,17 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
671
550
 
672
551
  rugged_exception_check(error);
673
552
 
553
+ stats = git_remote_stats(remote);
554
+
555
+ rb_result = rb_hash_new();
556
+ rb_hash_aset(rb_result, CSTR2SYM("total_objects"), UINT2NUM(stats->total_objects));
557
+ rb_hash_aset(rb_result, CSTR2SYM("indexed_objects"), UINT2NUM(stats->indexed_objects));
558
+ rb_hash_aset(rb_result, CSTR2SYM("received_objects"), UINT2NUM(stats->received_objects));
559
+ rb_hash_aset(rb_result, CSTR2SYM("local_objects"), UINT2NUM(stats->local_objects));
560
+ rb_hash_aset(rb_result, CSTR2SYM("total_deltas"), UINT2NUM(stats->total_deltas));
561
+ rb_hash_aset(rb_result, CSTR2SYM("indexed_deltas"), UINT2NUM(stats->indexed_deltas));
562
+ rb_hash_aset(rb_result, CSTR2SYM("received_bytes"), INT2FIX(stats->received_bytes));
563
+
674
564
  return rb_result;
675
565
  }
676
566
 
@@ -708,7 +598,6 @@ static VALUE rb_git_remote_push(int argc, VALUE *argv, VALUE self)
708
598
 
709
599
  git_repository *repo;
710
600
  git_remote *remote;
711
- git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
712
601
  git_strarray refspecs;
713
602
  git_push_options opts = GIT_PUSH_OPTIONS_INIT;
714
603
 
@@ -724,14 +613,10 @@ static VALUE rb_git_remote_push(int argc, VALUE *argv, VALUE self)
724
613
  Data_Get_Struct(rb_repo, git_repository, repo);
725
614
  Data_Get_Struct(self, git_remote, remote);
726
615
 
727
- rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
728
-
729
- if ((error = git_remote_set_callbacks(remote, &callbacks)))
730
- goto cleanup;
616
+ rugged_remote_init_callbacks_and_payload_from_options(rb_options, &opts.callbacks, &payload);
731
617
 
732
618
  error = git_remote_push(remote, &refspecs, &opts);
733
619
 
734
- cleanup:
735
620
  xfree(refspecs.strings);
736
621
 
737
622
  if (payload.exception)
@@ -746,20 +631,14 @@ void Init_rugged_remote(void)
746
631
  {
747
632
  rb_cRuggedRemote = rb_define_class_under(rb_mRugged, "Remote", rb_cObject);
748
633
 
749
-
750
634
  rb_define_method(rb_cRuggedRemote, "name", rb_git_remote_name, 0);
751
635
  rb_define_method(rb_cRuggedRemote, "url", rb_git_remote_url, 0);
752
- rb_define_method(rb_cRuggedRemote, "url=", rb_git_remote_set_url, 1);
753
636
  rb_define_method(rb_cRuggedRemote, "push_url", rb_git_remote_push_url, 0);
754
637
  rb_define_method(rb_cRuggedRemote, "push_url=", rb_git_remote_set_push_url, 1);
755
638
  rb_define_method(rb_cRuggedRemote, "fetch_refspecs", rb_git_remote_fetch_refspecs, 0);
756
639
  rb_define_method(rb_cRuggedRemote, "push_refspecs", rb_git_remote_push_refspecs, 0);
757
- rb_define_method(rb_cRuggedRemote, "add_fetch", rb_git_remote_add_fetch, 1);
758
- rb_define_method(rb_cRuggedRemote, "add_push", rb_git_remote_add_push, 1);
759
640
  rb_define_method(rb_cRuggedRemote, "ls", rb_git_remote_ls, -1);
760
641
  rb_define_method(rb_cRuggedRemote, "check_connection", rb_git_remote_check_connection, -1);
761
642
  rb_define_method(rb_cRuggedRemote, "fetch", rb_git_remote_fetch, -1);
762
643
  rb_define_method(rb_cRuggedRemote, "push", rb_git_remote_push, -1);
763
- rb_define_method(rb_cRuggedRemote, "clear_refspecs", rb_git_remote_clear_refspecs, 0);
764
- rb_define_method(rb_cRuggedRemote, "save", rb_git_remote_save, 0);
765
644
  }
@@ -69,8 +69,7 @@ static VALUE rb_git_remote_collection_create_anonymous(VALUE self, VALUE rb_url)
69
69
  error = git_remote_create_anonymous(
70
70
  &remote,
71
71
  repo,
72
- StringValueCStr(rb_url),
73
- NULL);
72
+ StringValueCStr(rb_url));
74
73
 
75
74
  rugged_exception_check(error);
76
75
 
@@ -298,7 +297,6 @@ static VALUE rb_git_remote_collection_delete(VALUE self, VALUE rb_name_or_remote
298
297
  {
299
298
  VALUE rb_repo = rugged_owner(self);
300
299
  git_repository *repo;
301
- int error;
302
300
 
303
301
  if (rb_obj_is_kind_of(rb_name_or_remote, rb_cRuggedRemote))
304
302
  rb_name_or_remote = rb_funcall(rb_name_or_remote, rb_intern("name"), 0);
@@ -309,27 +307,151 @@ static VALUE rb_git_remote_collection_delete(VALUE self, VALUE rb_name_or_remote
309
307
  rugged_check_repo(rb_repo);
310
308
  Data_Get_Struct(rb_repo, git_repository, repo);
311
309
 
312
- error = git_remote_delete(repo, StringValueCStr(rb_name_or_remote));
310
+ rugged_exception_check(
311
+ git_remote_delete(repo, StringValueCStr(rb_name_or_remote))
312
+ );
313
+
314
+ return Qnil;
315
+ }
316
+
317
+ /*
318
+ * call-seq:
319
+ * remotes.set_url(remote, url) -> nil
320
+ * remotes.set_url(name, url) -> nil
321
+ *
322
+ * Sets the remote's url in the configuration.
323
+ * Rugged::Remote objects already in memory will not be affected.
324
+ *
325
+ * repo.remotes.set_url("origin", 'git://github.com/libgit2/rugged.git')
326
+ */
327
+ static VALUE rb_git_remote_collection_set_url(VALUE self, VALUE rb_name_or_remote, VALUE rb_url)
328
+ {
329
+ VALUE rb_repo = rugged_owner(self);
330
+ git_repository *repo;
331
+
332
+ if (rb_obj_is_kind_of(rb_name_or_remote, rb_cRuggedRemote))
333
+ rb_name_or_remote = rb_funcall(rb_name_or_remote, rb_intern("name"), 0);
334
+
335
+ if (TYPE(rb_name_or_remote) != T_STRING)
336
+ rb_raise(rb_eTypeError, "Expecting a String or Rugged::Remote instance");
337
+
338
+ rugged_check_repo(rb_repo);
339
+ Data_Get_Struct(rb_repo, git_repository, repo);
340
+
341
+ Check_Type(rb_url, T_STRING);
342
+
343
+ rugged_exception_check(
344
+ git_remote_set_url(repo, StringValueCStr(rb_name_or_remote), StringValueCStr(rb_url))
345
+ );
346
+
347
+ return Qnil;
348
+ }
349
+
350
+ /*
351
+ * call-seq:
352
+ * remotes.set_push_url(remote, url) -> nil
353
+ * remotes.set_push_url(name, url) -> nil
354
+ *
355
+ * Sets the remote's url for pushing in the configuration.
356
+ * Rugged::Remote objects already in memory will not be affected.
357
+ *
358
+ * repo.remotes.set_push_url("origin", 'git://github.com/libgit2/rugged.git')
359
+ */
360
+ static VALUE rb_git_remote_collection_set_push_url(VALUE self, VALUE rb_name_or_remote, VALUE rb_url)
361
+ {
362
+ VALUE rb_repo = rugged_owner(self);
363
+ git_repository *repo;
364
+
365
+ if (rb_obj_is_kind_of(rb_name_or_remote, rb_cRuggedRemote))
366
+ rb_name_or_remote = rb_funcall(rb_name_or_remote, rb_intern("name"), 0);
367
+
368
+ if (TYPE(rb_name_or_remote) != T_STRING)
369
+ rb_raise(rb_eTypeError, "Expecting a String or Rugged::Remote instance");
370
+
371
+ rugged_check_repo(rb_repo);
372
+ Data_Get_Struct(rb_repo, git_repository, repo);
373
+
374
+ Check_Type(rb_url, T_STRING);
375
+
376
+ rugged_exception_check(
377
+ git_remote_set_pushurl(repo, StringValueCStr(rb_name_or_remote), StringValueCStr(rb_url))
378
+ );
379
+
380
+ return Qnil;
381
+ }
382
+
383
+ static VALUE rb_git_remote_collection_add_refspec(VALUE self, VALUE rb_name_or_remote, VALUE rb_refspec, git_direction direction)
384
+ {
385
+ VALUE rb_repo = rugged_owner(self);
386
+ git_repository *repo;
387
+ int error = 0;
388
+
389
+ if (rb_obj_is_kind_of(rb_name_or_remote, rb_cRuggedRemote))
390
+ rb_name_or_remote = rb_funcall(rb_name_or_remote, rb_intern("name"), 0);
391
+
392
+ if (TYPE(rb_name_or_remote) != T_STRING)
393
+ rb_raise(rb_eTypeError, "Expecting a String or Rugged::Remote instance");
394
+
395
+ rugged_check_repo(rb_repo);
396
+ Data_Get_Struct(rb_repo, git_repository, repo);
397
+
398
+ Check_Type(rb_refspec, T_STRING);
399
+
400
+ if (direction == GIT_DIRECTION_FETCH)
401
+ error = git_remote_add_fetch(repo, StringValueCStr(rb_name_or_remote), StringValueCStr(rb_refspec));
402
+ else
403
+ error = git_remote_add_push(repo, StringValueCStr(rb_name_or_remote), StringValueCStr(rb_refspec));
404
+
313
405
  rugged_exception_check(error);
314
406
 
315
407
  return Qnil;
316
408
  }
317
409
 
410
+ /*
411
+ * call-seq:
412
+ * remotes.add_fetch_refspec(remote, refspec) -> nil
413
+ * remotes.add_fetch_refspec(name, refspec) -> nil
414
+ *
415
+ * Add a fetch refspec to the remote.
416
+ */
417
+ static VALUE rb_git_remote_collection_add_fetch_refspec(VALUE self, VALUE rb_name_or_remote, VALUE rb_refspec)
418
+ {
419
+ return rb_git_remote_collection_add_refspec(self, rb_name_or_remote, rb_refspec, GIT_DIRECTION_FETCH);
420
+ }
421
+
422
+ /*
423
+ * call-seq:
424
+ * remotes.add_push_refspec(remote, refspec) -> nil
425
+ * remotes.add_push_refspec(name, refspec) -> nil
426
+ *
427
+ * Add a push refspec to the remote.
428
+ */
429
+ static VALUE rb_git_remote_collection_add_push_refspec(VALUE self, VALUE rb_name_or_remote, VALUE rb_refspec)
430
+ {
431
+ return rb_git_remote_collection_add_refspec(self, rb_name_or_remote, rb_refspec, GIT_DIRECTION_PUSH);
432
+ }
433
+
318
434
  void Init_rugged_remote_collection(void)
319
435
  {
320
436
  rb_cRuggedRemoteCollection = rb_define_class_under(rb_mRugged, "RemoteCollection", rb_cObject);
321
437
  rb_include_module(rb_cRuggedRemoteCollection, rb_mEnumerable);
322
438
 
323
- rb_define_method(rb_cRuggedRemoteCollection, "initialize", rb_git_remote_collection_initialize, 1);
439
+ rb_define_method(rb_cRuggedRemoteCollection, "initialize", rb_git_remote_collection_initialize, 1);
440
+
441
+ rb_define_method(rb_cRuggedRemoteCollection, "[]", rb_git_remote_collection_aref, 1);
442
+
443
+ rb_define_method(rb_cRuggedRemoteCollection, "create", rb_git_remote_collection_create, 2);
444
+ rb_define_method(rb_cRuggedRemoteCollection, "create_anonymous", rb_git_remote_collection_create_anonymous, 1);
324
445
 
325
- rb_define_method(rb_cRuggedRemoteCollection, "[]", rb_git_remote_collection_aref, 1);
446
+ rb_define_method(rb_cRuggedRemoteCollection, "each", rb_git_remote_collection_each, 0);
447
+ rb_define_method(rb_cRuggedRemoteCollection, "each_name", rb_git_remote_collection_each_name, 0);
326
448
 
327
- rb_define_method(rb_cRuggedRemoteCollection, "create", rb_git_remote_collection_create, 2);
328
- rb_define_method(rb_cRuggedRemoteCollection, "create_anonymous", rb_git_remote_collection_create_anonymous, 1);
449
+ rb_define_method(rb_cRuggedRemoteCollection, "set_url", rb_git_remote_collection_set_url, 2);
450
+ rb_define_method(rb_cRuggedRemoteCollection, "set_push_url", rb_git_remote_collection_set_push_url, 2);
329
451
 
330
- rb_define_method(rb_cRuggedRemoteCollection, "each", rb_git_remote_collection_each, 0);
331
- rb_define_method(rb_cRuggedRemoteCollection, "each_name", rb_git_remote_collection_each_name, 0);
452
+ rb_define_method(rb_cRuggedRemoteCollection, "add_push_refspec", rb_git_remote_collection_add_push_refspec, 2);
453
+ rb_define_method(rb_cRuggedRemoteCollection, "add_fetch_refspec", rb_git_remote_collection_add_fetch_refspec, 2);
332
454
 
333
- rb_define_method(rb_cRuggedRemoteCollection, "rename", rb_git_remote_collection_rename, 2);
334
- rb_define_method(rb_cRuggedRemoteCollection, "delete", rb_git_remote_collection_delete, 1);
455
+ rb_define_method(rb_cRuggedRemoteCollection, "rename", rb_git_remote_collection_rename, 2);
456
+ rb_define_method(rb_cRuggedRemoteCollection, "delete", rb_git_remote_collection_delete, 1);
335
457
  }