Expand code diffs against the commits repo
When expanding code diffs, the expansion should search for more context in the commits repo, rather than in the repo in context, because the commit may not be available in the base repo. For example, when previewing a pull request, the commit is not in the target repo yet - it's in the fork. Fixes #3746. Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
This commit is contained in:
		
					parent
					
						
							
								2810b9ae0a
							
						
					
				
			
			
				commit
				
					
						220c3fe3b3
					
				
			
		
					 3 changed files with 49 additions and 6 deletions
				
			
		| 
						 | 
					@ -18,17 +18,17 @@
 | 
				
			||||||
					<td class="lines-num lines-num-old">
 | 
										<td class="lines-num lines-num-old">
 | 
				
			||||||
						<div class="tw-flex">
 | 
											<div class="tw-flex">
 | 
				
			||||||
						{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}}
 | 
											{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}}
 | 
				
			||||||
							<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=down&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
												<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=down&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
								{{svg "octicon-fold-down"}}
 | 
													{{svg "octicon-fold-down"}}
 | 
				
			||||||
							</button>
 | 
												</button>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
						{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}}
 | 
											{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}}
 | 
				
			||||||
							<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=up&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
												<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=up&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
								{{svg "octicon-fold-up"}}
 | 
													{{svg "octicon-fold-up"}}
 | 
				
			||||||
							</button>
 | 
												</button>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
						{{if eq $line.GetExpandDirection 2}}
 | 
											{{if eq $line.GetExpandDirection 2}}
 | 
				
			||||||
							<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
												<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=split&direction=&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
								{{svg "octicon-fold"}}
 | 
													{{svg "octicon-fold"}}
 | 
				
			||||||
							</button>
 | 
												</button>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,17 +14,17 @@
 | 
				
			||||||
					<td colspan="2" class="lines-num">
 | 
										<td colspan="2" class="lines-num">
 | 
				
			||||||
						<div class="tw-flex">
 | 
											<div class="tw-flex">
 | 
				
			||||||
							{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}}
 | 
												{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}}
 | 
				
			||||||
								<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=down&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
													<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=down&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
									{{svg "octicon-fold-down"}}
 | 
														{{svg "octicon-fold-down"}}
 | 
				
			||||||
								</button>
 | 
													</button>
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
							{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}}
 | 
												{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}}
 | 
				
			||||||
								<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=up&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
													<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=up&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
									{{svg "octicon-fold-up"}}
 | 
														{{svg "octicon-fold-up"}}
 | 
				
			||||||
								</button>
 | 
													</button>
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
							{{if eq $line.GetExpandDirection 2}}
 | 
												{{if eq $line.GetExpandDirection 2}}
 | 
				
			||||||
								<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
													<button class="code-expander-button" hx-target="closest tr" hx-get="{{$.root.CommitRepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}?{{$line.GetBlobExcerptQuery}}&style=unified&direction=&wiki={{$.root.PageIsWiki}}&anchor=diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
 | 
				
			||||||
									{{svg "octicon-fold"}}
 | 
														{{svg "octicon-fold"}}
 | 
				
			||||||
								</button>
 | 
													</button>
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,11 @@ import (
 | 
				
			||||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
						repo_model "code.gitea.io/gitea/models/repo"
 | 
				
			||||||
	unit_model "code.gitea.io/gitea/models/unit"
 | 
						unit_model "code.gitea.io/gitea/models/unit"
 | 
				
			||||||
	"code.gitea.io/gitea/models/unittest"
 | 
						"code.gitea.io/gitea/models/unittest"
 | 
				
			||||||
 | 
						user_model "code.gitea.io/gitea/models/user"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/gitrepo"
 | 
						"code.gitea.io/gitea/modules/gitrepo"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/optional"
 | 
				
			||||||
	repo_service "code.gitea.io/gitea/services/repository"
 | 
						repo_service "code.gitea.io/gitea/services/repository"
 | 
				
			||||||
 | 
						files_service "code.gitea.io/gitea/services/repository/files"
 | 
				
			||||||
	"code.gitea.io/gitea/tests"
 | 
						"code.gitea.io/gitea/tests"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
| 
						 | 
					@ -213,3 +216,43 @@ func TestCompareCrossRepo(t *testing.T) {
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCompareCodeExpand(t *testing.T) {
 | 
				
			||||||
 | 
						onGiteaRun(t, func(t *testing.T, u *url.URL) {
 | 
				
			||||||
 | 
							owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Create a new repository, with a file that has many lines
 | 
				
			||||||
 | 
							repo, _, f := CreateDeclarativeRepoWithOptions(t, owner, DeclarativeRepoOptions{
 | 
				
			||||||
 | 
								Files: optional.Some([]*files_service.ChangeRepoFile{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Operation:     "create",
 | 
				
			||||||
 | 
										TreePath:      "docs.md",
 | 
				
			||||||
 | 
										ContentReader: strings.NewReader("01\n02\n03\n04\n05\n06\n07\n08\n09\n0a\n0b\n0c\n0d\n0e\n0f\n10\n11\n12\n12\n13\n14\n15\n16\n17\n18\n19\n1a\n1b\n1c\n1d\n1e\n1f\n20\n"),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							defer f()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Fork the repository
 | 
				
			||||||
 | 
							forker := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
 | 
				
			||||||
 | 
							session := loginUser(t, forker.Name)
 | 
				
			||||||
 | 
							testRepoFork(t, session, owner.Name, repo.Name, forker.Name, repo.Name+"-copy")
 | 
				
			||||||
 | 
							testCreateBranch(t, session, forker.Name, repo.Name+"-copy", "branch/main", "code-expand", http.StatusSeeOther)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Edit the file, insert a line somewhere in the middle
 | 
				
			||||||
 | 
							testEditFile(t, session, forker.Name, repo.Name+"-copy", "code-expand", "docs.md",
 | 
				
			||||||
 | 
								"01\n02\n03\n04\n05\n06\n07\n08\n09\n0a\n0b\n0c\n0d\n0e\n0f\n10\n11\nHELLO WORLD!\n12\n12\n13\n14\n15\n16\n17\n18\n19\n1a\n1b\n1c\n1d\n1e\n1f\n20\n",
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							t.Run("code expander targets the fork", func(t *testing.T) {
 | 
				
			||||||
 | 
								defer tests.PrintCurrentTest(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								req := NewRequestf(t, "GET", "%s/%s/compare/main...%s/%s:code-expand",
 | 
				
			||||||
 | 
									owner.Name, repo.Name, forker.Name, repo.Name+"-copy")
 | 
				
			||||||
 | 
								resp := session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
								htmlDoc := NewHTMLParser(t, resp.Body)
 | 
				
			||||||
 | 
								htmlDoc.AssertElement(t, fmt.Sprintf("button.code-expander-button[hx-get^='/%s/%s/blob_excerpt/'] svg.octicon-fold-up", forker.Name, repo.Name+"-copy"), true)
 | 
				
			||||||
 | 
								htmlDoc.AssertElement(t, fmt.Sprintf("button.code-expander-button[hx-get^='/%s/%s/blob_excerpt/'] svg.octicon-fold-down", forker.Name, repo.Name+"-copy"), true)
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue