Method: Rugged::Remote#fetch

Defined in:
ext/rugged/rugged_remote.c

#fetch(refspecs = nil, options = {}) ⇒ Hash

Downloads new data from the remote for the given refspecs and updates tips.

You can optionally pass in a single or multiple alternative refspecs to use instead of the fetch refspecs already configured for remote.

Returns a hash containing statistics for the fetch operation.

The following options can be passed in the options Hash:

:credentials

The credentials to use for the fetch operation. Can be either an instance of one of the Rugged::Credentials types, or a proc returning one of the former. The proc will be called with the url, the username from the url (if applicable) and a list of applicable credential types.

:headers

Extra HTTP headers to include with the request (only applies to http:// or https:// remotes)

:progress

A callback that will be executed with the textual progress received from the remote. This is the text send over the progress side-band (ie. the “counting objects” output).

:transfer_progress

A callback that will be executed to report clone progress information. It will be passed the amount of total_objects, indexed_objects, received_objects, local_objects, total_deltas, indexed_deltas and received_bytes.

:update_tips

A callback that will be executed each time a reference is updated locally. It will be passed the refname, old_oid and new_oid.

:certificate_check

A callback that will be executed each time we validate a certificate using https. It will be passed the valid, host_name and the callback should return a true/false to indicate if the certificate has been validated.

:message

The message to insert into the reflogs. Defaults to “fetch”.

:prune

Specifies the prune mode for the fetch. true remove any remote-tracking references that no longer exist, false do not prune, nil use configured settings Defaults to “nil”.

Example:

remote = Rugged::Remote.lookup(@repo, 'origin')
remote.fetch({
  transfer_progress: lambda { |total_objects, indexed_objects, received_objects, local_objects, total_deltas, indexed_deltas, received_bytes|
    # ...
  }
})

Returns:

  • (Hash)


581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
# File 'ext/rugged/rugged_remote.c', line 581

static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
{
  git_remote *remote;
  git_strarray refspecs;
  git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
  const git_transfer_progress *stats;
  struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, 0 };

  char *log_message = NULL;
  int error;

  VALUE rb_options, rb_refspecs, rb_result = Qnil;

  rb_scan_args(argc, argv, "01:", &rb_refspecs, &rb_options);

  rugged_rb_ary_to_strarray(rb_refspecs, &refspecs);

  Data_Get_Struct(self, git_remote, remote);

  rugged_remote_init_callbacks_and_payload_from_options(rb_options, &opts.callbacks, &payload);
  init_custom_headers(rb_options, &opts.custom_headers);

  if (!NIL_P(rb_options)) {
    VALUE rb_prune_type;
    VALUE rb_val = rb_hash_aref(rb_options, CSTR2SYM("message"));

    if (!NIL_P(rb_val))
      log_message = StringValueCStr(rb_val);

    rb_prune_type = rb_hash_aref(rb_options, CSTR2SYM("prune"));
    opts.prune = parse_prune_type(rb_prune_type);
  }

  error = git_remote_fetch(remote, &refspecs, &opts, log_message);

  xfree(refspecs.strings);
  xfree(opts.custom_headers.strings);

  if (payload.exception)
    rb_jump_tag(payload.exception);

  rugged_exception_check(error);

  stats = git_remote_stats(remote);

  rb_result = rb_hash_new();
  rb_hash_aset(rb_result, CSTR2SYM("total_objects"),    UINT2NUM(stats->total_objects));
  rb_hash_aset(rb_result, CSTR2SYM("indexed_objects"),  UINT2NUM(stats->indexed_objects));
  rb_hash_aset(rb_result, CSTR2SYM("received_objects"), UINT2NUM(stats->received_objects));
  rb_hash_aset(rb_result, CSTR2SYM("local_objects"),    UINT2NUM(stats->local_objects));
  rb_hash_aset(rb_result, CSTR2SYM("total_deltas"),     UINT2NUM(stats->total_deltas));
  rb_hash_aset(rb_result, CSTR2SYM("indexed_deltas"),   UINT2NUM(stats->indexed_deltas));
  rb_hash_aset(rb_result, CSTR2SYM("received_bytes"),   INT2FIX(stats->received_bytes));

  return rb_result;
}