-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Give user a link to create PR after push (#4716)
* Give user a link to create PR after push * Forks now create PR in the base repository + make sure PR creation is allowed * fix code style
- Loading branch information
1 parent
cabdf84
commit dea3d84
Showing
4 changed files
with
197 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// Copyright 2018 The Gitea Authors. All rights reserved. | ||
// Use of this source code is governed by a MIT-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package private | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
"net/url" | ||
|
||
"code.gitea.io/gitea/models" | ||
"code.gitea.io/gitea/modules/log" | ||
"code.gitea.io/gitea/modules/setting" | ||
) | ||
|
||
// GetRepository return the repository by its ID and a bool about if it's allowed to have PR | ||
func GetRepository(repoID int64) (*models.Repository, bool, error) { | ||
reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repository/%d", repoID) | ||
log.GitLogger.Trace("GetRepository: %s", reqURL) | ||
|
||
resp, err := newInternalRequest(reqURL, "GET").Response() | ||
if err != nil { | ||
return nil, false, err | ||
} | ||
|
||
var repoInfo struct { | ||
Repository *models.Repository | ||
AllowPullRequest bool | ||
} | ||
if err := json.NewDecoder(resp.Body).Decode(&repoInfo); err != nil { | ||
return nil, false, err | ||
} | ||
|
||
defer resp.Body.Close() | ||
|
||
// All 2XX status codes are accepted and others will return an error | ||
if resp.StatusCode/100 != 2 { | ||
return nil, false, fmt.Errorf("failed to retrieve repository: %s", decodeJSONError(resp).Err) | ||
} | ||
|
||
return repoInfo.Repository, repoInfo.AllowPullRequest, nil | ||
} | ||
|
||
// ActivePullRequest returns an active pull request if it exists | ||
func ActivePullRequest(baseRepoID int64, headRepoID int64, baseBranch, headBranch string) (*models.PullRequest, error) { | ||
reqURL := setting.LocalURL + fmt.Sprintf("api/internal/active-pull-request?baseRepoID=%d&headRepoID=%d&baseBranch=%s&headBranch=%s", baseRepoID, headRepoID, url.QueryEscape(baseBranch), url.QueryEscape(headBranch)) | ||
log.GitLogger.Trace("ActivePullRequest: %s", reqURL) | ||
|
||
resp, err := newInternalRequest(reqURL, "GET").Response() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
var pr *models.PullRequest | ||
if err := json.NewDecoder(resp.Body).Decode(&pr); err != nil { | ||
return nil, err | ||
} | ||
|
||
defer resp.Body.Close() | ||
|
||
// All 2XX status codes are accepted and others will return an error | ||
if resp.StatusCode/100 != 2 { | ||
return nil, fmt.Errorf("failed to retrieve pull request: %s", decodeJSONError(resp).Err) | ||
} | ||
|
||
return pr, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// Copyright 2018 The Gitea Authors. All rights reserved. | ||
// Use of this source code is governed by a MIT-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package private | ||
|
||
import ( | ||
"net/http" | ||
"net/url" | ||
|
||
"code.gitea.io/gitea/models" | ||
|
||
macaron "gopkg.in/macaron.v1" | ||
) | ||
|
||
// GetRepository return the default branch of a repository | ||
func GetRepository(ctx *macaron.Context) { | ||
repoID := ctx.ParamsInt64(":rid") | ||
repository, err := models.GetRepositoryByID(repoID) | ||
repository.MustOwnerName() | ||
allowPulls := repository.AllowsPulls() | ||
// put it back to nil because json unmarshal can't unmarshal it | ||
repository.Units = nil | ||
|
||
if err != nil { | ||
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | ||
"err": err.Error(), | ||
}) | ||
return | ||
} | ||
|
||
if repository.IsFork { | ||
repository.GetBaseRepo() | ||
if err != nil { | ||
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | ||
"err": err.Error(), | ||
}) | ||
return | ||
} | ||
repository.BaseRepo.MustOwnerName() | ||
allowPulls = repository.BaseRepo.AllowsPulls() | ||
// put it back to nil because json unmarshal can't unmarshal it | ||
repository.BaseRepo.Units = nil | ||
} | ||
|
||
ctx.JSON(http.StatusOK, struct { | ||
Repository *models.Repository | ||
AllowPullRequest bool | ||
}{ | ||
Repository: repository, | ||
AllowPullRequest: allowPulls, | ||
}) | ||
} | ||
|
||
// GetActivePullRequest return an active pull request when it exists or an empty object | ||
func GetActivePullRequest(ctx *macaron.Context) { | ||
baseRepoID := ctx.QueryInt64("baseRepoID") | ||
headRepoID := ctx.QueryInt64("headRepoID") | ||
baseBranch, err := url.QueryUnescape(ctx.QueryTrim("baseBranch")) | ||
if err != nil { | ||
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | ||
"err": err.Error(), | ||
}) | ||
return | ||
} | ||
|
||
headBranch, err := url.QueryUnescape(ctx.QueryTrim("headBranch")) | ||
if err != nil { | ||
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | ||
"err": err.Error(), | ||
}) | ||
return | ||
} | ||
|
||
pr, err := models.GetUnmergedPullRequest(headRepoID, baseRepoID, headBranch, baseBranch) | ||
if err != nil && !models.IsErrPullRequestNotExist(err) { | ||
ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | ||
"err": err.Error(), | ||
}) | ||
return | ||
} | ||
|
||
ctx.JSON(http.StatusOK, pr) | ||
} |