You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

diff_test.go 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package git
  4. import (
  5. "strings"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. const exampleDiff = `diff --git a/README.md b/README.md
  10. --- a/README.md
  11. +++ b/README.md
  12. @@ -1,3 +1,6 @@
  13. # gitea-github-migrator
  14. +
  15. + Build Status
  16. - Latest Release
  17. Docker Pulls
  18. + cut off
  19. + cut off`
  20. const breakingDiff = `diff --git a/aaa.sql b/aaa.sql
  21. index d8e4c92..19dc8ad 100644
  22. --- a/aaa.sql
  23. +++ b/aaa.sql
  24. @@ -1,9 +1,10 @@
  25. --some comment
  26. --- some comment 5
  27. +--some coment 2
  28. +-- some comment 3
  29. create or replace procedure test(p1 varchar2)
  30. is
  31. begin
  32. ---new comment
  33. dbms_output.put_line(p1);
  34. +--some other comment
  35. end;
  36. /
  37. `
  38. var issue17875Diff = `diff --git a/Geschäftsordnung.md b/Geschäftsordnung.md
  39. index d46c152..a7d2d55 100644
  40. --- a/Geschäftsordnung.md
  41. +++ b/Geschäftsordnung.md
  42. @@ -1,5 +1,5 @@
  43. ---
  44. -date: "23.01.2021"
  45. +date: "30.11.2021"
  46. ...
  47. ` + `
  48. # Geschäftsordnung
  49. @@ -16,4 +16,22 @@ Diese Geschäftsordnung regelt alle Prozesse des Vereins, solange diese nicht du
  50. ` + `
  51. ## § 3 Datenschutzverantwortlichkeit
  52. ` + `
  53. -1. Der Verein bestellt eine datenschutzverantwortliche Person mit den Aufgaben nach Artikel 39 DSGVO.
  54. \ No newline at end of file
  55. +1. Der Verein bestellt eine datenschutzverantwortliche Person mit den Aufgaben nach Artikel 39 DSGVO.
  56. +
  57. +## §4 Umgang mit der SARS-Cov-2-Pandemie
  58. +
  59. +1. Der Vorstand hat die Befugnis, in Rücksprache mit den Vereinsmitgliedern, verschiedene Hygienemaßnahmen für Präsenzveranstaltungen zu beschließen.
  60. +
  61. +2. Die Einführung, Änderung und Abschaffung dieser Maßnahmen sind nur zum Zweck der Eindämmung der SARS-Cov-2-Pandemie zulässig.
  62. +
  63. +3. Die Einführung, Änderung und Abschaffung von Maßnahmen nach Abs. 2 bedarf einer wissenschaftlichen Grundlage.
  64. +
  65. +4. Die Maßnahmen nach Abs. 2 setzen sich aus den folgenden Bausteinen inklusive einer ihrer Ausprägungen zusammen.
  66. +
  67. + 1. Maskenpflicht: Keine; Maskenpflicht, außer am Platz, oder wo Abstände nicht eingehalten werden können; Maskenpflicht, wenn Abstände nicht eingehalten werden können; Maskenpflicht
  68. +
  69. + 2. Geimpft-, Genesen- oder Testnachweis: Kein Nachweis notwendig; Nachweis, dass Person geimpft, genesen oder tagesaktuell getestet ist (3G); Nachweis, dass Person geimpft oder genesen ist (2G); Nachweis, dass Person geimpft bzw. genesen und tagesaktuell getestet ist (2G+)
  70. +
  71. + 3. Online-Veranstaltung: Keine, parallele Online-Veranstaltung, ausschließlich Online-Veranstaltung
  72. +
  73. +5. Bei Präsenzveranstungen gelten außerdem die Hygienevorschriften des Veranstaltungsorts. Bei Regelkollision greift die restriktivere Regel.
  74. \ No newline at end of file`
  75. func TestCutDiffAroundLineIssue17875(t *testing.T) {
  76. result, err := CutDiffAroundLine(strings.NewReader(issue17875Diff), 23, false, 3)
  77. assert.NoError(t, err)
  78. expected := `diff --git a/Geschäftsordnung.md b/Geschäftsordnung.md
  79. --- a/Geschäftsordnung.md
  80. +++ b/Geschäftsordnung.md
  81. @@ -20,0 +21,3 @@
  82. +## §4 Umgang mit der SARS-Cov-2-Pandemie
  83. +
  84. +1. Der Vorstand hat die Befugnis, in Rücksprache mit den Vereinsmitgliedern, verschiedene Hygienemaßnahmen für Präsenzveranstaltungen zu beschließen.`
  85. assert.Equal(t, expected, result)
  86. }
  87. func TestCutDiffAroundLine(t *testing.T) {
  88. result, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3)
  89. assert.NoError(t, err)
  90. resultByLine := strings.Split(result, "\n")
  91. assert.Len(t, resultByLine, 7)
  92. // Check if headers got transferred
  93. assert.Equal(t, "diff --git a/README.md b/README.md", resultByLine[0])
  94. assert.Equal(t, "--- a/README.md", resultByLine[1])
  95. assert.Equal(t, "+++ b/README.md", resultByLine[2])
  96. // Check if hunk header is calculated correctly
  97. assert.Equal(t, "@@ -2,2 +3,2 @@", resultByLine[3])
  98. // Check if line got transferred
  99. assert.Equal(t, "+ Build Status", resultByLine[4])
  100. // Must be same result as before since old line 3 == new line 5
  101. newResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
  102. assert.NoError(t, err)
  103. assert.Equal(t, result, newResult, "Must be same result as before since old line 3 == new line 5")
  104. newResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 300)
  105. assert.NoError(t, err)
  106. assert.Equal(t, exampleDiff, newResult)
  107. emptyResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0)
  108. assert.NoError(t, err)
  109. assert.Empty(t, emptyResult)
  110. // Line is out of scope
  111. emptyResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0)
  112. assert.NoError(t, err)
  113. assert.Empty(t, emptyResult)
  114. // Handle minus diffs properly
  115. minusDiff, err := CutDiffAroundLine(strings.NewReader(breakingDiff), 2, false, 4)
  116. assert.NoError(t, err)
  117. expected := `diff --git a/aaa.sql b/aaa.sql
  118. --- a/aaa.sql
  119. +++ b/aaa.sql
  120. @@ -1,9 +1,10 @@
  121. --some comment
  122. --- some comment 5
  123. +--some coment 2`
  124. assert.Equal(t, expected, minusDiff)
  125. // Handle minus diffs properly
  126. minusDiff, err = CutDiffAroundLine(strings.NewReader(breakingDiff), 3, false, 4)
  127. assert.NoError(t, err)
  128. expected = `diff --git a/aaa.sql b/aaa.sql
  129. --- a/aaa.sql
  130. +++ b/aaa.sql
  131. @@ -1,9 +1,10 @@
  132. --some comment
  133. --- some comment 5
  134. +--some coment 2
  135. +-- some comment 3`
  136. assert.Equal(t, expected, minusDiff)
  137. }
  138. func BenchmarkCutDiffAroundLine(b *testing.B) {
  139. for n := 0; n < b.N; n++ {
  140. CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
  141. }
  142. }
  143. func ExampleCutDiffAroundLine() {
  144. const diff = `diff --git a/README.md b/README.md
  145. --- a/README.md
  146. +++ b/README.md
  147. @@ -1,3 +1,6 @@
  148. # gitea-github-migrator
  149. +
  150. + Build Status
  151. - Latest Release
  152. Docker Pulls
  153. + cut off
  154. + cut off`
  155. result, _ := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3)
  156. println(result)
  157. }
  158. func TestParseDiffHunkString(t *testing.T) {
  159. leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER")
  160. assert.EqualValues(t, 19, leftLine)
  161. assert.EqualValues(t, 3, leftHunk)
  162. assert.EqualValues(t, 19, rightLine)
  163. assert.EqualValues(t, 5, rightHunk)
  164. }