Skip to content

Commit

Permalink
feature: pocelain: add unstaged
Browse files Browse the repository at this point in the history
  • Loading branch information
coderaiser committed Jun 14, 2023
1 parent fbb5cab commit 2e210f4
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 18 deletions.
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 '}];
Expand Down
15 changes: 11 additions & 4 deletions lib/porcelain.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ module.exports = (str, filter = {}) => {
untracked,
deleted,
renamed,
unstaged,
} = filter;

const files = parse(str);
Expand All @@ -25,6 +26,7 @@ module.exports = (str, filter = {}) => {
untracked,
deleted,
renamed,
unstaged,
});

const names = getNames(picked);
Expand Down Expand Up @@ -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)
Expand All @@ -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);

Expand All @@ -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,
}));
Expand Down
4 changes: 2 additions & 2 deletions test/fixture/deleted
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions test/fixture/modified
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
M lib/parse-header.js
MM package.json
?? lib/parse.js
31 changes: 24 additions & 7 deletions test/porclain.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@ 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('..');

test('porclain: deleted, modified, untracked', (t) => {
const result = porclain(deleted, {
deleted: true,
modified: true,
unstaged: true,
untracked: true,
});

Expand All @@ -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',
];
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2e210f4

Please sign in to comment.