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

View File

@@ -4,28 +4,21 @@ import gitbucket.core.controller.ControllerBase
import gitbucket.core.model.Account import gitbucket.core.model.Account
import gitbucket.core.service.{AccountService, CommitsService, ProtectedBranchService} import gitbucket.core.service.{AccountService, CommitsService, ProtectedBranchService}
import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util.Directory.getRepositoryDir
import gitbucket.core.util.Implicits._ import gitbucket.core.util.Implicits.*
import gitbucket.core.util.JGitUtil.{CommitInfo, getBranches, getBranchesOfCommit} import gitbucket.core.util.JGitUtil.{CommitInfo, getBranchesNoMergeInfo, getBranchesOfCommit}
import gitbucket.core.util.{JGitUtil, ReferrerAuthenticator, RepositoryName} import gitbucket.core.util.{JGitUtil, ReferrerAuthenticator, RepositoryName}
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.revwalk.filter.{ import org.eclipse.jgit.revwalk.filter.*
AndRevFilter,
AuthorRevFilter,
CommitTimeRevFilter,
MaxCountRevFilter,
RevFilter,
SkipRevFilter
}
import org.eclipse.jgit.treewalk.filter.{AndTreeFilter, PathFilterGroup, TreeFilter} import org.eclipse.jgit.treewalk.filter.{AndTreeFilter, PathFilterGroup, TreeFilter}
import scala.collection.mutable.ListBuffer
import scala.jdk.CollectionConverters._ import java.time.format.DateTimeFormatter.*
import scala.util.Using import java.time.{LocalDateTime, ZoneOffset}
import math.min
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter._
import java.util.Date 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 { trait ApiRepositoryCommitControllerBase extends ControllerBase {
self: AccountService with CommitsService with ProtectedBranchService with ReferrerAuthenticator => 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 => Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
val apiBranchForCommits = for { val apiBranchForCommits = for {
branch <- getBranchesOfCommit(git, sha) branch <- getBranchesOfCommit(git, sha)
br <- getBranches(git, branch, repository.repository.originUserName.isEmpty).find(_.name == branch) br <- getBranchesNoMergeInfo(git, branch).find(_.name == branch)
} yield { } yield {
val protection = getProtectedBranchInfo(repository.owner, repository.name, branch) val protection = getProtectedBranchInfo(repository.owner, repository.name, branch)
ApiBranchForHeadCommit(branch, ApiBranchCommit(br.commitId), protection.enabled) 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.DiffUtils
import com.github.difflib.patch.DeltaType 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.api.JsonFormat
import gitbucket.core.controller.Context 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.activity.OpenPullRequestInfo
import gitbucket.core.model.{CommitComments as _, Session as _, *}
import gitbucket.core.plugin.PluginRegistry import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.service.SystemSettingsService.SystemSettings import gitbucket.core.service.SystemSettingsService.SystemSettings
import gitbucket.core.util.Directory._ import gitbucket.core.util.Directory.*
import gitbucket.core.util.Implicits._ import gitbucket.core.util.Implicits.*
import gitbucket.core.util.JGitUtil import gitbucket.core.util.JGitUtil
import gitbucket.core.util.StringUtil._ import gitbucket.core.util.JGitUtil.{CommitInfo, DiffInfo, getBranchesNoMergeInfo}
import gitbucket.core.util.JGitUtil.{CommitInfo, DiffInfo, getBranches} import gitbucket.core.util.StringUtil.*
import gitbucket.core.view import gitbucket.core.view
import gitbucket.core.view.helpers import gitbucket.core.view.helpers
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.ObjectId import org.eclipse.jgit.lib.ObjectId
import scala.jdk.CollectionConverters._ import scala.jdk.CollectionConverters.*
import scala.util.Using import scala.util.Using
trait PullRequestService { trait PullRequestService {
@@ -32,7 +32,7 @@ trait PullRequestService {
with RepositoryService with RepositoryService
with MergeService with MergeService
with ActivityService => with ActivityService =>
import PullRequestService._ import PullRequestService.*
def getPullRequest(owner: String, repository: String, issueId: Int)(implicit def getPullRequest(owner: String, repository: String, issueId: Int)(implicit
s: Session s: Session
@@ -318,7 +318,7 @@ trait PullRequestService {
base.foreach { _base => base.foreach { _base =>
if (pr.branch != _base) { if (pr.branch != _base) {
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => 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) .find(_.name == _base)
.foreach(br => updateBaseBranch(repository.owner, repository.name, issueId, br.name, br.commitId)) .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]) 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 = { def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val request = req.asInstanceOf[HttpServletRequest] val request = req.asInstanceOf[HttpServletRequest]

View File

@@ -1,17 +1,18 @@
package gitbucket.core.servlet 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 org.apache.commons.io.FileUtils
import Directory._
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
/** /**
* Removes session associated temporary files when session is destroyed. * Removes session associated temporary files when session is destroyed.
*/ */
class SessionCleanupListener extends HttpSessionListener { 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]) 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 = { def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val servletPath = req.asInstanceOf[HttpServletRequest].getServletPath() 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 BranchMergeInfo(ahead: Int, behind: Int, isMerged: Boolean)
case class BranchInfoSimple(
name: String,
committerName: String,
commitTime: Date,
committerEmailAddress: String,
commitId: String
)
case class BranchInfo( case class BranchInfo(
name: String, name: String,
committerName: String, committerName: String,
@@ -1244,6 +1252,25 @@ object JGitUtil {
git.log.add(startCommit).addPath(path).setMaxCount(1).call.iterator.next 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] = { def getBranches(git: Git, defaultBranch: String, origin: Boolean): Seq[BranchInfo] = {
val repo = git.getRepository val repo = git.getRepository
val defaultObject = repo.resolve(defaultBranch) val defaultObject = repo.resolve(defaultBranch)

View File

@@ -1,12 +1,13 @@
package gitbucket.core.util 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.apache.commons.io.IOUtils
import org.eclipse.jgit.diff.DiffEntry.ChangeType import org.eclipse.jgit.diff.DiffEntry.ChangeType
import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.Constants
import org.scalatest.funsuite.AnyFunSuite import org.scalatest.funsuite.AnyFunSuite
import scala.jdk.CollectionConverters._ import scala.jdk.CollectionConverters.*
class JGitUtilSpec extends AnyFunSuite { 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") { test("createTag, getTagsOfCommit and getTagsOnCommit") {
withTestRepository { git => withTestRepository { git =>
createFile(git, Constants.HEAD, "README.md", "body1", message = "commit1") createFile(git, Constants.HEAD, "README.md", "body1", message = "commit1")