Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: add new files
  • Loading branch information
yeonjuan committed Oct 17, 2021
commit 460d8164d665fae460e56a99fd62f03d59e9146a
113 changes: 113 additions & 0 deletions src/parser/__snapshots__/parse-git-diff.test.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`parseGitDiff should parse new file. 1`] = `
Object {
"files": Array [
Object {
"chunks": Array [
Object {
"changes": Array [
Object {
"content": "{",
"lineAfter": 1,
"type": "Added",
},
Object {
"content": " \\"name\\": \\"parse-git-diff-test\\",",
"lineAfter": 2,
"type": "Added",
},
Object {
"content": " \\"version\\": \\"1.0.0\\",",
"lineAfter": 3,
"type": "Added",
},
Object {
"content": " \\"description\\": \\"\\",",
"lineAfter": 4,
"type": "Added",
},
Object {
"content": " \\"main\\": \\"index.js\\",",
"lineAfter": 5,
"type": "Added",
},
Object {
"content": " \\"scripts\\": {",
"lineAfter": 6,
"type": "Added",
},
Object {
"content": " \\"build\\": \\"tsc\\"",
"lineAfter": 7,
"type": "Added",
},
Object {
"content": " },",
"lineAfter": 8,
"type": "Added",
},
Object {
"content": " \\"author\\": \\"\\",",
"lineAfter": 9,
"type": "Added",
},
Object {
"content": " \\"license\\": \\"ISC\\",",
"lineAfter": 10,
"type": "Added",
},
Object {
"content": " \\"dependencies\\": {",
"lineAfter": 11,
"type": "Added",
},
Object {
"content": " \\"parse-git-diff\\": \\"0.0.3\\"",
"lineAfter": 12,
"type": "Added",
},
Object {
"content": " },",
"lineAfter": 13,
"type": "Added",
},
Object {
"content": " \\"devDependencies\\": {",
"lineAfter": 14,
"type": "Added",
},
Object {
"content": " \\"typescript\\": \\"^4.4.4\\"",
"lineAfter": 15,
"type": "Added",
},
Object {
"content": " }",
"lineAfter": 16,
"type": "Added",
},
Object {
"content": "}",
"lineAfter": 17,
"type": "Added",
},
],
"rangeAfter": Object {
"lines": 17,
"start": 1,
},
"rangeBefore": Object {
"lines": 0,
"start": 0,
},
"type": "Chunk",
},
],
"path": "parse-git-diff-test/packages.json",
"type": "AddedFile",
},
],
"type": "GitDiff",
}
`;
16 changes: 11 additions & 5 deletions src/parser/parse-extended-header.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ import type Context from './context';
const UNHANDLED_EXTENDED_HEADERS = new Set([
'index',
'old',
'new',
'copy',
'rename',
'similarity',
'dissimilarity',
]);

const startsWith = (str: string, target: string) => {
return str.indexOf(target) === 0;
};

export default function parseExtendedHeader(ctx: Context) {
const line = ctx.getCurLine();
const type = line.slice(0, line.indexOf(' '));
Expand All @@ -20,10 +23,13 @@ export default function parseExtendedHeader(ctx: Context) {
type: 'unhandled',
};
}
switch (type) {
case 'deleted':
ctx.nextLine();
return 'deleted';
if (startsWith(line, 'deleted ')) {
ctx.nextLine();
return 'deleted';
} else if (startsWith(line, 'new file ')) {
ctx.nextLine();
return 'new file';
}

return null;
}
8 changes: 8 additions & 0 deletions src/parser/parse-file-changes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@ function parseFileChange(ctx: Context): AnyFileChange | undefined {
ctx.nextLine();

let isDeleted = false;
let isNew = false;
while (!ctx.isEof()) {
const extHeader = parseExtendedHeader(ctx);
if (!extHeader) {
break;
}
if (extHeader === 'deleted') isDeleted = true;
if (extHeader === 'new file') isNew = true;
}

const changeMarkers = parseChangeMarkers(ctx);
Expand All @@ -45,6 +47,12 @@ function parseFileChange(ctx: Context): AnyFileChange | undefined {
chunks,
path: changeMarkers.deleted,
};
} else if (isNew) {
return {
type: 'AddedFile',
chunks,
path: changeMarkers.added,
};
} else {
return {
type: 'ChangedFile',
Expand Down
37 changes: 37 additions & 0 deletions src/parser/parse-git-diff.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { createContext } from '../test-utils';
import parseGitDiff from './parse-git-diff';

describe('parseGitDiff', () => {
it('should parse new file.', () => {
// prettier-ignore
const src =
`diff --git a/parse-git-diff-test/packages.json b/parse-git-diff-test/packages.json
new file mode 100644
index 0000000..5515040
--- /dev/null
+++ b/parse-git-diff-test/packages.json
@@ -0,0 +1,17 @@
+{
+ "name": "parse-git-diff-test",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "build": "tsc"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "parse-git-diff": "0.0.3"
+ },
+ "devDependencies": {
+ "typescript": "^4.4.4"
+ }
+}`;

const result = parseGitDiff(src);

expect(result).not.toBe(null);
expect(result).toMatchSnapshot();
});
});
4 changes: 2 additions & 2 deletions src/parser/parse-git-diff.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import parseFileChanges from './parse-file-changes';

export default function parseGitDiff(diff: string): GitDiff {
const ctx = new Context(diff);
const changedFiles = parseFileChanges(ctx);
const files = parseFileChanges(ctx);

return {
type: 'GitDiff',
changedFiles,
files,
};
}
4 changes: 2 additions & 2 deletions src/types/changes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ export interface DeletedFile extends BaseFileChange<'DeletedFile'> {
}

export interface RenamedFile extends BaseFileChange<'RenamedFile'> {
from: string;
to: string;
pathBefore: string;
pathAfter: string;
}

export type AnyFileChange = ChangedFile | AddedFile | DeletedFile | RenamedFile;
Expand Down
2 changes: 1 addition & 1 deletion src/types/nodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import type { Base } from './common';
import type { AnyFileChange } from './changes';

export interface GitDiff extends Base<'GitDiff'> {
changedFiles: AnyFileChange[];
files: AnyFileChange[];
}