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;
}