From 497e1693983eaf18a63a91706be93bc4962c70b5 Mon Sep 17 00:00:00 2001 From: schop-rob <49682405+schop-rob@users.noreply.github.com> Date: Sat, 24 Oct 2026 10:44:16 +0200 Subject: [PATCH] fix(diff): load both blobs of renamed files for diff rendering (#39969) When opening a pull request that renamed a CSV file: the compare page fails with a 500. Fix: load the left blob for every file that was not added, and the right blob (from `Name`) for every file that was not deleted. That matches what the templates did before #38517. Co-authored-by: Claude Opus 5.5 Co-authored-by: wxiaoguang --- services/gitdiff/gitdiff.go | 6 ++-- services/gitdiff/gitdiff_render_test.go | 37 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 29b87ee8a7d..a75d7a9a273 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -522,13 +522,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 c0fd647a029..b6d425f421c 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) +}