mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 03:26:06 +01:00
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:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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))
|
||||
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user