var fs = require('fs')
|
var minimatch = require('minimatch')
|
var pathUtils = require('path')
|
var entryComparator = require('./entryComparator')
|
|
var PATH_SEP = pathUtils.sep
|
|
module.exports = {
|
/**
|
* Returns the sorted list of entries in a directory.
|
*/
|
buildDirEntries: function (rootEntry, dirEntries, relativePath, options) {
|
var res = []
|
for (var i = 0; i < dirEntries.length; i++) {
|
var entryName = dirEntries[i]
|
var entryAbsolutePath = rootEntry.absolutePath + PATH_SEP + entryName
|
var entryPath = rootEntry.path + PATH_SEP + entryName
|
|
var entry = this.buildEntry(entryAbsolutePath, entryPath, entryName)
|
if (options.skipSymlinks && entry.isSymlink) {
|
entry.stat = undefined
|
}
|
|
if (filterEntry(entry, relativePath, options)) {
|
res.push(entry)
|
}
|
}
|
return res.sort((a, b) => entryComparator.compareEntry(a, b, options))
|
},
|
|
buildEntry: function (absolutePath, path, name) {
|
var stats = getStatIgnoreBrokenLink(absolutePath)
|
|
return {
|
name: name,
|
absolutePath: absolutePath,
|
path: path,
|
stat: stats.stat,
|
lstat: stats.lstat,
|
isSymlink: stats.lstat.isSymbolicLink(),
|
isBrokenLink: stats.isBrokenLink,
|
isDirectory: stats.stat.isDirectory()
|
}
|
},
|
|
}
|
|
|
function getStatIgnoreBrokenLink(absolutePath) {
|
var lstat = fs.lstatSync(absolutePath)
|
try {
|
return {
|
stat: fs.statSync(absolutePath),
|
lstat: lstat,
|
isBrokenLink: false
|
}
|
} catch (error) {
|
if (error.code === 'ENOENT') {
|
return {
|
stat: lstat,
|
lstat: lstat,
|
isBrokenLink: true
|
}
|
}
|
throw error
|
}
|
}
|
|
/**
|
* Filter entries by file name. Returns true if the file is to be processed.
|
*/
|
function filterEntry(entry, relativePath, options) {
|
if (entry.isSymlink && options.skipSymlinks) {
|
return false
|
}
|
var path = pathUtils.join(relativePath, entry.name)
|
|
if ((entry.stat.isFile() && options.includeFilter) && (!match(path, options.includeFilter))) {
|
return false
|
}
|
|
if ((options.excludeFilter) && (match(path, options.excludeFilter))) {
|
return false
|
}
|
|
return true
|
}
|
|
/**
|
* Matches path by pattern.
|
*/
|
function match(path, pattern) {
|
var patternArray = pattern.split(',')
|
for (var i = 0; i < patternArray.length; i++) {
|
var pat = patternArray[i]
|
if (minimatch(path, pat, { dot: true, matchBase: true })) { //nocase
|
return true
|
}
|
}
|
return false
|
}
|