save PR info as patch and minor fix on PR
This commit is contained in:
parent
02d3b66265
commit
215920772a
7 changed files with 77 additions and 46 deletions
|
@ -104,6 +104,7 @@ There are 5 ways to install Gogs:
|
||||||
- [OpenShift](https://github.com/tkisme/gogs-openshift)
|
- [OpenShift](https://github.com/tkisme/gogs-openshift)
|
||||||
- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp)
|
- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp)
|
||||||
- [Scaleway](https://www.scaleway.com/imagehub/gogs/)
|
- [Scaleway](https://www.scaleway.com/imagehub/gogs/)
|
||||||
|
- [Portal](https://portaldemo.xyz/cloud/)
|
||||||
|
|
||||||
## Acknowledgments
|
## Acknowledgments
|
||||||
|
|
||||||
|
|
2
gogs.go
2
gogs.go
|
@ -17,7 +17,7 @@ import (
|
||||||
"github.com/gogits/gogs/modules/setting"
|
"github.com/gogits/gogs/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
const APP_VER = "0.6.16.1002 Beta"
|
const APP_VER = "0.6.16.1004 Beta"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
|
|
|
@ -930,10 +930,12 @@ type PullRequest struct {
|
||||||
Merger *User `xorm:"-"`
|
Merger *User `xorm:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: don't try to get Pull because will end up recursive querying.
|
||||||
func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
|
func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
|
||||||
var err error
|
var err error
|
||||||
switch colName {
|
switch colName {
|
||||||
case "head_repo_id":
|
case "head_repo_id":
|
||||||
|
// FIXME: shouldn't show error if it's known that head repository has been removed.
|
||||||
pr.HeadRepo, err = GetRepositoryByID(pr.HeadRepoID)
|
pr.HeadRepo, err = GetRepositoryByID(pr.HeadRepoID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(3, "GetRepositoryByID[%d]: %v", pr.ID, err)
|
log.Error(3, "GetRepositoryByID[%d]: %v", pr.ID, err)
|
||||||
|
@ -1017,7 +1019,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
|
||||||
if _, stderr, err = process.ExecDir(-1, tmpBasePath,
|
if _, stderr, err = process.ExecDir(-1, tmpBasePath,
|
||||||
fmt.Sprintf("PullRequest.Merge(git pull): %s", tmpBasePath),
|
fmt.Sprintf("PullRequest.Merge(git pull): %s", tmpBasePath),
|
||||||
"git", "pull", headRepoPath, pr.HeadBarcnh); err != nil {
|
"git", "pull", headRepoPath, pr.HeadBarcnh); err != nil {
|
||||||
return fmt.Errorf("git pull: %s", stderr)
|
return fmt.Errorf("git pull[%s / %s -> %s]: %s", headRepoPath, pr.HeadBarcnh, tmpBasePath, stderr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push back to upstream.
|
// Push back to upstream.
|
||||||
|
@ -1059,27 +1061,32 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test apply patch.
|
// Test apply patch.
|
||||||
|
if err = repo.UpdateLocalCopy(); err != nil {
|
||||||
|
return fmt.Errorf("UpdateLocalCopy: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
repoPath, err := repo.RepoPath()
|
repoPath, err := repo.RepoPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("RepoPath: %v", err)
|
return fmt.Errorf("RepoPath: %v", err)
|
||||||
}
|
}
|
||||||
patchPath := path.Join(repoPath, "pulls", com.ToStr(pr.ID)+".patch")
|
patchPath := path.Join(repoPath, "pulls", com.ToStr(pull.ID)+".patch")
|
||||||
|
|
||||||
os.MkdirAll(path.Dir(patchPath), os.ModePerm)
|
os.MkdirAll(path.Dir(patchPath), os.ModePerm)
|
||||||
if err = ioutil.WriteFile(patchPath, patch, 0644); err != nil {
|
if err = ioutil.WriteFile(patchPath, patch, 0644); err != nil {
|
||||||
return fmt.Errorf("save patch: %v", err)
|
return fmt.Errorf("save patch: %v", err)
|
||||||
}
|
}
|
||||||
defer os.Remove(patchPath)
|
|
||||||
|
|
||||||
stdout, stderr, err := process.ExecDir(-1, repoPath,
|
pr.CanAutoMerge = true
|
||||||
|
_, stderr, err := process.ExecDir(-1, repo.LocalCopyPath(),
|
||||||
fmt.Sprintf("NewPullRequest(git apply --check): %d", repo.ID),
|
fmt.Sprintf("NewPullRequest(git apply --check): %d", repo.ID),
|
||||||
"git", "apply", "--check", "-v", patchPath)
|
"git", "apply", "--check", patchPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(stderr, "fatal:") {
|
if strings.Contains(stderr, "patch does not apply") {
|
||||||
|
pr.CanAutoMerge = false
|
||||||
|
} else {
|
||||||
return fmt.Errorf("git apply --check: %v - %s", err, stderr)
|
return fmt.Errorf("git apply --check: %v - %s", err, stderr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pr.CanAutoMerge = !strings.Contains(stdout, "error: patch failed:")
|
|
||||||
|
|
||||||
pr.PullID = pull.ID
|
pr.PullID = pull.ID
|
||||||
pr.PullIndex = pull.Index
|
pr.PullIndex = pull.Index
|
||||||
|
|
|
@ -296,6 +296,35 @@ func (repo *Repository) DescriptionHtml() template.HTML {
|
||||||
return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize))
|
return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (repo *Repository) LocalCopyPath() string {
|
||||||
|
return path.Join(setting.RepoRootPath, "local", com.ToStr(repo.ID))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateLocalCopy makes sure the local copy of repository is up-to-date.
|
||||||
|
func (repo *Repository) UpdateLocalCopy() error {
|
||||||
|
repoPath, err := repo.RepoPath()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
localPath := repo.LocalCopyPath()
|
||||||
|
if !com.IsExist(localPath) {
|
||||||
|
_, stderr, err := process.Exec(
|
||||||
|
fmt.Sprintf("UpdateLocalCopy(git clone): %s", repoPath), "git", "clone", repoPath, localPath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("git clone: %v - %s", err, stderr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, stderr, err := process.ExecDir(-1, localPath,
|
||||||
|
fmt.Sprintf("UpdateLocalCopy(git pull): %s", repoPath), "git", "pull")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("git pull: %v - %s", err, stderr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) {
|
func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) {
|
||||||
has, err := e.Get(&Repository{
|
has, err := e.Get(&Repository{
|
||||||
OwnerID: u.Id,
|
OwnerID: u.Id,
|
||||||
|
|
|
@ -44,7 +44,7 @@ func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch stri
|
||||||
}
|
}
|
||||||
prInfo.MergeBase = strings.TrimSpace(stdout)
|
prInfo.MergeBase = strings.TrimSpace(stdout)
|
||||||
|
|
||||||
stdout, stderr, err = com.ExecCmdDir(repo.Path, "git", "log", remoteBranch+"..."+headBranch, prettyLogFormat)
|
stdout, stderr, err = com.ExecCmdDir(repo.Path, "git", "log", prInfo.MergeBase+"..."+headBranch, prettyLogFormat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("list diff logs: %v", concatenateError(err, stderr))
|
return nil, fmt.Errorf("list diff logs: %v", concatenateError(err, stderr))
|
||||||
}
|
}
|
||||||
|
@ -64,20 +64,8 @@ func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch stri
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPatch generates and returns patch data between given branches.
|
// GetPatch generates and returns patch data between given branches.
|
||||||
func (repo *Repository) GetPatch(basePath, baseBranch, headBranch string) ([]byte, error) {
|
func (repo *Repository) GetPatch(mergeBase, headBranch string) ([]byte, error) {
|
||||||
// Add a temporary remote.
|
stdout, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "diff", "-p", mergeBase, headBranch)
|
||||||
tmpRemote := com.ToStr(time.Now().UnixNano())
|
|
||||||
_, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "remote", "add", "-f", tmpRemote, basePath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("add base as remote: %v", concatenateError(err, string(stderr)))
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
com.ExecCmdDir(repo.Path, "git", "remote", "remove", tmpRemote)
|
|
||||||
}()
|
|
||||||
|
|
||||||
var stdout []byte
|
|
||||||
remoteBranch := "remotes/" + tmpRemote + "/" + baseBranch
|
|
||||||
stdout, stderr, err = com.ExecCmdDirBytes(repo.Path, "git", "diff", "-p", remoteBranch, headBranch)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, concatenateError(err, string(stderr))
|
return nil, concatenateError(err, string(stderr))
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,17 +187,23 @@ func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullR
|
||||||
ctx.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBarcnh
|
ctx.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBarcnh
|
||||||
ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.BaseBranch
|
ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.BaseBranch
|
||||||
|
|
||||||
|
var (
|
||||||
|
headGitRepo *git.Repository
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if pull.HeadRepo != nil {
|
||||||
headRepoPath, err := pull.HeadRepo.RepoPath()
|
headRepoPath, err := pull.HeadRepo.RepoPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "HeadRepo.RepoPath", err)
|
ctx.Handle(500, "HeadRepo.RepoPath", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
headGitRepo, err := git.OpenRepository(headRepoPath)
|
headGitRepo, err = git.OpenRepository(headRepoPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "OpenRepository", err)
|
ctx.Handle(500, "OpenRepository", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if pull.HeadRepo == nil || !headGitRepo.IsBranchExist(pull.HeadBarcnh) {
|
if pull.HeadRepo == nil || !headGitRepo.IsBranchExist(pull.HeadBarcnh) {
|
||||||
ctx.Data["IsPullReuqestBroken"] = true
|
ctx.Data["IsPullReuqestBroken"] = true
|
||||||
|
@ -530,18 +536,18 @@ func CompareAndPullRequest(ctx *middleware.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
pr, err := models.GetUnmergedPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch)
|
// pr, err := models.GetUnmergedPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
if !models.IsErrPullRequestNotExist(err) {
|
// if !models.IsErrPullRequestNotExist(err) {
|
||||||
ctx.Handle(500, "GetUnmergedPullRequest", err)
|
// ctx.Handle(500, "GetUnmergedPullRequest", err)
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
ctx.Data["HasPullRequest"] = true
|
// ctx.Data["HasPullRequest"] = true
|
||||||
ctx.Data["PullRequest"] = pr
|
// ctx.Data["PullRequest"] = pr
|
||||||
ctx.HTML(200, COMPARE_PULL)
|
// ctx.HTML(200, COMPARE_PULL)
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
|
||||||
nothingToCompare := PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch)
|
nothingToCompare := PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
|
@ -575,7 +581,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
patch, err := headGitRepo.GetPatch(models.RepoPath(repo.Owner.Name, repo.Name), baseBranch, headBranch)
|
patch, err := headGitRepo.GetPatch(prInfo.MergeBase, headBranch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "GetPatch", err)
|
ctx.Handle(500, "GetPatch", err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.6.16.1002 Beta
|
0.6.16.1004 Beta
|
Reference in a new issue