fix: add GitUtils.findBranchesNoMergeInfo and use it when merge info … (#3436)

* fix: add GitUtils.findBranchesNoMergeInfo and use it when merge info not necessary

* rfr: add some missing override annotations and a return type

---------

Co-authored-by: Thomas Geier <thomas.geier@solidat.de>
This commit is contained in:
ziggystar
2023-11-30 13:01:57 +01:00
committed by GitHub
parent c7ade7ec4d
commit dabddf60b1
8 changed files with 94 additions and 55 deletions

View File

@@ -1,11 +1,11 @@
package gitbucket.core.controller.api
import gitbucket.core.api._
import gitbucket.core.api.*
import gitbucket.core.controller.ControllerBase
import gitbucket.core.service.{AccountService, ProtectedBranchService, RepositoryService}
import gitbucket.core.util._
import gitbucket.core.util.Directory._
import gitbucket.core.util.Implicits._
import gitbucket.core.util.JGitUtil.getBranches
import gitbucket.core.util.*
import gitbucket.core.util.Directory.*
import gitbucket.core.util.Implicits.*
import gitbucket.core.util.JGitUtil.getBranchesNoMergeInfo
import org.eclipse.jgit.api.Git
import org.scalatra.NoContent
@@ -30,10 +30,9 @@ trait ApiRepositoryBranchControllerBase extends ControllerBase {
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
JsonFormat(
JGitUtil
.getBranches(
.getBranchesNoMergeInfo(
git = git,
defaultBranch = repository.repository.defaultBranch,
origin = repository.repository.originUserName.isEmpty
defaultBranch = repository.repository.defaultBranch
)
.map { br =>
ApiBranchForList(br.name, ApiBranchCommit(br.commitId))
@@ -50,10 +49,9 @@ trait ApiRepositoryBranchControllerBase extends ControllerBase {
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
(for {
branch <- params.get("splat") if repository.branchList.contains(branch)
br <- getBranches(
br <- getBranchesNoMergeInfo(
git,
repository.repository.defaultBranch,
repository.repository.originUserName.isEmpty
repository.repository.defaultBranch
).find(_.name == branch)
} yield {
val protection = getProtectedBranchInfo(repository.owner, repository.name, branch)
@@ -273,15 +271,14 @@ trait ApiRepositoryBranchControllerBase extends ControllerBase {
* https://developer.github.com/v3/repos/#enabling-and-disabling-branch-protection
*/
patch("/api/v3/repos/:owner/:repository/branches/*")(ownerOnly { repository =>
import gitbucket.core.api._
import gitbucket.core.api.*
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
(for {
branch <- params.get("splat") if repository.branchList.contains(branch)
protection <- extractFromJsonBody[ApiBranchProtection.EnablingAndDisabling].map(_.protection)
br <- getBranches(
br <- getBranchesNoMergeInfo(
git,
repository.repository.defaultBranch,
repository.repository.originUserName.isEmpty
repository.repository.defaultBranch
).find(_.name == branch)
} yield {
if (protection.enabled) {

View File

@@ -4,28 +4,21 @@ import gitbucket.core.controller.ControllerBase
import gitbucket.core.model.Account
import gitbucket.core.service.{AccountService, CommitsService, ProtectedBranchService}
import gitbucket.core.util.Directory.getRepositoryDir
import gitbucket.core.util.Implicits._
import gitbucket.core.util.JGitUtil.{CommitInfo, getBranches, getBranchesOfCommit}
import gitbucket.core.util.Implicits.*
import gitbucket.core.util.JGitUtil.{CommitInfo, getBranchesNoMergeInfo, getBranchesOfCommit}
import gitbucket.core.util.{JGitUtil, ReferrerAuthenticator, RepositoryName}
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.revwalk.filter.{
AndRevFilter,
AuthorRevFilter,
CommitTimeRevFilter,
MaxCountRevFilter,
RevFilter,
SkipRevFilter
}
import org.eclipse.jgit.revwalk.filter.*
import org.eclipse.jgit.treewalk.filter.{AndTreeFilter, PathFilterGroup, TreeFilter}
import scala.collection.mutable.ListBuffer
import scala.jdk.CollectionConverters._
import scala.util.Using
import math.min
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter._
import java.time.format.DateTimeFormatter.*
import java.time.{LocalDateTime, ZoneOffset}
import java.util.Date
import java.time.ZoneOffset
import scala.collection.mutable.ListBuffer
import scala.jdk.CollectionConverters.*
import scala.math.min
import scala.util.Using
trait ApiRepositoryCommitControllerBase extends ControllerBase {
self: AccountService with CommitsService with ProtectedBranchService with ReferrerAuthenticator =>
@@ -166,7 +159,7 @@ trait ApiRepositoryCommitControllerBase extends ControllerBase {
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
val apiBranchForCommits = for {
branch <- getBranchesOfCommit(git, sha)
br <- getBranches(git, branch, repository.repository.originUserName.isEmpty).find(_.name == branch)
br <- getBranchesNoMergeInfo(git, branch).find(_.name == branch)
} yield {
val protection = getProtectedBranchInfo(repository.owner, repository.name, branch)
ApiBranchForHeadCommit(branch, ApiBranchCommit(br.commitId), protection.enabled)

View File

@@ -2,26 +2,26 @@ package gitbucket.core.service
import com.github.difflib.DiffUtils
import com.github.difflib.patch.DeltaType
import gitbucket.core.model.{CommitComments => _, Session => _, _}
import gitbucket.core.model.Profile._
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.api.JsonFormat
import gitbucket.core.controller.Context
import gitbucket.core.model.Profile.*
import gitbucket.core.model.Profile.profile.blockingApi.*
import gitbucket.core.model.activity.OpenPullRequestInfo
import gitbucket.core.model.{CommitComments as _, Session as _, *}
import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.service.SystemSettingsService.SystemSettings
import gitbucket.core.util.Directory._
import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory.*
import gitbucket.core.util.Implicits.*
import gitbucket.core.util.JGitUtil
import gitbucket.core.util.StringUtil._
import gitbucket.core.util.JGitUtil.{CommitInfo, DiffInfo, getBranches}
import gitbucket.core.util.JGitUtil.{CommitInfo, DiffInfo, getBranchesNoMergeInfo}
import gitbucket.core.util.StringUtil.*
import gitbucket.core.view
import gitbucket.core.view.helpers
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.ObjectId
import scala.jdk.CollectionConverters._
import scala.jdk.CollectionConverters.*
import scala.util.Using
trait PullRequestService {
@@ -32,7 +32,7 @@ trait PullRequestService {
with RepositoryService
with MergeService
with ActivityService =>
import PullRequestService._
import PullRequestService.*
def getPullRequest(owner: String, repository: String, issueId: Int)(implicit
s: Session
@@ -318,7 +318,7 @@ trait PullRequestService {
base.foreach { _base =>
if (pr.branch != _base) {
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
getBranches(git, repository.repository.defaultBranch, origin = true)
getBranchesNoMergeInfo(git, repository.repository.defaultBranch)
.find(_.name == _base)
.foreach(br => updateBaseBranch(repository.owner, repository.name, issueId, br.name, br.commitId))
}

View File

@@ -23,9 +23,9 @@ class GitAuthenticationFilter extends Filter with RepositoryService with Account
private val logger = LoggerFactory.getLogger(classOf[GitAuthenticationFilter])
def init(config: FilterConfig) = {}
override def init(config: FilterConfig) = {}
def destroy(): Unit = {}
override def destroy(): Unit = {}
def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val request = req.asInstanceOf[HttpServletRequest]

View File

@@ -1,17 +1,18 @@
package gitbucket.core.servlet
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
import gitbucket.core.util.Directory
import gitbucket.core.util.Directory.*
import org.apache.commons.io.FileUtils
import Directory._
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
/**
* Removes session associated temporary files when session is destroyed.
*/
class SessionCleanupListener extends HttpSessionListener {
def sessionCreated(se: HttpSessionEvent): Unit = {}
override def sessionCreated(se: HttpSessionEvent): Unit = {}
def sessionDestroyed(se: HttpSessionEvent): Unit = FileUtils.deleteDirectory(getTemporaryDir(se.getSession.getId))
override def sessionDestroyed(se: HttpSessionEvent): Unit =
FileUtils.deleteDirectory(getTemporaryDir(se.getSession.getId))
}

View File

@@ -17,9 +17,9 @@ class TransactionFilter extends Filter {
private val logger = LoggerFactory.getLogger(classOf[TransactionFilter])
def init(config: FilterConfig) = {}
override def init(config: FilterConfig): Unit = {}
def destroy(): Unit = {}
override def destroy(): Unit = {}
def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val servletPath = req.asInstanceOf[HttpServletRequest].getServletPath()

View File

@@ -248,6 +248,14 @@ object JGitUtil {
case class BranchMergeInfo(ahead: Int, behind: Int, isMerged: Boolean)
case class BranchInfoSimple(
name: String,
committerName: String,
commitTime: Date,
committerEmailAddress: String,
commitId: String
)
case class BranchInfo(
name: String,
committerName: String,
@@ -1244,6 +1252,25 @@ object JGitUtil {
git.log.add(startCommit).addPath(path).setMaxCount(1).call.iterator.next
}
def getBranchesNoMergeInfo(git: Git, defaultBranch: String): Seq[BranchInfoSimple] = {
val repo = git.getRepository
val defaultObject = repo.resolve(defaultBranch)
git.branchList.call.asScala.map { ref =>
val walk = new RevWalk(repo)
try {
val branchName = ref.getName.stripPrefix("refs/heads/")
val branchCommit = walk.parseCommit(ref.getObjectId)
val when = branchCommit.getCommitterIdent.getWhen
val committer = branchCommit.getCommitterIdent.getName
val committerEmail = branchCommit.getCommitterIdent.getEmailAddress
BranchInfoSimple(branchName, committer, when, committerEmail, ref.getObjectId.name)
} finally {
walk.dispose()
}
}.toSeq
}
def getBranches(git: Git, defaultBranch: String, origin: Boolean): Seq[BranchInfo] = {
val repo = git.getRepository
val defaultObject = repo.resolve(defaultBranch)

View File

@@ -1,12 +1,13 @@
package gitbucket.core.util
import GitSpecUtil._
import gitbucket.core.util.GitSpecUtil.*
import gitbucket.core.util.JGitUtil.BranchInfoSimple
import org.apache.commons.io.IOUtils
import org.eclipse.jgit.diff.DiffEntry.ChangeType
import org.eclipse.jgit.lib.Constants
import org.scalatest.funsuite.AnyFunSuite
import scala.jdk.CollectionConverters._
import scala.jdk.CollectionConverters.*
class JGitUtilSpec extends AnyFunSuite {
@@ -173,6 +174,26 @@ class JGitUtilSpec extends AnyFunSuite {
}
}
test("getBranchesNoMergeInfo") {
withTestRepository { git =>
createFile(git, Constants.HEAD, "README.md", "body1", message = "commit1")
JGitUtil.createBranch(git, "main", "test1")
createFile(git, Constants.HEAD, "README.md", "body2", message = "commit2")
JGitUtil.createBranch(git, "main", "test2")
// getBranches
val branchesNMI = JGitUtil.getBranchesNoMergeInfo(git, "main")
val branches = JGitUtil.getBranches(git, "main", true)
assert(
branches.map(bi =>
BranchInfoSimple(bi.name, bi.committerName, bi.commitTime, bi.committerEmailAddress, bi.commitId)
) == branchesNMI
)
}
}
test("createTag, getTagsOfCommit and getTagsOnCommit") {
withTestRepository { git =>
createFile(git, Constants.HEAD, "README.md", "body1", message = "commit1")