From 99580c10954c67bf3c6101bf1a4838dc202c0940 Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 20 Nov 2014 21:10:53 +0800 Subject: [PATCH] fix #24, unignore special dir or file --- cli/check.js | 18 +++++++++++------- cli/format.js | 4 +++- lib/ignored.js | 16 +++++++++++++--- lib/util.js | 6 ++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/cli/check.js b/cli/check.js index 6890d7b0..76e9781b 100644 --- a/cli/check.js +++ b/cli/check.js @@ -3,12 +3,13 @@ * @author chris */ -var fs = require('vinyl-fs'); +var fs = require('vinyl-fs'); -var util = require('../lib/util'); -var ignored = require('../lib/ignored'); -var jschecker = require('../lib/js/checker'); -var csschecker = require('../lib/css/checker'); +var util = require('../lib/util'); +var ignored = require('../lib/ignored'); +var jschecker = require('../lib/js/checker'); +var csschecker = require('../lib/css/checker'); +var htmlchecker = require('../lib/html/checker'); /** * 不同的输入流处理 @@ -25,11 +26,14 @@ var streams = { */ files: function (options) { var patterns = util.buildPattern(options._, options.type); + var specials = patterns.specials; + delete patterns.specials; return fs.src(patterns, {cwdbase: true}) - .pipe(ignored(options)) + .pipe(ignored(options, specials)) .pipe(jschecker(options)) - .pipe(csschecker(options)); + .pipe(csschecker(options)) + .pipe(htmlchecker(options)); }, /** diff --git a/cli/format.js b/cli/format.js index dca37bd9..3dbfda75 100644 --- a/cli/format.js +++ b/cli/format.js @@ -25,9 +25,11 @@ var streams = { */ files: function (options) { var patterns = util.buildPattern(options._, options.types); + var specials = patterns.specials; + delete patterns.specials; return fs.src(patterns, {cwdbase: true}) - .pipe(ignored(options)) + .pipe(ignored(options, specials)) .pipe(jsformatter(options)) .pipe(cssformatter(options)) .pipe(fs.dest(options.output)); diff --git a/lib/ignored.js b/lib/ignored.js index 43e01e56..fa5cb9e7 100644 --- a/lib/ignored.js +++ b/lib/ignored.js @@ -42,9 +42,10 @@ function load(filename, options) { * 根据 .fecsignore 与 --ignore 的规则过滤文件 * * @param {Object} options 配置项 + * @param {Array.} special 直接指定的目录或文件列表 * @return {Transform} 转换流 */ -module.exports = function (options) { +module.exports = function (options, specials) { var patterns = load(IGNORE_FILENAME, options); @@ -57,7 +58,11 @@ module.exports = function (options) { var filepath = file.relative.replace('\\', '/'); - var isIgnore = patterns.reduce(function(ignored, pattern) { + var isSpecial = specials.some(function (dirOrPath) { + return filepath.indexOf(dirOrPath) === 0; + }); + + var isIgnore = !isSpecial && patterns.reduce(function(ignored, pattern) { var negated = pattern[0] === '!'; var matches; @@ -66,8 +71,13 @@ module.exports = function (options) { } matches = minimatch(filepath, pattern) || minimatch(filepath, pattern + '/**'); + var result = matches ? !negated : ignored; + + if (options.debug && result) { + console.log('%s is ignored by %s.', filepath, pattern); + } - return matches ? !negated : ignored; + return result; }, false); cb(null, !isIgnore && file); diff --git a/lib/util.js b/lib/util.js index 14bfb293..3eba43e5 100644 --- a/lib/util.js +++ b/lib/util.js @@ -26,9 +26,12 @@ exports.buildPattern = function (dirs, extensions) { dirs = ['./']; } + var specials = []; var transform = function (dir) { if (fs.existsSync(dir)) { var stat = fs.statSync(dir); + specials.push(dir); + return stat.isDirectory() ? path.join(dir, '/') + '**/*.' + extensions : dir; @@ -39,6 +42,9 @@ exports.buildPattern = function (dirs, extensions) { var patterns = dirs.map(transform).filter(Boolean); patterns.push('!**/{node_modules,bower_components}/**'); + // HACK: CLI 中直接指定的文件或目录,可以不被 .fecsignore 忽略 + patterns.specials = specials; + return patterns; };