diff options
author | Mario Lubenka <mario.lubenka@googlemail.com> | 2019-06-07 22:29:29 +0200 |
---|---|---|
committer | techknowlogick <hello@techknowlogick.com> | 2019-06-07 16:29:29 -0400 |
commit | 311ce2d1d06c26d0d5a3b745493995813e2ea6f2 (patch) | |
tree | 128b7cf4a9772373ea25bfea523de4298e5e78a2 /modules/git | |
parent | bd55f6ff36d40503bfa3407225780d0ab7d37930 (diff) | |
download | gitea-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.go | 10 | ||||
-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 |