Files
coopgo/node_modules/what-the-diff/src/diff.pegjs
sgauthier 6e64e138e2
All checks were successful
Publish To Prod / deploy_and_publish (push) Successful in 35s
planning
2024-10-14 09:15:30 +02:00

193 lines
5.7 KiB
JavaScript

{
function postProcessDiff (header, file_modes, patch, binary) {
let status
if (file_modes.old_mode && !file_modes.new_mode) {
return {
newPath: null,
oldPath: header.file_name,
newMode: null,
oldMode: file_modes.old_mode,
hunks: patch ? patch.hunks : [],
status: 'deleted',
binary: !!binary
}
} else if (!file_modes.old_mode && file_modes.new_mode) {
return {
oldPath: null,
newPath: header.file_name,
oldMode: null,
newMode: file_modes.new_mode,
hunks: patch ? patch.hunks : [],
status: 'added',
binary: !!binary
}
} else if (file_modes.old_mode && file_modes.new_mode) {
return {
newPath: header.file_name,
oldPath: header.file_name,
oldMode: file_modes.old_mode,
newMode: file_modes.new_mode,
hunks: patch ? patch.hunks : [],
status: 'modified',
binary: !!binary
}
} else {
throw new Error('file modes missing')
}
}
function postProcessMergeConflictDiff (filePath, patch, binary) {
patch = patch || {}
patch.filePath = filePath
patch.status = 'unmerged'
patch.binary = !!binary
return patch
}
function postProcessSimilarityDiff (rename_or_copy, similarity_index, old_file, new_file, file_modes, patch) {
const diff = {
oldPath: old_file,
newPath: new_file,
hunks: patch ? patch.hunks : [],
status: rename_or_copy === 'copy' ? 'copied' : 'renamed',
similarity: similarity_index,
}
if (file_modes) {
diff.oldMode = file_modes.old_mode
diff.newMode = file_modes.new_mode
}
return diff
}
}
diffs
= diffs:diff* { return diffs }
diff
= binary_merge_conflict_diff
/ rename_or_copy_diff
/ merge_conflict_diff
/ unmerged_path
/ binary_diff
/ regular_diff
binary_diff
= header:diff_header_line file_modes:file_mode_section? patch_header? binary_declaration { return postProcessDiff(header, file_modes, undefined, true) }
binary_declaration
= 'Binary files ' TEXT NL
regular_diff
= header:diff_header_line file_modes:file_mode_section? patch:patch? { return postProcessDiff(header, file_modes, patch) }
binary_merge_conflict_diff
= path:merge_conflict_header_line index_line binary_declaration { return postProcessMergeConflictDiff(path, undefined, true) }
rename_or_copy_diff
= rename_or_copy_diff_header_line modes:changed_file_modes? similarity:similarity_index copy_from:rename_copy_from copy_to:rename_copy_to
index_modes:index_line? patch:(binary_declaration / patch)?
{
return postProcessSimilarityDiff(copy_from.operation, similarity, copy_from.file, copy_to.file, modes || index_modes, patch)
}
merge_conflict_diff
= path:merge_conflict_header_line index_line patch:patch? { return postProcessMergeConflictDiff(path, patch) }
merge_conflict_header_line
= 'diff --cc ' path:TEXT NL { return path }
unmerged_path
= '* Unmerged path ' path:TEXT NL { return postProcessMergeConflictDiff(path) }
patch
= header:patch_header hunks:hunk* { return {hunks} }
patch_header
= '--- ' old_file_name:TEXT NL '+++ ' new_file_name:TEXT NL { return {old_file_name, new_file_name} }
hunk
= header:hunk_header lines:hunk_line+ {
return Object.assign({}, header, {
lines: lines
})
}
hunk_header
= merge_conflict_hunk_header
/ regular_hunk_header
merge_conflict_hunk_header
= '@@@ -' our_range:hunk_range ' -' base_range:hunk_range ' +' their_range:hunk_range ' @@@' context:TEXT? NL {
return {
ourStartLine: our_range.start,
ourLineCount: our_range.count,
theirStartLine: their_range.start,
theirLineCount: their_range.count,
baseStartLine: base_range.start,
baseLineCount: base_range.count,
heading: context ? context.trim() : '',
}
}
regular_hunk_header
= '@@ -' old_range:hunk_range ' +' new_range:hunk_range ' @@' context:TEXT? NL {
return {
oldStartLine: old_range.start,
oldLineCount: old_range.count,
newStartLine: new_range.start,
newLineCount: new_range.count,
heading: context ? context.trim() : '',
}
}
hunk_range
= start:NUMBER ',' count:NUMBER { return {start, count} }
/ start:NUMBER { return {start, count: 1} }
hunk_line
= chars:(('+' / '-' / ' ' / '\\') TEXT?) NL { return chars.join('') }
diff_header_line
= 'diff ' options:TEXT_NO_SPACES ' ' file_name:file_name_str NL { return {file_name} }
rename_or_copy_diff_header_line
= 'diff ' options:TEXT_NO_SPACES ' ' files_unused:TEXT NL
file_name_str
= str:TEXT { return str.substr(str.length/2 + 1) }
similarity_index
= 'similarity index ' idx:NUMBER '%' NL { return idx }
file_mode_section
= explicit_file_modes:(new_or_deleted_file_mode / changed_file_modes)? index_file_modes:index_line? { return explicit_file_modes || index_file_modes }
new_or_deleted_file_mode
= type:('new'/'deleted') ' file mode ' file_mode:TEXT NL {
if (type === 'new') return {old_mode: null, new_mode: file_mode}
else return {old_mode: file_mode, new_mode: null}
}
changed_file_modes
= 'old mode ' old_mode:TEXT NL 'new mode ' new_mode:TEXT NL { return {old_mode, new_mode} }
rename_copy_from
= operation:('rename' / 'copy') ' from ' file:TEXT NL { return {operation, file} }
rename_copy_to
= operation:('rename' / 'copy') ' to ' file:TEXT NL { return {operation, file} }
index_line
= 'index ' TEXT_NO_SPACES ' ' file_mode:TEXT NL { return {old_mode: file_mode, new_mode: file_mode} }
/ 'index ' TEXT_NO_SPACES NL
S = [ \t]
NL = ("\n" / "\r\n") / EOF
NLS = NL / S
EOF = !.
TEXT = chars:[^\r\n]+ { return chars.join('') }
TEXT_NO_SPACES = chars:[^ \t\r\n]+ { return chars.join('') }
NUMBER = chars:[0-9]+ { return parseInt(chars.join(''), 10) }