diff --git a/README.md b/README.md index f3a679f..77a2ed0 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,12 @@ const files = parse(stdout); [{name: 'README.md', mode: ' M '}, {name: '1.js', mode: '?'}]; const modifiedFiles = pick(files, { - modified: true, - untracked: false, // default - deleted: false, // default - added: false, // default - renamed: false, // default + modified: false, + untracked: false, + deleted: false, + added: default, + renamed: false, + unstaged: false, }); // returns [{name: 'README.md', mode: ' M '}]; diff --git a/lib/porcelain.js b/lib/porcelain.js index 877a77f..0997334 100644 --- a/lib/porcelain.js +++ b/lib/porcelain.js @@ -16,6 +16,7 @@ module.exports = (str, filter = {}) => { untracked, deleted, renamed, + unstaged, } = filter; const files = parse(str); @@ -25,6 +26,7 @@ module.exports = (str, filter = {}) => { untracked, deleted, renamed, + unstaged, }); const names = getNames(picked); @@ -100,13 +102,14 @@ function parseLine(line) { }; } -const isModified = ({mode}) => /M/.test(mode); -const isAdded = ({mode}) => /A/.test(mode); +const isModified = ({mode}) => mode === 'M ' || mode === 'MM '; +const isAdded = ({mode}) => mode === 'A '; const isRenamed = ({mode}) => /R/.test(mode); const isDeleted = ({mode}) => /D/.test(mode); const isUntracked = ({mode}) => /\?/.test(mode); +const isUnstaged = ({mode}) => mode === ' M '; -const check = ({added, modified, untracked, deleted, renamed}) => (file) => { +const check = ({added, modified, untracked, unstaged, deleted, renamed}) => (file) => { let is = false; if (added) @@ -118,6 +121,9 @@ const check = ({added, modified, untracked, deleted, renamed}) => (file) => { if (untracked) is = is || isUntracked(file); + if (unstaged) + is = is || isUnstaged(file); + if (deleted) is = is || isDeleted(file); @@ -128,11 +134,12 @@ const check = ({added, modified, untracked, deleted, renamed}) => (file) => { }; module.exports.pick = pick; -function pick(files, {added, modified, deleted, untracked, renamed}) { +function pick(files, {added, modified, deleted, untracked, unstaged, renamed}) { return files.filter(check({ added, modified, untracked, + unstaged, deleted, renamed, })); diff --git a/test/fixture/deleted b/test/fixture/deleted index beb1f20..9093152 100644 --- a/test/fixture/deleted +++ b/test/fixture/deleted @@ -1,8 +1,8 @@ - D lib/entry.json +AD lib/entry.json D lib/header.json D lib/parse-entries.js D lib/parse-entry.js D lib/parse-git-index.js - D lib/parse-header.js +A lib/parse-header.js M package.json ?? lib/parse.js diff --git a/test/fixture/modified b/test/fixture/modified new file mode 100644 index 0000000..4756b7f --- /dev/null +++ b/test/fixture/modified @@ -0,0 +1,3 @@ +M lib/parse-header.js +MM package.json +?? lib/parse.js diff --git a/test/porclain.js b/test/porclain.js index 514bff9..0bd1aea 100644 --- a/test/porclain.js +++ b/test/porclain.js @@ -6,9 +6,12 @@ const child_process = require('child_process'); const {reRequire} = require('mock-require'); -const deleted = readFileSync(join(__dirname, 'fixture', 'deleted'), 'utf8'); -const untracked = readFileSync(join(__dirname, 'fixture', 'untracked'), 'utf8'); -const renamed = readFileSync(join(__dirname, 'fixture', 'renamed'), 'utf8'); +const readFixture = (a) => readFileSync(join(__dirname, 'fixture', a), 'utf8'); + +const deleted = readFixture('deleted'); +const untracked = readFixture('untracked'); +const renamed = readFixture('renamed'); +const modified = readFixture('modified'); const {test, stub} = require('supertape'); const porclain = require('..'); @@ -16,7 +19,7 @@ const porclain = require('..'); test('porclain: deleted, modified, untracked', (t) => { const result = porclain(deleted, { deleted: true, - modified: true, + unstaged: true, untracked: true, }); @@ -26,7 +29,6 @@ test('porclain: deleted, modified, untracked', (t) => { 'lib/parse-entries.js', 'lib/parse-entry.js', 'lib/parse-git-index.js', - 'lib/parse-header.js', 'package.json', 'lib/parse.js', ]; @@ -35,12 +37,28 @@ test('porclain: deleted, modified, untracked', (t) => { t.end(); }); +test('porclain: modified', (t) => { + const result = porclain(modified, { + modified: true, + }); + + const expected = [ + 'lib/parse-header.js', + 'package.json', + ]; + + t.deepEqual(result, expected); + t.end(); +}); + test('porclain: added', (t) => { const result = porclain(deleted, { added: true, }); - const expected = []; + const expected = [ + 'lib/parse-header.js', + ]; t.deepEqual(result, expected); t.end(); @@ -70,7 +88,6 @@ test('porclain: deleted', (t) => { 'lib/parse-entries.js', 'lib/parse-entry.js', 'lib/parse-git-index.js', - 'lib/parse-header.js', ]; t.deepEqual(result, expected);