mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Fix bug when review pull request commits (#35192)
The commit range in the UI follows a half-open, half-closed convention: (,]. When reviewing a range of commits, the beforeCommitID should be set to the commit immediately preceding the first selected commit. For single-commit reviews, we must identify and use the previous commit of that specific commit. The endpoint ViewPullFilesStartingFromCommit is currently unused and can be safely removed. Fix #35157 Replace #35184 Partially extract from #35077
This commit is contained in:
		| @@ -32,6 +32,7 @@ export default defineComponent({ | ||||
|       locale: { | ||||
|         filter_changes_by_commit: el.getAttribute('data-filter_changes_by_commit'), | ||||
|       } as Record<string, string>, | ||||
|       mergeBase: el.getAttribute('data-merge-base'), | ||||
|       commits: [] as Array<Commit>, | ||||
|       hoverActivated: false, | ||||
|       lastReviewCommitSha: '', | ||||
| @@ -176,32 +177,38 @@ export default defineComponent({ | ||||
|       } | ||||
|     }, | ||||
|     /** | ||||
|      * When a commit is clicked with shift this enables the range | ||||
|      * selection. Second click (with shift) defines the end of the | ||||
|      * range. This opens the diff of this range | ||||
|      * Exception: first commit is the first commit of this PR. Then | ||||
|      * the diff from beginning of PR up to the second clicked commit is | ||||
|      * opened | ||||
|      * When a commit is clicked while holding Shift, it enables range selection. | ||||
|      * - The range selection is a half-open, half-closed range, meaning it excludes the start commit but includes the end commit. | ||||
|      * - The start of the commit range is always the previous commit of the first clicked commit. | ||||
|      * - If the first commit in the list is clicked, the mergeBase will be used as the start of the range instead. | ||||
|      * - The second Shift-click defines the end of the range. | ||||
|      * - Once both are selected, the diff view for the selected commit range will open. | ||||
|      */ | ||||
|     commitClickedShift(commit: Commit) { | ||||
|       this.hoverActivated = !this.hoverActivated; | ||||
|       commit.selected = true; | ||||
|       // Second click -> determine our range and open links accordingly | ||||
|       if (!this.hoverActivated) { | ||||
|         // since at least one commit is selected, we can determine the range | ||||
|         // find all selected commits and generate a link | ||||
|         if (this.commits[0].selected) { | ||||
|           // first commit is selected - generate a short url with only target sha | ||||
|           const lastCommitIdx = this.commits.findLastIndex((x) => x.selected); | ||||
|           if (lastCommitIdx === this.commits.length - 1) { | ||||
|             // user selected all commits - just show the normal diff page | ||||
|             window.location.assign(`${this.issueLink}/files${this.queryParams}`); | ||||
|           } else { | ||||
|             window.location.assign(`${this.issueLink}/files/${this.commits[lastCommitIdx].id}${this.queryParams}`); | ||||
|           } | ||||
|         const firstSelected = this.commits.findIndex((x) => x.selected); | ||||
|         const lastSelected = this.commits.findLastIndex((x) => x.selected); | ||||
|         let beforeCommitID: string; | ||||
|         if (firstSelected === 0) { | ||||
|           beforeCommitID = this.mergeBase; | ||||
|         } else { | ||||
|           const start = this.commits[this.commits.findIndex((x) => x.selected) - 1].id; | ||||
|           const end = this.commits.findLast((x) => x.selected).id; | ||||
|           window.location.assign(`${this.issueLink}/files/${start}..${end}${this.queryParams}`); | ||||
|           beforeCommitID = this.commits[firstSelected - 1].id; | ||||
|         } | ||||
|         const afterCommitID = this.commits[lastSelected].id; | ||||
|  | ||||
|         if (firstSelected === lastSelected) { | ||||
|           // if the start and end are the same, we show this single commit | ||||
|           window.location.assign(`${this.issueLink}/commits/${afterCommitID}${this.queryParams}`); | ||||
|         } else if (beforeCommitID === this.mergeBase && afterCommitID === this.commits.at(-1).id) { | ||||
|           // if the first commit is selected and the last commit is selected, we show all commits | ||||
|           window.location.assign(`${this.issueLink}/files${this.queryParams}`); | ||||
|         } else { | ||||
|           window.location.assign(`${this.issueLink}/files/${beforeCommitID}..${afterCommitID}${this.queryParams}`); | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user