diff --git a/README.md b/README.md index a1e689d..7026358 100644 --- a/README.md +++ b/README.md @@ -468,6 +468,122 @@ index 0e05564..aa39060 100644 + + +```diff +diff --git a/rename.md b/rename.md +index 0e05564..aa39060 100644 +--- a/rename.md ++++ b/rename.md +@@ -1,2 +1 @@ + newfile +-newline ++newline +\ No newline at end of file +diff --git a/rename2.md b/rename2.md +index 0e05564..aa39060 100644 +--- a/rename2.md ++++ b/rename2.md +@@ -1,2 +1 @@ + newfile2 +-newline2 ++newline2 +\ No newline at end of file + +``` + + + + + +```json +{ + "type": "GitDiff", + "files": [ + { + "type": "ChangedFile", + "chunks": [ + { + "type": "Chunk", + "toFileRange": { + "start": 1, + "lines": 1 + }, + "fromFileRange": { + "start": 1, + "lines": 2 + }, + "changes": [ + { + "type": "UnchangedLine", + "lineBefore": 1, + "lineAfter": 1, + "content": "newfile" + }, + { + "type": "DeletedLine", + "lineBefore": 2, + "content": "newline" + }, + { + "type": "AddedLine", + "lineAfter": 2, + "content": "newline" + }, + { + "type": "MessageLine", + "content": "No newline at end of file" + } + ] + } + ], + "path": "rename.md" + }, + { + "type": "ChangedFile", + "chunks": [ + { + "type": "Chunk", + "toFileRange": { + "start": 1, + "lines": 1 + }, + "fromFileRange": { + "start": 1, + "lines": 2 + }, + "changes": [ + { + "type": "UnchangedLine", + "lineBefore": 1, + "lineAfter": 1, + "content": "newfile2" + }, + { + "type": "DeletedLine", + "lineBefore": 2, + "content": "newline2" + }, + { + "type": "AddedLine", + "lineAfter": 2, + "content": "newline2" + }, + { + "type": "MessageLine", + "content": "No newline at end of file" + } + ] + } + ], + "path": "rename2.md" + } + ] +} +``` + + + ## AST Format diff --git a/scripts/build-readme.js b/scripts/build-readme.js index 7fa2fe9..cc65372 100644 --- a/scripts/build-readme.js +++ b/scripts/build-readme.js @@ -13,6 +13,7 @@ const FIXTURES = [ 'conflict-file', 'new-line', 'deleted-line', + 'message-line', ]; let readmeReplacer = replacer().content(README_INPUT); diff --git a/src/__fixtures__/message-line b/src/__fixtures__/message-line new file mode 100644 index 0000000..64ba259 --- /dev/null +++ b/src/__fixtures__/message-line @@ -0,0 +1,18 @@ +diff --git a/rename.md b/rename.md +index 0e05564..aa39060 100644 +--- a/rename.md ++++ b/rename.md +@@ -1,2 +1 @@ + newfile +-newline ++newline +\ No newline at end of file +diff --git a/rename2.md b/rename2.md +index 0e05564..aa39060 100644 +--- a/rename2.md ++++ b/rename2.md +@@ -1,2 +1 @@ + newfile2 +-newline2 ++newline2 +\ No newline at end of file diff --git a/src/__tests__/__snapshots__/message-line.test.ts.snap b/src/__tests__/__snapshots__/message-line.test.ts.snap new file mode 100644 index 0000000..947245c --- /dev/null +++ b/src/__tests__/__snapshots__/message-line.test.ts.snap @@ -0,0 +1,87 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`message-line parse \`message-line\` 1`] = ` +{ + "files": [ + { + "chunks": [ + { + "changes": [ + { + "content": "newfile", + "lineAfter": 1, + "lineBefore": 1, + "type": "UnchangedLine", + }, + { + "content": "newline", + "lineBefore": 2, + "type": "DeletedLine", + }, + { + "content": "newline", + "lineAfter": 2, + "type": "AddedLine", + }, + { + "content": "No newline at end of file", + "type": "MessageLine", + }, + ], + "fromFileRange": { + "lines": 2, + "start": 1, + }, + "toFileRange": { + "lines": 1, + "start": 1, + }, + "type": "Chunk", + }, + ], + "path": "rename.md", + "type": "ChangedFile", + }, + { + "chunks": [ + { + "changes": [ + { + "content": "newfile2", + "lineAfter": 1, + "lineBefore": 1, + "type": "UnchangedLine", + }, + { + "content": "newline2", + "lineBefore": 2, + "type": "DeletedLine", + }, + { + "content": "newline2", + "lineAfter": 2, + "type": "AddedLine", + }, + { + "content": "No newline at end of file", + "type": "MessageLine", + }, + ], + "fromFileRange": { + "lines": 2, + "start": 1, + }, + "toFileRange": { + "lines": 1, + "start": 1, + }, + "type": "Chunk", + }, + ], + "path": "rename2.md", + "type": "ChangedFile", + }, + ], + "type": "GitDiff", +} +`; diff --git a/src/__tests__/message-line.test.ts b/src/__tests__/message-line.test.ts new file mode 100644 index 0000000..325a31d --- /dev/null +++ b/src/__tests__/message-line.test.ts @@ -0,0 +1,10 @@ +import { getFixture } from './test-utils'; +import parseGitDiff from '../parse-git-diff'; + +describe('message-line', () => { + const fixture = getFixture('message-line'); + + it('parse `message-line`', () => { + expect(parseGitDiff(fixture)).toMatchSnapshot(); + }); +}); diff --git a/src/constants.ts b/src/constants.ts index 3b4a77c..796196e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -2,6 +2,7 @@ export const LineType = { Added: 'AddedLine', Deleted: 'DeletedLine', Unchanged: 'UnchangedLine', + Message: 'MessageLine', } as const; export const FileType = { diff --git a/src/parse-git-diff.ts b/src/parse-git-diff.ts index 2e44dee..f12f648 100644 --- a/src/parse-git-diff.ts +++ b/src/parse-git-diff.ts @@ -244,6 +244,7 @@ const CHAR_TYPE_MAP: Record = { '+': LineType.Added, '-': LineType.Deleted, ' ': LineType.Unchanged, + '\\': LineType.Message, }; function parseChanges( @@ -291,6 +292,13 @@ function parseChanges( }; break; } + case LineType.Message: { + change = { + type, + content: content.trim(), + }; + break; + } } changes.push(change); } diff --git a/src/types.ts b/src/types.ts index 326f2ec..17ad5c6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -21,7 +21,15 @@ export interface UnchangedLine extends BaseChange { lineAfter: number; } -export type AnyLineChange = AddedLine | DeletedLine | UnchangedLine; +export interface MessageLine extends BaseChange { + content: string; +} + +export type AnyLineChange = + | AddedLine + | DeletedLine + | UnchangedLine + | MessageLine; export interface ChunkRange { start: number;