mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	Move git diff codes from models to services/gitdiff (#7889)
* move git diff codes from models to services/gitdiff * fix template * fix test * fix template
This commit is contained in:
		
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							b660a732ae
						
					
				
				
					commit
					c03d75fbd5
				
			
							
								
								
									
										197
									
								
								services/gitdiff/gitdiff_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								services/gitdiff/gitdiff_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package gitdiff | ||||
|  | ||||
| import ( | ||||
| 	"html/template" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
|  | ||||
| 	dmp "github.com/sergi/go-diff/diffmatchpatch" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func assertEqual(t *testing.T, s1 string, s2 template.HTML) { | ||||
| 	if s1 != string(s2) { | ||||
| 		t.Errorf("%s should be equal %s", s2, s1) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestDiffToHTML(t *testing.T) { | ||||
| 	assertEqual(t, "foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
| 		{Type: dmp.DiffEqual, Text: "foo "}, | ||||
| 		{Type: dmp.DiffInsert, Text: "bar"}, | ||||
| 		{Type: dmp.DiffDelete, Text: " baz"}, | ||||
| 		{Type: dmp.DiffEqual, Text: " biz"}, | ||||
| 	}, DiffLineAdd)) | ||||
|  | ||||
| 	assertEqual(t, "foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
| 		{Type: dmp.DiffEqual, Text: "foo "}, | ||||
| 		{Type: dmp.DiffDelete, Text: "bar"}, | ||||
| 		{Type: dmp.DiffInsert, Text: " baz"}, | ||||
| 		{Type: dmp.DiffEqual, Text: " biz"}, | ||||
| 	}, DiffLineDel)) | ||||
| } | ||||
|  | ||||
| const exampleDiff = `diff --git a/README.md b/README.md | ||||
| --- a/README.md | ||||
| +++ b/README.md | ||||
| @@ -1,3 +1,6 @@ | ||||
|  # gitea-github-migrator | ||||
| + | ||||
| + Build Status | ||||
| - Latest Release | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
|  | ||||
| func TestCutDiffAroundLine(t *testing.T) { | ||||
| 	result := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3) | ||||
| 	resultByLine := strings.Split(result, "\n") | ||||
| 	assert.Len(t, resultByLine, 7) | ||||
| 	// Check if headers got transferred | ||||
| 	assert.Equal(t, "diff --git a/README.md b/README.md", resultByLine[0]) | ||||
| 	assert.Equal(t, "--- a/README.md", resultByLine[1]) | ||||
| 	assert.Equal(t, "+++ b/README.md", resultByLine[2]) | ||||
| 	// Check if hunk header is calculated correctly | ||||
| 	assert.Equal(t, "@@ -2,2 +3,2 @@", resultByLine[3]) | ||||
| 	// Check if line got transferred | ||||
| 	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) | ||||
| 	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) | ||||
| 	assert.Equal(t, exampleDiff, newResult) | ||||
|  | ||||
| 	emptyResult := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0) | ||||
| 	assert.Empty(t, emptyResult) | ||||
|  | ||||
| 	// Line is out of scope | ||||
| 	emptyResult = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0) | ||||
| 	assert.Empty(t, emptyResult) | ||||
| } | ||||
|  | ||||
| func BenchmarkCutDiffAroundLine(b *testing.B) { | ||||
| 	for n := 0; n < b.N; n++ { | ||||
| 		CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ExampleCutDiffAroundLine() { | ||||
| 	const diff = `diff --git a/README.md b/README.md | ||||
| --- a/README.md | ||||
| +++ b/README.md | ||||
| @@ -1,3 +1,6 @@ | ||||
|  # gitea-github-migrator | ||||
| + | ||||
| + Build Status | ||||
| - Latest Release | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
| 	result := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3) | ||||
| 	println(result) | ||||
| } | ||||
|  | ||||
| func TestParsePatch(t *testing.T) { | ||||
| 	var diff = `diff --git "a/README.md" "b/README.md" | ||||
| --- a/README.md | ||||
| +++ b/README.md | ||||
| @@ -1,3 +1,6 @@ | ||||
|  # gitea-github-migrator | ||||
| + | ||||
| + Build Status | ||||
| - Latest Release | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
| 	result, err := ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff)) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("ParsePatch failed: %s", err) | ||||
| 	} | ||||
| 	println(result) | ||||
|  | ||||
| 	var diff2 = `diff --git "a/A \\ B" "b/A \\ B" | ||||
| --- "a/A \\ B" | ||||
| +++ "b/A \\ B" | ||||
| @@ -1,3 +1,6 @@ | ||||
|  # gitea-github-migrator | ||||
| + | ||||
| + Build Status | ||||
| - Latest Release | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
| 	result, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff2)) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("ParsePatch failed: %s", err) | ||||
| 	} | ||||
| 	println(result) | ||||
|  | ||||
| 	var diff3 = `diff --git a/README.md b/README.md | ||||
| --- a/README.md | ||||
| +++ b/README.md | ||||
| @@ -1,3 +1,6 @@ | ||||
|  # gitea-github-migrator | ||||
| + | ||||
| + Build Status | ||||
| - Latest Release | ||||
|  Docker Pulls | ||||
| + cut off | ||||
| + cut off` | ||||
| 	result, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff3)) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("ParsePatch failed: %s", err) | ||||
| 	} | ||||
| 	println(result) | ||||
| } | ||||
|  | ||||
| func setupDefaultDiff() *Diff { | ||||
| 	return &Diff{ | ||||
| 		Files: []*DiffFile{ | ||||
| 			{ | ||||
| 				Name: "README.md", | ||||
| 				Sections: []*DiffSection{ | ||||
| 					{ | ||||
| 						Lines: []*DiffLine{ | ||||
| 							{ | ||||
| 								LeftIdx:  4, | ||||
| 								RightIdx: 4, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
| func TestDiff_LoadComments(t *testing.T) { | ||||
| 	assert.NoError(t, models.PrepareTestDatabase()) | ||||
|  | ||||
| 	issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 2}).(*models.Issue) | ||||
| 	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 1}).(*models.User) | ||||
| 	diff := setupDefaultDiff() | ||||
| 	assert.NoError(t, diff.LoadComments(issue, user)) | ||||
| 	assert.Len(t, diff.Files[0].Sections[0].Lines[0].Comments, 2) | ||||
| } | ||||
|  | ||||
| func TestDiffLine_CanComment(t *testing.T) { | ||||
| 	assert.False(t, (&DiffLine{Type: DiffLineSection}).CanComment()) | ||||
| 	assert.False(t, (&DiffLine{Type: DiffLineAdd, Comments: []*models.Comment{{Content: "bla"}}}).CanComment()) | ||||
| 	assert.True(t, (&DiffLine{Type: DiffLineAdd}).CanComment()) | ||||
| 	assert.True(t, (&DiffLine{Type: DiffLineDel}).CanComment()) | ||||
| 	assert.True(t, (&DiffLine{Type: DiffLinePlain}).CanComment()) | ||||
| } | ||||
|  | ||||
| func TestDiffLine_GetCommentSide(t *testing.T) { | ||||
| 	assert.Equal(t, "previous", (&DiffLine{Comments: []*models.Comment{{Line: -3}}}).GetCommentSide()) | ||||
| 	assert.Equal(t, "proposed", (&DiffLine{Comments: []*models.Comment{{Line: 3}}}).GetCommentSide()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user