class Rugged::Walker
Public Class Methods
Create a new Walker
instance able to walk commits found in repository
, which is a Rugged::Repository
instance.
static VALUE rb_git_walker_new(VALUE klass, VALUE rb_repo) { git_repository *repo; git_revwalk *walk; int error; Data_Get_Struct(rb_repo, git_repository, repo); error = git_revwalk_new(&walk, repo); rugged_exception_check(error); return rugged_walker_new(klass, rb_repo, walk);; }
Create a Walker object, initialize it with the given options and perform a walk on the repository; the lifetime of the walker is bound to the call and it is immediately cleaned up after the walk is over. The following options are available: - +sort+: Sorting mode for the walk (or an OR combination of several sorting modes). - +show+: Tips of the repository that will be walked; this is necessary for the walk to yield any results. A tip can be a 40-char object ID, an existing +Rugged::Commit+ object, a reference, or an +Array+ of several of these (if you'd like to walk several tips in parallel). - +hide+: Same as +show+, but hides the given tips instead so they don't appear on the walk. - +oid_only+: if +true+, the walker will yield 40-char OIDs for each commit, instead of real +Rugged::Commit+ objects. Defaults to +false+. - +simplify+: if +true+, the walk will be simplified to the first parent of each commit. Example: Rugged::Walker.walk(repo, show: "92b22bbcb37caf4f6f53d30292169e84f5e4283b", sort: Rugged::SORT_DATE|Rugged::SORT_TOPO, oid_only: true) do |commit_oid| puts commit_oid end
generates:
92b22bbcb37caf4f6f53d30292169e84f5e4283b 6b750d5800439b502de669465b385e5f469c78b6 ef9207141549f4ffcd3c4597e270d32e10d0a6bc cb75e05f0f8ac3407fb3bd0ebd5ff07573b16c9f ...
static VALUE rb_git_walk(int argc, VALUE *argv, VALUE self) { VALUE rb_repo, rb_options; struct walk_options w; int exception = 0; RETURN_ENUMERATOR(self, argc, argv); rb_scan_args(argc, argv, "10:", &rb_repo, &rb_options); Data_Get_Struct(rb_repo, git_repository, w.repo); rugged_exception_check(git_revwalk_new(&w.walk, w.repo)); w.rb_owner = rb_repo; w.rb_options = rb_options; w.oid_only = 0; w.offset = 0; w.limit = UINT64_MAX; if (!NIL_P(w.rb_options)) rb_protect(load_all_options, (VALUE)&w, &exception); if (!exception) rb_protect(do_walk, (VALUE)&w, &exception); git_revwalk_free(w.walk); if (exception) rb_jump_tag(exception); return Qnil; }
Public Instance Methods
Returns the amount of objects a walker iterated over. If an argument or block is given this method delegates to +Enumerable#count+.
static VALUE rb_git_walker_count(int argc, VALUE *argv, VALUE self) { git_revwalk *walk; git_oid commit_oid; int error = 0; uint64_t count = 0; if (argc > 0 || rb_block_given_p()) return rb_call_super(argc, argv); Data_Get_Struct(self, git_revwalk, walk); while (((error = git_revwalk_next(&commit_oid, walk)) == 0) && ++count != UINT64_MAX); if (error != GIT_ITEROVER) rugged_exception_check(error); return ULONG2NUM(count); }
Perform the walk through the repository, yielding each one of the commits found as a Rugged::Commit
instance to block
.
If no block
is given, an Enumerator
will be returned.
The walker must have been previously set-up before a walk can be performed (i.e. at least one commit must have been pushed).
walker.push("92b22bbcb37caf4f6f53d30292169e84f5e4283b") walker.each { |commit| puts commit.oid }
generates:
92b22bbcb37caf4f6f53d30292169e84f5e4283b 6b750d5800439b502de669465b385e5f469c78b6 ef9207141549f4ffcd3c4597e270d32e10d0a6bc cb75e05f0f8ac3407fb3bd0ebd5ff07573b16c9f ...
static VALUE rb_git_walker_each(int argc, VALUE *argv, VALUE self) { return rb_git_walk_with_opts(argc, argv, self, 0); }
Perform the walk through the repository, yielding each one of the commit oids found as a String
to block
.
If no block
is given, an Enumerator
will be returned.
The walker must have been previously set-up before a walk can be performed (i.e. at least one commit must have been pushed).
walker.push("92b22bbcb37caf4f6f53d30292169e84f5e4283b") walker.each { |commit_oid| puts commit_oid }
generates:
92b22bbcb37caf4f6f53d30292169e84f5e4283b 6b750d5800439b502de669465b385e5f469c78b6 ef9207141549f4ffcd3c4597e270d32e10d0a6bc cb75e05f0f8ac3407fb3bd0ebd5ff07573b16c9f ...
static VALUE rb_git_walker_each_oid(int argc, VALUE *argv, VALUE self) { return rb_git_walk_with_opts(argc, argv, self, 1); }
Hide the given commit
(and all its parents) from the output in the revision walk.
static VALUE rb_git_walker_hide(VALUE self, VALUE rb_commit) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); push_commit(walk, rb_commit, 1); return Qnil; }
Push one new commit
to start the walk from. commit
must be a String
with the OID of a commit in the repository, or a Rugged::Commit
instance.
More than one commit may be pushed to the walker (to walk several branches simulataneously).
Duplicate pushed commits will be ignored; at least one commit must have been pushed as a starting point before the walk can begin.
walker.push("92b22bbcb37caf4f6f53d30292169e84f5e4283b")
static VALUE rb_git_walker_push(VALUE self, VALUE rb_commit) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); push_commit(walk, rb_commit, 0); return Qnil; }
static VALUE rb_git_walker_push_range(VALUE self, VALUE range) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); rugged_exception_check(git_revwalk_push_range(walk, StringValueCStr(range))); return Qnil; }
Remove all pushed and hidden commits and reset the walker
back into a blank state.
static VALUE rb_git_walker_reset(VALUE self) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); git_revwalk_reset(walk); return Qnil; }
Simplify the walk to the first parent of each commit.
static VALUE rb_git_walker_simplify_first_parent(VALUE self) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); git_revwalk_simplify_first_parent(walk); return Qnil; }
Change the sorting mode for the revision walk.
This will cause walker
to be reset.
static VALUE rb_git_walker_sorting(VALUE self, VALUE ruby_sort_mode) { git_revwalk *walk; Data_Get_Struct(self, git_revwalk, walk); git_revwalk_sorting(walk, FIX2INT(ruby_sort_mode)); return Qnil; }