routers/repo/release: Use correct branch reference (#3330)

When calculating the current behind commit count the calculation should
use the current release target to get the total commit count. Should the
release target not exist anymore the calculation will return zero for
the newest release on that target. Older releases on that target will then
use that calculated commit count as reference.

The only use case that is now somehow invalid is when the release target
was merged / deleted after a tag on that release target:

    master 1 - - - - - - - 6
            \             /
    branch   2 - 3 - 4 - 5

When `4` is the last tag on branch `branch` and the branch `branch` is not
yet deleted the calculated numbers would be:

    1 commits to branch since this release

Now if the branch `branch` gets deleted the calculation function will not
find the branch and use the commit count of the newest release (`4`) as
reference resulting in:

    0 commit to branch since this release

This fixes #3326
This commit is contained in:
마누엘 2016-07-27 10:57:32 +02:00 committed by 无闻
parent 0402c803c6
commit fe60ca408b

View File

@ -20,7 +20,7 @@ const (
RELEASE_NEW base.TplName = "repo/release/new" RELEASE_NEW base.TplName = "repo/release/new"
) )
// calReleaseNumCommitsBehind calculates given release has how many commits behind default branch. // calReleaseNumCommitsBehind calculates given release has how many commits behind release target.
func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *models.Release, countCache map[string]int64) error { func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *models.Release, countCache map[string]int64) error {
// Fast return if release target is same as default branch. // Fast return if release target is same as default branch.
if repoCtx.BranchName == release.Target { if repoCtx.BranchName == release.Target {
@ -30,16 +30,21 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *models.Rel
// Get count if not exists // Get count if not exists
if _, ok := countCache[release.Target]; !ok { if _, ok := countCache[release.Target]; !ok {
commit, err := repoCtx.GitRepo.GetBranchCommit(repoCtx.BranchName) if repoCtx.GitRepo.IsBranchExist(release.Target) {
if err != nil { commit, err := repoCtx.GitRepo.GetBranchCommit(release.Target)
return fmt.Errorf("GetBranchCommit: %v", err) if err != nil {
} return fmt.Errorf("GetBranchCommit: %v", err)
countCache[repoCtx.BranchName], err = commit.CommitsCount() }
if err != nil { countCache[release.Target], err = commit.CommitsCount()
return fmt.Errorf("CommitsCount: %v", err) if err != nil {
return fmt.Errorf("CommitsCount: %v", err)
}
} else {
// Use NumCommits of the newest release on that target
countCache[release.Target] = release.NumCommits
} }
} }
release.NumCommitsBehind = countCache[repoCtx.BranchName] - release.NumCommits release.NumCommitsBehind = countCache[release.Target] - release.NumCommits
return nil return nil
} }