diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index f8630e656bb..ed0910c2b45 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -521,13 +521,13 @@ func (diffFile *DiffFile) prepareDiffRenderDetail(ctx context.Context, gitRepo * // * for "text" type: need to read up to "highlight limit size" to do full-file-highlighting contentLimit := util.Iif(diffFile.IsBin, typesniffer.SniffContentSize, MaxFullFileHighlightSizeLimit) var leftBlobType, rightBlobType typesniffer.SniffedType - if (diffFile.Type == DiffFileDel || diffFile.Type == DiffFileChange) && leftCommit != nil { + if diffFile.Type != DiffFileAdd && leftCommit != nil { c := getCommitFileBlobAndLimitedContent(ctx, gitRepo, leftCommit, diffFile.OldName, contentLimit) diffFile.LeftBlob, diffFile.LeftBlobSize, ret.leftLineCount, ret.leftContent = c.gitBlob, c.blobSize, c.lineCount, c.limitedContent leftBlobType = typesniffer.DetectContentType(ret.leftContent.buf.Bytes()) } - if (diffFile.Type == DiffFileAdd || diffFile.Type == DiffFileChange) && rightCommit != nil { - c := getCommitFileBlobAndLimitedContent(ctx, gitRepo, rightCommit, diffFile.OldName, contentLimit) + if diffFile.Type != DiffFileDel && rightCommit != nil { + c := getCommitFileBlobAndLimitedContent(ctx, gitRepo, rightCommit, diffFile.Name, contentLimit) diffFile.RightBlob, diffFile.RightBlobSize, ret.rightLineCount, ret.rightContent = c.gitBlob, c.blobSize, c.lineCount, c.limitedContent rightBlobType = typesniffer.DetectContentType(ret.rightContent.buf.Bytes()) } diff --git a/services/gitdiff/gitdiff_render_test.go b/services/gitdiff/gitdiff_render_test.go index bf0057cf0af..9f1d30398a6 100644 --- a/services/gitdiff/gitdiff_render_test.go +++ b/services/gitdiff/gitdiff_render_test.go @@ -116,3 +116,40 @@ func TestGetDiffForRender(t *testing.T) { assert.Equal(t, exp, actual, "idx=%d", idx) } } + +func TestGetDiffForRenderRenamedFile(t *testing.T) { + repoDir := filepath.Join(t.TempDir(), "temp-repo") + require.NoError(t, git.InitRepositoryLocal(t.Context(), repoDir, false, git.Sha1ObjectFormat.Name())) + + gitRepo, err := git.OpenRepositoryLocal(t.Context(), repoDir) + require.NoError(t, err) + defer gitRepo.Close() + + content := "id,name\n1,Alice\n2,Bob\n" + require.NoError(t, git.ForceFastImport(t.Context(), gitRepo, []git.FastImportCommit{ + {Ref: "refs/heads/b1", Files: []git.FastImportFile{{Path: "original/sample.csv", Content: content}}}, + {Ref: "refs/heads/b2", Files: []git.FastImportFile{{Path: "moved/sample.csv", Content: content}}}, + })) + + beforeCommit, err := gitRepo.GetBranchCommit(t.Context(), "b1") + require.NoError(t, err) + afterCommit, err := gitRepo.GetBranchCommit(t.Context(), "b2") + require.NoError(t, err) + + diff, err := GetDiffForRender(t.Context(), "/any/repo-link", gitRepo, &DiffOptions{ + BeforeCommitID: beforeCommit.ID.String(), + AfterCommitID: afterCommit.ID.String(), + MaxLines: setting.Git.MaxGitDiffLines, + MaxLineCharacters: setting.Git.MaxGitDiffLineCharacters, + MaxFiles: setting.Git.MaxGitDiffFiles, + }) + require.NoError(t, err) + require.Len(t, diff.Files, 1) + + // the CSV diff of a renamed file needs both blobs, otherwise it panics + diffFile := diff.Files[0] + assert.Equal(t, DiffFileRename, diffFile.Type) + assert.True(t, diffFile.IsBlobTypeCsv) + assert.NotNil(t, diffFile.LeftBlob) + assert.NotNil(t, diffFile.RightBlob) +}