aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git
diff options
context:
space:
mode:
authorMario Lubenka <mario.lubenka@googlemail.com>2019-06-07 22:29:29 +0200
committertechknowlogick <hello@techknowlogick.com>2019-06-07 16:29:29 -0400
commit311ce2d1d06c26d0d5a3b745493995813e2ea6f2 (patch)
tree128b7cf4a9772373ea25bfea523de4298e5e78a2 /modules/git
parentbd55f6ff36d40503bfa3407225780d0ab7d37930 (diff)
downloadgitea-311ce2d1d06c26d0d5a3b745493995813e2ea6f2.tar.gz
gitea-311ce2d1d06c26d0d5a3b745493995813e2ea6f2.zip
Compare branches, commits and tags with each other (#6991)
* Supports tags when comparing commits or branches Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Hide headline when only comparing and don't load unused data Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Merges compare logics to allow comparing branches, commits and tags with eachother Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Display branch or tag instead of commit when used for comparing Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Show pull request form after click on button Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Transfers relevant pull.go changes from master to compare.go Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Fixes error when comparing forks against a commit or tag Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Removes console.log from JavaScript file Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Show icon next to commit reference when comparing branch or tag Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Updates css file Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Fixes import order * Renames template variable * Update routers/repo/compare.go Co-Authored-By: zeripath <art27@cantab.net> * Update from master Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Allow short-shas in compare * Renames prInfo to compareInfo Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Check PR permissions only if compare is pull request Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Adjusts comment Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Use compareInfo instead of prInfo
Diffstat (limited to 'modules/git')
-rw-r--r--modules/git/repo_commit.go10
-rw-r--r--modules/git/repo_compare.go (renamed from modules/git/repo_pull.go)54
-rw-r--r--modules/git/repo_compare_test.go (renamed from modules/git/repo_pull_test.go)0
3 files changed, 43 insertions, 21 deletions
diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go
index b631f9341e..501ea88e40 100644
--- a/modules/git/repo_commit.go
+++ b/modules/git/repo_commit.go
@@ -27,6 +27,16 @@ func (repo *Repository) GetRefCommitID(name string) (string, error) {
return ref.Hash().String(), nil
}
+// IsCommitExist returns true if given commit exists in current repository.
+func (repo *Repository) IsCommitExist(name string) bool {
+ hash := plumbing.NewHash(name)
+ _, err := repo.gogitRepo.CommitObject(hash)
+ if err != nil {
+ return false
+ }
+ return true
+}
+
// GetBranchCommitID returns last commit ID string of given branch.
func (repo *Repository) GetBranchCommitID(name string) (string, error) {
return repo.GetRefCommitID(BranchPrefix + name)
diff --git a/modules/git/repo_pull.go b/modules/git/repo_compare.go
index 65c5414551..e7a1d72a85 100644
--- a/modules/git/repo_pull.go
+++ b/modules/git/repo_compare.go
@@ -1,4 +1,5 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2019 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.
@@ -14,55 +15,66 @@ import (
"time"
)
-// PullRequestInfo represents needed information for a pull request.
-type PullRequestInfo struct {
+// CompareInfo represents needed information for comparing references.
+type CompareInfo struct {
MergeBase string
Commits *list.List
NumFiles int
}
// GetMergeBase checks and returns merge base of two branches.
-func (repo *Repository) GetMergeBase(base, head string) (string, error) {
+func (repo *Repository) GetMergeBase(tmpRemote string, base, head string) (string, error) {
+ if tmpRemote == "" {
+ tmpRemote = "origin"
+ }
+
+ if tmpRemote != "origin" {
+ tmpBaseName := "refs/remotes/" + tmpRemote + "/tmp_" + base
+ // Fetch commit into a temporary branch in order to be able to handle commits and tags
+ _, err := NewCommand("fetch", tmpRemote, base+":"+tmpBaseName).RunInDir(repo.Path)
+ if err == nil {
+ base = tmpBaseName
+ }
+ }
+
stdout, err := NewCommand("merge-base", base, head).RunInDir(repo.Path)
return strings.TrimSpace(stdout), err
}
-// GetPullRequestInfo generates and returns pull request information
-// between base and head branches of repositories.
-func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch string) (_ *PullRequestInfo, err error) {
- var remoteBranch string
+// GetCompareInfo generates and returns compare information between base and head branches of repositories.
+func (repo *Repository) GetCompareInfo(basePath, baseBranch, headBranch string) (_ *CompareInfo, err error) {
+ var (
+ remoteBranch string
+ tmpRemote string
+ )
// We don't need a temporary remote for same repository.
if repo.Path != basePath {
// Add a temporary remote
- tmpRemote := strconv.FormatInt(time.Now().UnixNano(), 10)
+ tmpRemote = strconv.FormatInt(time.Now().UnixNano(), 10)
if err = repo.AddRemote(tmpRemote, basePath, true); err != nil {
return nil, fmt.Errorf("AddRemote: %v", err)
}
defer repo.RemoveRemote(tmpRemote)
-
- remoteBranch = "remotes/" + tmpRemote + "/" + baseBranch
- } else {
- remoteBranch = baseBranch
}
- prInfo := new(PullRequestInfo)
- prInfo.MergeBase, err = repo.GetMergeBase(remoteBranch, headBranch)
+ compareInfo := new(CompareInfo)
+ compareInfo.MergeBase, err = repo.GetMergeBase(tmpRemote, baseBranch, headBranch)
if err == nil {
// We have a common base
- logs, err := NewCommand("log", prInfo.MergeBase+"..."+headBranch, prettyLogFormat).RunInDirBytes(repo.Path)
+ logs, err := NewCommand("log", compareInfo.MergeBase+"..."+headBranch, prettyLogFormat).RunInDirBytes(repo.Path)
if err != nil {
return nil, err
}
- prInfo.Commits, err = repo.parsePrettyFormatLogToList(logs)
+ compareInfo.Commits, err = repo.parsePrettyFormatLogToList(logs)
if err != nil {
return nil, fmt.Errorf("parsePrettyFormatLogToList: %v", err)
}
} else {
- prInfo.Commits = list.New()
- prInfo.MergeBase, err = GetFullCommitID(repo.Path, remoteBranch)
+ compareInfo.Commits = list.New()
+ compareInfo.MergeBase, err = GetFullCommitID(repo.Path, remoteBranch)
if err != nil {
- prInfo.MergeBase = remoteBranch
+ compareInfo.MergeBase = remoteBranch
}
}
@@ -71,9 +83,9 @@ func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch stri
if err != nil {
return nil, err
}
- prInfo.NumFiles = len(strings.Split(stdout, "\n")) - 1
+ compareInfo.NumFiles = len(strings.Split(stdout, "\n")) - 1
- return prInfo, nil
+ return compareInfo, nil
}
// GetPatch generates and returns patch data between given revisions.
diff --git a/modules/git/repo_pull_test.go b/modules/git/repo_compare_test.go
index e194788773..e194788773 100644
--- a/modules/git/repo_pull_test.go
+++ b/modules/git/repo_compare_test.go