From 8ad33baae14dca5ea0c55f1e2f09bd6b7726c5fc Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 1 Nov 2025 22:54:16 -0700 Subject: [PATCH 1/3] Fix viewed files number is not right if not all files loaded --- models/pull/review_state.go | 13 +++++++++++++ routers/web/repo/pull.go | 7 ++++++- services/gitdiff/gitdiff.go | 8 +++----- templates/repo/diff/box.tmpl | 4 ++-- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/models/pull/review_state.go b/models/pull/review_state.go index 137af00eab2d0..0bd69849cb24a 100644 --- a/models/pull/review_state.go +++ b/models/pull/review_state.go @@ -49,6 +49,19 @@ func init() { db.RegisterModel(new(ReviewState)) } +func (rs *ReviewState) GetViewedFileCount() int { + if len(rs.UpdatedFiles) == 0 { + return 0 + } + var viewedFiles int + for _, state := range rs.UpdatedFiles { + if state == Viewed { + viewedFiles++ + } + } + return viewedFiles +} + // GetReviewState returns the ReviewState with all given values prefilled, whether or not it exists in the database. // If the review didn't exist before in the database, it won't afterwards either. // The returned boolean shows whether the review exists in the database diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 0f9f551e12e45..9facfbed018c1 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -782,12 +782,16 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { // as the viewed information is designed to be loaded only on latest PR // diff and if you're signed in. var reviewState *pull_model.ReviewState + var viewedFiles int if ctx.IsSigned && isShowAllCommits { reviewState, err = gitdiff.SyncUserSpecificDiff(ctx, ctx.Doer.ID, pull, gitRepo, diff, diffOptions) if err != nil { ctx.ServerError("SyncUserSpecificDiff", err) return } + if reviewState != nil { + viewedFiles = reviewState.GetViewedFileCount() + } } diffShortStat, err := gitdiff.GetDiffShortStat(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, beforeCommitID, afterCommitID) @@ -796,10 +800,11 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { return } ctx.Data["DiffShortStat"] = diffShortStat + ctx.Data["NumViewedFiles"] = viewedFiles ctx.PageData["prReview"] = map[string]any{ "numberOfFiles": diffShortStat.NumFiles, - "numberOfViewedFiles": diff.NumViewedFiles, + "numberOfViewedFiles": viewedFiles, } if err = diff.LoadComments(ctx, issue, ctx.Doer, ctx.Data["ShowOutdatedComments"].(bool)); err != nil { diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 96aea8308c92a..830bb1131bd49 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -520,10 +520,9 @@ func getCommitFileLineCountAndLimitedContent(commit *git.Commit, filePath string // Diff represents a difference between two git trees. type Diff struct { - Start, End string - Files []*DiffFile - IsIncomplete bool - NumViewedFiles int // user-specific + Start, End string + Files []*DiffFile + IsIncomplete bool } // LoadComments loads comments into each line @@ -1412,7 +1411,6 @@ outer: // Check whether the file has already been viewed if fileViewedState == pull_model.Viewed { diffFile.IsViewed = true - diff.NumViewedFiles++ } } diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl index 7eb96e1ddc5bb..ff9bd2e792ede 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -27,9 +27,9 @@ {{if and .PageIsPullFiles $.SignedUserID (not .DiffNotAvailable)}}
- +
{{end}} {{template "repo/diff/whitespace_dropdown" .}} From 0c272c2e88727f7e83a661a064dcd3f40f544c69 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 3 Nov 2025 11:52:32 -0800 Subject: [PATCH 2/3] rename variable --- routers/web/repo/pull.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 9facfbed018c1..17e3bf2b78176 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -782,7 +782,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { // as the viewed information is designed to be loaded only on latest PR // diff and if you're signed in. var reviewState *pull_model.ReviewState - var viewedFiles int + var numViewedFiles int if ctx.IsSigned && isShowAllCommits { reviewState, err = gitdiff.SyncUserSpecificDiff(ctx, ctx.Doer.ID, pull, gitRepo, diff, diffOptions) if err != nil { @@ -790,7 +790,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { return } if reviewState != nil { - viewedFiles = reviewState.GetViewedFileCount() + numViewedFiles = reviewState.GetViewedFileCount() } } @@ -800,11 +800,11 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { return } ctx.Data["DiffShortStat"] = diffShortStat - ctx.Data["NumViewedFiles"] = viewedFiles + ctx.Data["NumViewedFiles"] = numViewedFiles ctx.PageData["prReview"] = map[string]any{ "numberOfFiles": diffShortStat.NumFiles, - "numberOfViewedFiles": viewedFiles, + "numberOfViewedFiles": numViewedFiles, } if err = diff.LoadComments(ctx, issue, ctx.Doer, ctx.Data["ShowOutdatedComments"].(bool)); err != nil { From 43cf124fb47b6ce00804638773d2efa0e6f9a157 Mon Sep 17 00:00:00 2001 From: silverwind Date: Mon, 3 Nov 2025 20:57:33 +0100 Subject: [PATCH 3/3] Update models/pull/review_state.go Signed-off-by: silverwind --- models/pull/review_state.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/models/pull/review_state.go b/models/pull/review_state.go index 0bd69849cb24a..e8b759c0cc62e 100644 --- a/models/pull/review_state.go +++ b/models/pull/review_state.go @@ -53,13 +53,13 @@ func (rs *ReviewState) GetViewedFileCount() int { if len(rs.UpdatedFiles) == 0 { return 0 } - var viewedFiles int + var numViewedFiles int for _, state := range rs.UpdatedFiles { if state == Viewed { - viewedFiles++ + numViewedFiles++ } } - return viewedFiles + return numViewedFiles } // GetReviewState returns the ReviewState with all given values prefilled, whether or not it exists in the database.