module Prj::FastTraverse
Public Class Methods
traverse(p1, p2)
click to toggle source
VALUE prj_fast_traverse_traverse_m(VALUE self, VALUE projects_root, VALUE search_nested_repositories) { FTS *fs = NULL; FTSENT *child = NULL; FTSENT *parent = NULL; VALUE parent_path, child_name; char *paths[] = { StringValueCStr(projects_root), NULL }; fs = fts_open(paths, FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOSTAT, NULL); if (fs == NULL) { return Qnil; } while ((parent = fts_read(fs)) != NULL) { child = fts_children(fs, 0); while(child != NULL) { parent_path = rb_str_new(parent->fts_path, parent->fts_pathlen); child_name = rb_str_new(child->fts_name, child->fts_namelen); if (child->fts_info == FTS_D && rb_block_given_p() && RTEST(rb_yield_values(2, parent_path, child_name))) { fts_set(fs, (RTEST(search_nested_repositories) ? child : parent), FTS_SKIP); } child = child->fts_link; } } fts_close(fs); return Qnil; }