Skip to content

Commit e8aadb0

Browse files
author
=
committed
Render 'No newline at end of file' at the end of files
For files missing a return character at the end of the file, the git warning will now be rendered instead of being stripped out of the block lines
1 parent 1350740 commit e8aadb0

File tree

6 files changed

+420
-16
lines changed

6 files changed

+420
-16
lines changed

src/__tests__/diff2html-tests.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,26 +157,32 @@ describe('Diff2Html', () => {
157157
"type": "delete",
158158
},
159159
{
160-
"content": "+ TokenRevoked, MissingToken,",
160+
"content": "\\ No newline at end of file",
161161
"newNumber": 53,
162+
"oldNumber": 55,
163+
"type": "context",
164+
},
165+
{
166+
"content": "+ TokenRevoked, MissingToken,",
167+
"newNumber": 54,
162168
"oldNumber": undefined,
163169
"type": "insert",
164170
},
165171
{
166172
"content": "+ IndexLock, RepositoryError, NotValidRepo, PullRequestNotMergeable, BranchError,",
167-
"newNumber": 54,
173+
"newNumber": 55,
168174
"oldNumber": undefined,
169175
"type": "insert",
170176
},
171177
{
172178
"content": "+ PluginError, CodeParserError, EngineError = Value",
173-
"newNumber": 55,
179+
"newNumber": 56,
174180
"oldNumber": undefined,
175181
"type": "insert",
176182
},
177183
{
178184
"content": "+}",
179-
"newNumber": 56,
185+
"newNumber": 57,
180186
"oldNumber": undefined,
181187
"type": "insert",
182188
},

src/__tests__/side-by-side-printer-tests.ts

Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,357 @@ describe('SideBySideRenderer', () => {
407407
`);
408408
});
409409

410+
it('should handle files without newlines at the end', () => {
411+
const exampleJson: DiffFile[] = [
412+
{
413+
blocks: [
414+
// Scenario 1: Old file missing newline, new file has newline
415+
{
416+
lines: [
417+
{
418+
content: '-oldLine1',
419+
type: LineType.DELETE,
420+
oldNumber: 1,
421+
newNumber: undefined,
422+
},
423+
{
424+
content: '\\ No newline at end of file',
425+
type: LineType.CONTEXT,
426+
oldNumber: 1,
427+
newNumber: 1,
428+
},
429+
{
430+
content: '+newLine1',
431+
type: LineType.INSERT,
432+
oldNumber: undefined,
433+
newNumber: 1,
434+
},
435+
],
436+
oldStartLine: 1,
437+
newStartLine: 1,
438+
header: '@@ -1 +1 @@',
439+
},
440+
// Scenario 2: Old file has newline, new file missing newline
441+
{
442+
lines: [
443+
{
444+
content: '-oldLine2',
445+
type: LineType.DELETE,
446+
oldNumber: 2,
447+
newNumber: undefined,
448+
},
449+
{
450+
content: '+newLine2',
451+
type: LineType.INSERT,
452+
oldNumber: undefined,
453+
newNumber: 2,
454+
},
455+
{
456+
content: '\\ No newline at end of file',
457+
type: LineType.CONTEXT,
458+
oldNumber: 2,
459+
newNumber: 2,
460+
},
461+
],
462+
oldStartLine: 2,
463+
newStartLine: 2,
464+
header: '@@ -2 +2 @@',
465+
},
466+
// Scenario 3: Both files missing newline
467+
{
468+
lines: [
469+
{
470+
content: '-oldLine3',
471+
type: LineType.DELETE,
472+
oldNumber: 3,
473+
newNumber: undefined,
474+
},
475+
{
476+
content: '\\ No newline at end of file',
477+
type: LineType.CONTEXT,
478+
oldNumber: 3,
479+
newNumber: 3,
480+
},
481+
{
482+
content: '+newLine3',
483+
type: LineType.INSERT,
484+
oldNumber: undefined,
485+
newNumber: 3,
486+
},
487+
{
488+
content: '\\ No newline at end of file',
489+
type: LineType.CONTEXT,
490+
oldNumber: 3,
491+
newNumber: 3,
492+
},
493+
],
494+
oldStartLine: 3,
495+
newStartLine: 3,
496+
header: '@@ -3 +3 @@',
497+
},
498+
],
499+
deletedLines: 3,
500+
addedLines: 3,
501+
oldName: 'sample',
502+
language: 'txt',
503+
newName: 'sample',
504+
isCombined: false,
505+
isGitDiff: true,
506+
},
507+
];
508+
509+
const hoganUtils = new HoganJsUtils({});
510+
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
511+
const html = sideBySideRenderer.render(exampleJson);
512+
expect(html).toMatchInlineSnapshot(`
513+
"<div class="d2h-wrapper d2h-light-color-scheme">
514+
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
515+
<div class="d2h-file-header">
516+
<span class="d2h-file-name-wrapper">
517+
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
518+
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
519+
</svg> <span class="d2h-file-name">sample</span>
520+
<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
521+
<label class="d2h-file-collapse">
522+
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
523+
Viewed
524+
</label>
525+
</div>
526+
<div class="d2h-files-diff">
527+
<div class="d2h-file-side-diff">
528+
<div class="d2h-code-wrapper">
529+
<table class="d2h-diff-table">
530+
<tbody class="d2h-diff-tbody">
531+
<tr>
532+
<td class="d2h-code-side-linenumber d2h-info"></td>
533+
<td class="d2h-info">
534+
<div class="d2h-code-side-line">@@ -1 +1 @@</div>
535+
</td>
536+
</tr><tr>
537+
<td class="d2h-code-side-linenumber d2h-del">
538+
1
539+
</td>
540+
<td class="d2h-del">
541+
<div class="d2h-code-side-line">
542+
<span class="d2h-code-line-prefix">-</span>
543+
<span class="d2h-code-line-ctn">oldLine1</span>
544+
</div>
545+
</td>
546+
</tr><tr>
547+
<td class="d2h-code-side-linenumber d2h-cntx">
548+
1
549+
</td>
550+
<td class="d2h-cntx">
551+
<div class="d2h-code-side-line">
552+
<span class="d2h-code-line-prefix">\\</span>
553+
<span class="d2h-code-line-ctn"> No newline at end of file</span>
554+
</div>
555+
</td>
556+
</tr><tr>
557+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
558+
559+
</td>
560+
<td class="d2h-cntx d2h-emptyplaceholder">
561+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
562+
<span class="d2h-code-line-prefix">&nbsp;</span>
563+
<span class="d2h-code-line-ctn"><br></span>
564+
</div>
565+
</td>
566+
</tr><tr>
567+
<td class="d2h-code-side-linenumber d2h-info"></td>
568+
<td class="d2h-info">
569+
<div class="d2h-code-side-line">@@ -2 +2 @@</div>
570+
</td>
571+
</tr><tr>
572+
<td class="d2h-code-side-linenumber d2h-del d2h-change">
573+
2
574+
</td>
575+
<td class="d2h-del d2h-change">
576+
<div class="d2h-code-side-line">
577+
<span class="d2h-code-line-prefix">-</span>
578+
<span class="d2h-code-line-ctn"><del>oldLine2</del></span>
579+
</div>
580+
</td>
581+
</tr><tr>
582+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
583+
584+
</td>
585+
<td class="d2h-cntx d2h-emptyplaceholder">
586+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
587+
<span class="d2h-code-line-prefix">&nbsp;</span>
588+
<span class="d2h-code-line-ctn"><br></span>
589+
</div>
590+
</td>
591+
</tr><tr>
592+
<td class="d2h-code-side-linenumber d2h-info"></td>
593+
<td class="d2h-info">
594+
<div class="d2h-code-side-line">@@ -3 +3 @@</div>
595+
</td>
596+
</tr><tr>
597+
<td class="d2h-code-side-linenumber d2h-del">
598+
3
599+
</td>
600+
<td class="d2h-del">
601+
<div class="d2h-code-side-line">
602+
<span class="d2h-code-line-prefix">-</span>
603+
<span class="d2h-code-line-ctn">oldLine3</span>
604+
</div>
605+
</td>
606+
</tr><tr>
607+
<td class="d2h-code-side-linenumber d2h-cntx">
608+
3
609+
</td>
610+
<td class="d2h-cntx">
611+
<div class="d2h-code-side-line">
612+
<span class="d2h-code-line-prefix">\\</span>
613+
<span class="d2h-code-line-ctn"> No newline at end of file</span>
614+
</div>
615+
</td>
616+
</tr><tr>
617+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
618+
619+
</td>
620+
<td class="d2h-cntx d2h-emptyplaceholder">
621+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
622+
<span class="d2h-code-line-prefix">&nbsp;</span>
623+
<span class="d2h-code-line-ctn"><br></span>
624+
</div>
625+
</td>
626+
</tr><tr>
627+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
628+
629+
</td>
630+
<td class="d2h-cntx d2h-emptyplaceholder">
631+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
632+
<span class="d2h-code-line-prefix">&nbsp;</span>
633+
<span class="d2h-code-line-ctn"><br></span>
634+
</div>
635+
</td>
636+
</tr>
637+
</tbody>
638+
</table>
639+
</div>
640+
</div>
641+
<div class="d2h-file-side-diff">
642+
<div class="d2h-code-wrapper">
643+
<table class="d2h-diff-table">
644+
<tbody class="d2h-diff-tbody">
645+
<tr>
646+
<td class="d2h-code-side-linenumber d2h-info"></td>
647+
<td class="d2h-info">
648+
<div class="d2h-code-side-line">&nbsp;</div>
649+
</td>
650+
</tr><tr>
651+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
652+
653+
</td>
654+
<td class="d2h-cntx d2h-emptyplaceholder">
655+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
656+
<span class="d2h-code-line-prefix">&nbsp;</span>
657+
<span class="d2h-code-line-ctn"><br></span>
658+
</div>
659+
</td>
660+
</tr><tr>
661+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
662+
663+
</td>
664+
<td class="d2h-cntx d2h-emptyplaceholder">
665+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
666+
<span class="d2h-code-line-prefix">&nbsp;</span>
667+
<span class="d2h-code-line-ctn"><br></span>
668+
</div>
669+
</td>
670+
</tr><tr>
671+
<td class="d2h-code-side-linenumber d2h-ins">
672+
1
673+
</td>
674+
<td class="d2h-ins">
675+
<div class="d2h-code-side-line">
676+
<span class="d2h-code-line-prefix">+</span>
677+
<span class="d2h-code-line-ctn">newLine1</span>
678+
</div>
679+
</td>
680+
</tr><tr>
681+
<td class="d2h-code-side-linenumber d2h-info"></td>
682+
<td class="d2h-info">
683+
<div class="d2h-code-side-line">&nbsp;</div>
684+
</td>
685+
</tr><tr>
686+
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
687+
2
688+
</td>
689+
<td class="d2h-ins d2h-change">
690+
<div class="d2h-code-side-line">
691+
<span class="d2h-code-line-prefix">+</span>
692+
<span class="d2h-code-line-ctn"><ins>newLine2</ins></span>
693+
</div>
694+
</td>
695+
</tr><tr>
696+
<td class="d2h-code-side-linenumber d2h-cntx">
697+
2
698+
</td>
699+
<td class="d2h-cntx">
700+
<div class="d2h-code-side-line">
701+
<span class="d2h-code-line-prefix">\\</span>
702+
<span class="d2h-code-line-ctn"> No newline at end of file</span>
703+
</div>
704+
</td>
705+
</tr><tr>
706+
<td class="d2h-code-side-linenumber d2h-info"></td>
707+
<td class="d2h-info">
708+
<div class="d2h-code-side-line">&nbsp;</div>
709+
</td>
710+
</tr><tr>
711+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
712+
713+
</td>
714+
<td class="d2h-cntx d2h-emptyplaceholder">
715+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
716+
<span class="d2h-code-line-prefix">&nbsp;</span>
717+
<span class="d2h-code-line-ctn"><br></span>
718+
</div>
719+
</td>
720+
</tr><tr>
721+
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
722+
723+
</td>
724+
<td class="d2h-cntx d2h-emptyplaceholder">
725+
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
726+
<span class="d2h-code-line-prefix">&nbsp;</span>
727+
<span class="d2h-code-line-ctn"><br></span>
728+
</div>
729+
</td>
730+
</tr><tr>
731+
<td class="d2h-code-side-linenumber d2h-ins">
732+
3
733+
</td>
734+
<td class="d2h-ins">
735+
<div class="d2h-code-side-line">
736+
<span class="d2h-code-line-prefix">+</span>
737+
<span class="d2h-code-line-ctn">newLine3</span>
738+
</div>
739+
</td>
740+
</tr><tr>
741+
<td class="d2h-code-side-linenumber d2h-cntx">
742+
3
743+
</td>
744+
<td class="d2h-cntx">
745+
<div class="d2h-code-side-line">
746+
<span class="d2h-code-line-prefix">\\</span>
747+
<span class="d2h-code-line-ctn"> No newline at end of file</span>
748+
</div>
749+
</td>
750+
</tr>
751+
</tbody>
752+
</table>
753+
</div>
754+
</div>
755+
</div>
756+
</div>
757+
</div>"
758+
`);
759+
});
760+
410761
it('should work for too big file diff', () => {
411762
const exampleJson = [
412763
{

0 commit comments

Comments
 (0)