mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	Backport #14804 * CutDiffAroundLine makes the incorrect assumption that `---` and `+++` always represent part of the header of a diff. This PR adds a flag to its parsing to prevent this problem and adds a streaming parsing technique to CutDiffAroundLine using an io.pipe instead of just sending data to an unbounded buffer. Fix #14711 * Handle unquoted comment patch files When making comment patches unfortunately the patch does not always quote the filename This makes the diff --git header ambiguous again. This PR finally adds handling for ambiguity in to parse patch Fix #14812 * Add in testing for no error There is no way currently for CutDiffAroundLine in this test to cause an error however, it should still be tested. Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		| @@ -23,8 +23,28 @@ const exampleDiff = `diff --git a/README.md b/README.md | ||||
| + cut off | ||||
| + cut off` | ||||
|  | ||||
| const breakingDiff = `diff --git a/aaa.sql b/aaa.sql | ||||
| index d8e4c92..19dc8ad 100644 | ||||
| --- a/aaa.sql | ||||
| +++ b/aaa.sql | ||||
| @@ -1,9 +1,10 @@ | ||||
|  --some comment | ||||
| --- some comment 5 | ||||
| +--some coment 2 | ||||
| +-- some comment 3 | ||||
|  create or replace procedure test(p1 varchar2) | ||||
|  is | ||||
|  begin | ||||
| ---new comment | ||||
|  dbms_output.put_line(p1); | ||||
| +--some other comment | ||||
|  end; | ||||
|  / | ||||
| ` | ||||
|  | ||||
| func TestCutDiffAroundLine(t *testing.T) { | ||||
| 	result := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3) | ||||
| 	result, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3) | ||||
| 	assert.NoError(t, err) | ||||
| 	resultByLine := strings.Split(result, "\n") | ||||
| 	assert.Len(t, resultByLine, 7) | ||||
| 	// Check if headers got transferred | ||||
| @@ -37,18 +57,50 @@ func TestCutDiffAroundLine(t *testing.T) { | ||||
| 	assert.Equal(t, "+ Build Status", resultByLine[4]) | ||||
|  | ||||
| 	// Must be same result as before since old line 3 == new line 5 | ||||
| 	newResult := CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3) | ||||
| 	newResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, result, newResult, "Must be same result as before since old line 3 == new line 5") | ||||
|  | ||||
| 	newResult = CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 300) | ||||
| 	newResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 300) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, exampleDiff, newResult) | ||||
|  | ||||
| 	emptyResult := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0) | ||||
| 	emptyResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Empty(t, emptyResult) | ||||
|  | ||||
| 	// Line is out of scope | ||||
| 	emptyResult = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0) | ||||
| 	emptyResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Empty(t, emptyResult) | ||||
|  | ||||
| 	// Handle minus diffs properly | ||||
| 	minusDiff, err := CutDiffAroundLine(strings.NewReader(breakingDiff), 2, false, 4) | ||||
| 	assert.NoError(t, err) | ||||
|  | ||||
| 	expected := `diff --git a/aaa.sql b/aaa.sql | ||||
| --- a/aaa.sql | ||||
| +++ b/aaa.sql | ||||
| @@ -1,9 +1,10 @@ | ||||
|  --some comment | ||||
| --- some comment 5 | ||||
| +--some coment 2` | ||||
| 	assert.Equal(t, expected, minusDiff) | ||||
|  | ||||
| 	// Handle minus diffs properly | ||||
| 	minusDiff, err = CutDiffAroundLine(strings.NewReader(breakingDiff), 3, false, 4) | ||||
| 	assert.NoError(t, err) | ||||
|  | ||||
| 	expected = `diff --git a/aaa.sql b/aaa.sql | ||||
| --- a/aaa.sql | ||||
| +++ b/aaa.sql | ||||
| @@ -1,9 +1,10 @@ | ||||
|  --some comment | ||||
| --- some comment 5 | ||||
| +--some coment 2 | ||||
| +-- some comment 3` | ||||
|  | ||||
| 	assert.Equal(t, expected, minusDiff) | ||||
| } | ||||
|  | ||||
| func BenchmarkCutDiffAroundLine(b *testing.B) { | ||||
| @@ -69,7 +121,7 @@ func ExampleCutDiffAroundLine() { | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
| 	result := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3) | ||||
| 	result, _ := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3) | ||||
| 	println(result) | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user