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:
parent
1cf4d46bb1
commit
1bfa37ada2
|
@ -41,16 +41,49 @@ const (
|
||||||
frmCommitChoiceNewBranch string = "commit-to-new-branch"
|
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 {
|
func renderCommitRights(ctx *context.Context) bool {
|
||||||
canCommitToBranch, err := ctx.Repo.CanCommitToBranch(ctx, ctx.Doer)
|
canCommitToBranch, err := ctx.Repo.CanCommitToBranch(ctx, ctx.Doer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("CanCommitToBranch: %v", err)
|
log.Error("CanCommitToBranch: %v", err)
|
||||||
}
|
}
|
||||||
ctx.Data["CanCommitToBranch"] = canCommitToBranch
|
ctx.Data["CanCommitToBranch"] = canCommitToBranch
|
||||||
|
ctx.Data["CanCreatePullRequest"] = ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) || canCreateBasePullRequest(ctx)
|
||||||
|
|
||||||
return canCommitToBranch.CanCommitToBranch
|
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
|
// getParentTreeFields returns list of parent tree names and corresponding tree paths
|
||||||
// based on given tree path.
|
// based on given tree path.
|
||||||
func getParentTreeFields(treePath string) (treeNames, treePaths []string) {
|
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")
|
_ = 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) {
|
redirectForCommitChoice(ctx, form.CommitChoice, branchName, form.TreePath)
|
||||||
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))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EditFilePost response for editing file
|
// 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))
|
ctx.Flash.Success(ctx.Tr("repo.editor.file_delete_success", ctx.Repo.TreePath))
|
||||||
if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
|
treePath := path.Dir(ctx.Repo.TreePath)
|
||||||
ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
|
if treePath == "." {
|
||||||
} else {
|
treePath = "" // the file deleted was in the root, so we return the user to the root directory
|
||||||
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))
|
|
||||||
}
|
}
|
||||||
|
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
|
// 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")
|
_ = 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) {
|
redirectForCommitChoice(ctx, form.CommitChoice, branchName, form.TreePath)
|
||||||
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))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func cleanUploadFileName(name string) string {
|
func cleanUploadFileName(name string) string {
|
||||||
|
|
|
@ -41,17 +41,15 @@
|
||||||
</div>
|
</div>
|
||||||
{{if not .Repository.IsEmpty}}
|
{{if not .Repository.IsEmpty}}
|
||||||
<div class="field">
|
<div class="field">
|
||||||
{{$pullRequestEnabled := .Repository.UnitEnabled $.Context $.UnitTypePullRequests}}
|
|
||||||
{{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}}
|
|
||||||
<div class="ui radio checkbox">
|
<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}}>
|
<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}}
|
{{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}}>
|
<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}}
|
{{end}}
|
||||||
<label>
|
<label>
|
||||||
{{svg "octicon-git-pull-request"}}
|
{{svg "octicon-git-pull-request"}}
|
||||||
{{if $pullRequestEnabled}}
|
{{if .CanCreatePullRequest}}
|
||||||
{{.locale.Tr "repo.editor.create_new_branch" | Safe}}
|
{{.locale.Tr "repo.editor.create_new_branch" | Safe}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{.locale.Tr "repo.editor.create_new_branch_np" | Safe}}
|
{{.locale.Tr "repo.editor.create_new_branch_np" | Safe}}
|
||||||
|
|
Loading…
Reference in a new issue