132 lines
3.5 KiB
JavaScript
132 lines
3.5 KiB
JavaScript
module.exports = globSync
|
|
globSync.GlobSync = GlobSync
|
|
|
|
var rp = require('fs.realpath')
|
|
var minimatch = require('minimatch')
|
|
var Minimatch = minimatch.Minimatch
|
|
var Glob = require('./glob.js').Glob
|
|
var util = require('util')
|
|
var path = require('path')
|
|
var assert = require('assert')
|
|
var isAbsolute = require('path-is-absolute')
|
|
var common = require('./common.js')
|
|
var setopts = common.setopts
|
|
var ownProp = common.ownProp
|
|
var childrenIgnored = common.childrenIgnored
|
|
var isIgnored = common.isIgnored
|
|
|
|
function globSync (pattern, options) {
|
|
if (typeof options === 'function' || arguments.length === 3)
|
|
throw new TypeError('callback provided to sync glob\n'+
|
|
'See: https://github.com/isaacs/node-glob/issues/167')
|
|
|
|
return new GlobSync(pattern, options).found
|
|
}
|
|
|
|
function GlobSync (pattern, options) {
|
|
if (!pattern)
|
|
throw new Error('must provide pattern')
|
|
|
|
if (typeof options === 'function' || arguments.length === 3)
|
|
throw new TypeError('callback provided to sync glob\n'+
|
|
'See: https://github.com/isaacs/node-glob/issues/167')
|
|
|
|
if (!(this instanceof GlobSync))
|
|
return new GlobSync(pattern, options)
|
|
|
|
setopts(this, pattern, options)
|
|
|
|
if (this.noprocess)
|
|
return this
|
|
|
|
var n = this.minimatch.set.length
|
|
this.matches = new Array(n)
|
|
for (var i = 0; i < n; i ++) {
|
|
this._process(this.minimatch.set[i], i, false)
|
|
}
|
|
this._finish()
|
|
}
|
|
|
|
GlobSync.prototype._finish = function () {
|
|
assert.ok(this instanceof GlobSync)
|
|
if (this.realpath) {
|
|
var self = this
|
|
this.matches.forEach(function (matchset, index) {
|
|
var set = self.matches[index] = Object.create(null)
|
|
for (var p in matchset) {
|
|
try {
|
|
p = self._makeAbs(p)
|
|
var real = rp.realpathSync(p, self.realpathCache)
|
|
set[real] = true
|
|
} catch (er) {
|
|
if (er.syscall === 'stat')
|
|
set[self._makeAbs(p)] = true
|
|
else
|
|
throw er
|
|
}
|
|
}
|
|
})
|
|
}
|
|
common.finish(this)
|
|
}
|
|
|
|
|
|
GlobSync.prototype._process = function (pattern, index, inGlobStar) {
|
|
assert.ok(this instanceof GlobSync)
|
|
|
|
// Get the first [n] parts of pattern that are all strings.
|
|
var n = 0
|
|
while (typeof pattern[n] === 'string') {
|
|
n ++
|
|
}
|
|
// now n is the index of the first one that is *not* a string.
|
|
|
|
// See if there's anything else
|
|
var prefix
|
|
switch (n) {
|
|
// if not, then this is rather simple
|
|
case pattern.length:
|
|
this._processSimple(pattern.join('/'), index)
|
|
return
|
|
|
|
case 0:
|
|
// pattern *starts* with some non-trivial item.
|
|
// going to readdir(cwd), but not include the prefix in matches.
|
|
prefix = null
|
|
break
|
|
|
|
default:
|
|
// pattern has some string bits in the front.
|
|
// whatever it starts with, whether that's 'absolute' like /foo/bar,
|
|
// or 'relative' like '../baz'
|
|
prefix = pattern.slice(0, n).join('/')
|
|
break
|
|
}
|
|
|
|
var remain = pattern.slice(n)
|
|
|
|
// get the list of entries.
|
|
var read
|
|
if (prefix === null)
|
|
read = '.'
|
|
else if (isAbsolute(prefix) ||
|
|
isAbsolute(pattern.map(function (p) {
|
|
return typeof p === 'string' ? p : '[*]'
|
|
}).join('/'))) {
|
|
if (!prefix || !isAbsolute(prefix))
|
|
prefix = '/' + prefix
|
|
read = prefix
|
|
} else
|
|
read = prefix
|
|
|
|
var abs = this._makeAbs(read)
|
|
|
|
//if ignored, skip processing
|
|
if (childrenIgnored(this, read))
|
|
return
|
|
|
|
var isGlobStar = remain[0] === minimatch.GLOBSTAR
|
|
if (isGlobStar)
|
|
this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
|
|
else
|
|
this._processReaddir(p |