Skip to content

Instantly share code, notes, and snippets.

@tobie
Forked from samleb/snippet.js
Created August 23, 2010 00:53
Show Gist options
  • Save tobie/544537 to your computer and use it in GitHub Desktop.
Save tobie/544537 to your computer and use it in GitHub Desktop.

Revisions

  1. tobie revised this gist Aug 23, 2010. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion snippet.js
    Original file line number Diff line number Diff line change
    @@ -11,7 +11,7 @@ function rmrf(file, callback) {

    fs.readdir(dir, function(err, files) {
    if (err) return callback(err);
    if (!files.length) return callback();
    if (!files.length) return fs.rmdir(dir, callback);

    var runner = TaskRunner(function(err) {
    err ? callback(err) : fs.rmdir(dir, callback);
  2. @samleb samleb created this gist Aug 23, 2010.
    80 changes: 80 additions & 0 deletions snippet.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,80 @@
    var sys = require('sys'),
    fs = require('fs'),
    path = require('path');

    function rmrf(file, callback) {
    fs.stat(file, function(err, stat) {
    if (err) return callback(err);
    if (stat.isFile()) return fs.unlink(file, callback);

    var dir = file;

    fs.readdir(dir, function(err, files) {
    if (err) return callback(err);
    if (!files.length) return callback();

    var runner = TaskRunner(function(err) {
    err ? callback(err) : fs.rmdir(dir, callback);
    });

    files.forEach(function(f) {
    runner.runTask(function(cont) {
    rmrf(path.join(file, f), cont);
    });
    });
    });
    });
    }

    function getFiles(dir, condition, callback) {
    var result = [],
    runner = TaskRunner(function(err) {
    callback(err, result);
    });

    function visit(dir) {
    runner.runTask(function(cont) {
    fs.stat(dir, function(err, stat) {
    if (err) return cont(err);
    if (!condition || condition.test(dir)) {
    result.push(dir);
    }
    if (stat.isFile()) return cont();
    fs.readdir(dir, function(err, files) {
    if (err) return cont(err);
    files.forEach(function(f) {
    visit(path.join(dir, f));
    });
    cont();
    });
    });
    })
    }

    visit(dir);
    }

    function TaskRunner(callback) {
    var remaining = 0,
    notified = false;

    function runTask(func) {
    remaining++;
    func(taskCompleted);
    }

    function taskCompleted(err) {
    if (notified) return;
    if (err) {
    notified = true;
    callback(err);
    } else if ((--remaining) == 0) {
    notified = true;
    callback();
    }
    }

    return {
    runTask: runTask
    };
    }