Skip to content
Browse files

added walk functios

  • Loading branch information...
1 parent 4a2b034 commit 7e4de29e0da6d48b6e8a097253a9592963bab457 @coolaj86 committed Jul 26, 2012
Showing with 211 additions and 0 deletions.
  1. +1 −0 .gitignore
  2. +6 −0 .gitmodules
  3. +1 −0 node-walker
  4. +1 −0 walk
  5. +111 −0 walker/lib/walker.js
  6. +37 −0 walker/package.json
  7. +54 −0 walker/readme.md
View
1 .gitignore
@@ -0,0 +1 @@
+node_modules
View
6 .gitmodules
@@ -10,3 +10,9 @@
[submodule "rimraf"]
path = rimraf
url = git://github.com/isaacs/rimraf.git
+[submodule "walk"]
+ path = walk
+ url = git://github.com/coolaj86/node-walk.git
+[submodule "node-walker"]
+ path = node-walker
+ url = git://github.com/klovadis/node-walker.git
1 node-walker
@@ -0,0 +1 @@
+Subproject commit 9f841643a6a7929425815208759ba66efd8681d9
1 walk
@@ -0,0 +1 @@
+Subproject commit a26de5a66ce8cc05ac83dcadace7a01f873282ad
View
111 walker/lib/walker.js
@@ -0,0 +1,111 @@
+module.exports = Walker
+
+var path = require('path')
+ , fs = require('fs')
+ , util = require('util')
+ , EventEmitter = require('events').EventEmitter
+ , makeError = require('makeerror')
+
+/**
+ * To walk a directory. It's complicated (but it's async, so it must be fast).
+ *
+ * @param root {String} the directory to start with
+ */
+function Walker(root) {
+ if (!(this instanceof Walker)) return new Walker(root)
+ EventEmitter.call(this)
+ this._pending = 0
+ this._filterDir = function() { return true }
+ this.go(root)
+}
+util.inherits(Walker, EventEmitter)
+
+/**
+ * Errors of this type are thrown when the type of a file could not be
+ * determined.
+ */
+UnknownFileTypeError = Walker.UnknownFileTypeError = makeError(
+ 'UnknownFileTypeError',
+ 'The type of this file could not be determined.'
+)
+
+/**
+ * Setup a function to filter out directory entries.
+ *
+ * @param fn {Function} a function that will be given a directory name, which
+ * if returns true will include the directory and it's children
+ */
+Walker.prototype.filterDir = function(fn) {
+ this._filterDir = fn
+ return this
+}
+
+/**
+ * Process a file or directory.
+ */
+Walker.prototype.go = function(entry) {
+ var that = this
+ this._pending++
+
+ fs.lstat(entry, function(er, stat) {
+ if (er) {
+ that.emit('error', er, entry, stat)
+ that.doneOne()
+ return
+ }
+
+ if (stat.isDirectory()) {
+ if (!that._filterDir(entry, stat)) {
+ that.doneOne()
+ } else {
+ fs.readdir(entry, function(er, files) {
+ if (er) {
+ that.emit('error', er, entry, stat)
+ that.doneOne()
+ return
+ }
+
+ that.emit('entry', entry, stat)
+ that.emit('dir', entry, stat)
+ files.forEach(function(part) {
+ that.go(path.join(entry, part))
+ })
+ that.doneOne()
+ })
+ }
+ } else if (stat.isSymbolicLink()) {
+ that.emit('entry', entry, stat)
+ that.emit('symlink', entry, stat)
+ that.doneOne()
+ } else if (stat.isBlockDevice()) {
+ that.emit('entry', entry, stat)
+ that.emit('blockDevice', entry, stat)
+ that.doneOne()
+ } else if (stat.isCharacterDevice()) {
+ that.emit('entry', entry, stat)
+ that.emit('characterDevice', entry, stat)
+ that.doneOne()
+ } else if (stat.isFIFO()) {
+ that.emit('entry', entry, stat)
+ that.emit('fifo', entry, stat)
+ that.doneOne()
+ } else if (stat.isSocket()) {
+ that.emit('entry', entry, stat)
+ that.emit('socket', entry, stat)
+ that.doneOne()
+ } else if (stat.isFile()) {
+ that.emit('entry', entry, stat)
+ that.emit('file', entry, stat)
+ that.doneOne()
+ } else {
+ that.emit('error', UnknownFileTypeError(), entry, stat)
+ that.doneOne()
+ }
+ })
+ return this
+}
+
+Walker.prototype.doneOne = function() {
+ if (--this._pending === 0) this.emit('end')
+ return this
+}
View
37 walker/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "walker",
+ "description": "A simple directory tree walker.",
+ "version": "1.0.3",
+ "homepage": "https://github.com/nshah/nodejs-walker",
+ "author": {
+ "name": "Naitik Shah",
+ "email": "n@daaku.org"
+ },
+ "keywords": [
+ "utils",
+ "fs",
+ "filesystem"
+ ],
+ "main": "lib/walker",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/nshah/nodejs-walker"
+ },
+ "scripts": {
+ "test": "./node_modules/.bin/expresso -c"
+ },
+ "dependencies": {
+ "makeerror": ">= 1.0.0"
+ },
+ "devDependencies": {
+ "expresso": ">= 0.8.1"
+ },
+ "engines": {
+ "node": ">= 0.4.1"
+ },
+ "_id": "walker@1.0.3",
+ "dist": {
+ "shasum": "2db304b51118f3ec5455f36c5b3d0edddb4fa2fe"
+ },
+ "_from": "walker"
+}
View
54 walker/readme.md
@@ -0,0 +1,54 @@
+Used to be at <https://github.com/nshah/node-walker>
+
+walker
+======
+
+A nodejs directory walker. Broadcasts events for various file types as well as
+a generic "entry" event for all types and provides the ability to prune
+directory trees. This shows the entire API; everything is optional:
+
+```javascript
+Walker('/etc/')
+ .filterDir(function(dir, stat) {
+ if (dir === '/etc/pam.d') {
+ console.warn('Skipping /etc/pam.d and children')
+ return false
+ }
+ return true
+ })
+ .on('entry', function(entry, stat) {
+ console.log('Got entry: ' + entry)
+ })
+ .on('dir', function(dir, stat) {
+ console.log('Got directory: ' + dir)
+ })
+ .on('file', function(file, stat) {
+ console.log('Got file: ' + file)
+ })
+ .on('symlink', function(symlink, stat) {
+ console.log('Got symlink: ' + symlink)
+ })
+ .on('blockDevice', function(blockDevice, stat) {
+ console.log('Got blockDevice: ' + blockDevice)
+ })
+ .on('fifo', function(fifo, stat) {
+ console.log('Got fifo: ' + fifo)
+ })
+ .on('socket', function(socket, stat) {
+ console.log('Got socket: ' + socket)
+ })
+ .on('characterDevice', function(characterDevice, stat) {
+ console.log('Got characterDevice: ' + characterDevice)
+ })
+ .on('error', function(er, entry, stat) {
+ console.log('Got error ' + er + ' on entry ' + entry)
+ })
+ .on('end', function() {
+ console.log('All files traversed.')
+ })
+```
+
+You specify a root directory to walk and optionally specify a function to prune
+sub-directory trees via the `filterDir` function. The Walker exposes a number
+of events, broadcasting various file type events a generic error event and
+finally the event to signal the end of the process.

0 comments on commit 7e4de29

Please sign in to comment.
Something went wrong with that request. Please try again.