mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	Create pull request for base after editing file, if not enabled on fork (#24841)
Currently if pull requests are disabled on a fork but enabled on a base repo, creating/editing/deleting files does not offer the option to create a pull request. This change enables creating a pull request for the base repo in that case. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							1cf4d46bb1
						
					
				
				
					commit
					1bfa37ada2
				
			@@ -41,16 +41,49 @@ const (
 | 
			
		||||
	frmCommitChoiceNewBranch string = "commit-to-new-branch"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func canCreateBasePullRequest(ctx *context.Context) bool {
 | 
			
		||||
	baseRepo := ctx.Repo.Repository.BaseRepo
 | 
			
		||||
	return baseRepo != nil && baseRepo.UnitEnabled(ctx, unit.TypePullRequests)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func renderCommitRights(ctx *context.Context) bool {
 | 
			
		||||
	canCommitToBranch, err := ctx.Repo.CanCommitToBranch(ctx, ctx.Doer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("CanCommitToBranch: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["CanCommitToBranch"] = canCommitToBranch
 | 
			
		||||
	ctx.Data["CanCreatePullRequest"] = ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) || canCreateBasePullRequest(ctx)
 | 
			
		||||
 | 
			
		||||
	return canCommitToBranch.CanCommitToBranch
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// redirectForCommitChoice redirects after committing the edit to a branch
 | 
			
		||||
func redirectForCommitChoice(ctx *context.Context, commitChoice, newBranchName, treePath string) {
 | 
			
		||||
	if commitChoice == frmCommitChoiceNewBranch {
 | 
			
		||||
		// Redirect to a pull request when possible
 | 
			
		||||
		redirectToPullRequest := false
 | 
			
		||||
		repo := ctx.Repo.Repository
 | 
			
		||||
		baseBranch := ctx.Repo.BranchName
 | 
			
		||||
		headBranch := newBranchName
 | 
			
		||||
		if repo.UnitEnabled(ctx, unit.TypePullRequests) {
 | 
			
		||||
			redirectToPullRequest = true
 | 
			
		||||
		} else if canCreateBasePullRequest(ctx) {
 | 
			
		||||
			redirectToPullRequest = true
 | 
			
		||||
			baseBranch = repo.BaseRepo.DefaultBranch
 | 
			
		||||
			headBranch = repo.Owner.Name + "/" + repo.Name + ":" + headBranch
 | 
			
		||||
			repo = repo.BaseRepo
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if redirectToPullRequest {
 | 
			
		||||
			ctx.Redirect(repo.Link() + "/compare/" + util.PathEscapeSegments(baseBranch) + "..." + util.PathEscapeSegments(headBranch))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Redirect to viewing file or folder
 | 
			
		||||
	ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(newBranchName) + "/" + util.PathEscapeSegments(treePath))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getParentTreeFields returns list of parent tree names and corresponding tree paths
 | 
			
		||||
// based on given tree path.
 | 
			
		||||
func getParentTreeFields(treePath string) (treeNames, treePaths []string) {
 | 
			
		||||
@@ -331,11 +364,7 @@ func editFilePost(ctx *context.Context, form forms.EditRepoFileForm, isNewFile b
 | 
			
		||||
		_ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: ctx.Repo.Repository.ID, IsEmpty: false}, "is_empty")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(branchName) + "/" + util.PathEscapeSegments(form.TreePath))
 | 
			
		||||
	}
 | 
			
		||||
	redirectForCommitChoice(ctx, form.CommitChoice, branchName, form.TreePath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EditFilePost response for editing file
 | 
			
		||||
@@ -517,26 +546,23 @@ func DeleteFilePost(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Flash.Success(ctx.Tr("repo.editor.file_delete_success", ctx.Repo.TreePath))
 | 
			
		||||
	if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
 | 
			
		||||
	} else {
 | 
			
		||||
		treePath := path.Dir(ctx.Repo.TreePath)
 | 
			
		||||
		if treePath == "." {
 | 
			
		||||
			treePath = "" // the file deleted was in the root, so we return the user to the root directory
 | 
			
		||||
		}
 | 
			
		||||
		if len(treePath) > 0 {
 | 
			
		||||
			// Need to get the latest commit since it changed
 | 
			
		||||
			commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.BranchName)
 | 
			
		||||
			if err == nil && commit != nil {
 | 
			
		||||
				// We have the comment, now find what directory we can return the user to
 | 
			
		||||
				// (must have entries)
 | 
			
		||||
				treePath = GetClosestParentWithFiles(treePath, commit)
 | 
			
		||||
			} else {
 | 
			
		||||
				treePath = "" // otherwise return them to the root of the repo
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(branchName) + "/" + util.PathEscapeSegments(treePath))
 | 
			
		||||
	treePath := path.Dir(ctx.Repo.TreePath)
 | 
			
		||||
	if treePath == "." {
 | 
			
		||||
		treePath = "" // the file deleted was in the root, so we return the user to the root directory
 | 
			
		||||
	}
 | 
			
		||||
	if len(treePath) > 0 {
 | 
			
		||||
		// Need to get the latest commit since it changed
 | 
			
		||||
		commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.BranchName)
 | 
			
		||||
		if err == nil && commit != nil {
 | 
			
		||||
			// We have the comment, now find what directory we can return the user to
 | 
			
		||||
			// (must have entries)
 | 
			
		||||
			treePath = GetClosestParentWithFiles(treePath, commit)
 | 
			
		||||
		} else {
 | 
			
		||||
			treePath = "" // otherwise return them to the root of the repo
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	redirectForCommitChoice(ctx, form.CommitChoice, branchName, treePath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UploadFile render upload file page
 | 
			
		||||
@@ -722,11 +748,7 @@ func UploadFilePost(ctx *context.Context) {
 | 
			
		||||
		_ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: ctx.Repo.Repository.ID, IsEmpty: false}, "is_empty")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(branchName) + "/" + util.PathEscapeSegments(form.TreePath))
 | 
			
		||||
	}
 | 
			
		||||
	redirectForCommitChoice(ctx, form.CommitChoice, branchName, form.TreePath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cleanUploadFileName(name string) string {
 | 
			
		||||
 
 | 
			
		||||
@@ -41,17 +41,15 @@
 | 
			
		||||
			</div>
 | 
			
		||||
			{{if not .Repository.IsEmpty}}
 | 
			
		||||
			<div class="field">
 | 
			
		||||
				{{$pullRequestEnabled := .Repository.UnitEnabled $.Context $.UnitTypePullRequests}}
 | 
			
		||||
				{{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}}
 | 
			
		||||
				<div class="ui radio checkbox">
 | 
			
		||||
					{{if $pullRequestEnabled}}
 | 
			
		||||
					{{if .CanCreatePullRequest}}
 | 
			
		||||
						<input type="radio" class="js-quick-pull-choice-option" name="commit_choice" value="commit-to-new-branch" button_text="{{.locale.Tr "repo.editor.propose_file_change"}}" {{if eq .commit_choice "commit-to-new-branch"}}checked{{end}}>
 | 
			
		||||
					{{else}}
 | 
			
		||||
						<input type="radio" class="js-quick-pull-choice-option" name="commit_choice" value="commit-to-new-branch" button_text="{{.locale.Tr "repo.editor.commit_changes"}}" {{if eq .commit_choice "commit-to-new-branch"}}checked{{end}}>
 | 
			
		||||
					{{end}}
 | 
			
		||||
					<label>
 | 
			
		||||
						{{svg "octicon-git-pull-request"}}
 | 
			
		||||
						{{if $pullRequestEnabled}}
 | 
			
		||||
						{{if .CanCreatePullRequest}}
 | 
			
		||||
							{{.locale.Tr "repo.editor.create_new_branch" | Safe}}
 | 
			
		||||
						{{else}}
 | 
			
		||||
							{{.locale.Tr "repo.editor.create_new_branch_np" | Safe}}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user