Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96948ede69 | ||
|
|
9bd0b6a801 | ||
|
|
8b969927e1 | ||
|
|
c2ffdf6d63 |
2
.gitignore
vendored
@@ -2,8 +2,6 @@
|
|||||||
*.log
|
*.log
|
||||||
.ensime
|
.ensime
|
||||||
.ensime_cache
|
.ensime_cache
|
||||||
.DS_Store
|
|
||||||
.java-version
|
|
||||||
|
|
||||||
# sbt specific
|
# sbt specific
|
||||||
dist/*
|
dist/*
|
||||||
|
|||||||
24
build.sbt
@@ -15,9 +15,9 @@ sourcesInBase := false
|
|||||||
organization := Organization
|
organization := Organization
|
||||||
name := Name
|
name := Name
|
||||||
version := GitBucketVersion
|
version := GitBucketVersion
|
||||||
scalaVersion := "2.13.10"
|
scalaVersion := "2.13.9"
|
||||||
|
|
||||||
// scalafmtOnCompile := true
|
scalafmtOnCompile := true
|
||||||
|
|
||||||
coverageExcludedPackages := ".*\\.html\\..*"
|
coverageExcludedPackages := ".*\\.html\\..*"
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ libraryDependencies ++= Seq(
|
|||||||
"org.scalatra" %% "scalatra" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
"org.scalatra" %% "scalatra" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
||||||
"org.scalatra" %% "scalatra-json" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
"org.scalatra" %% "scalatra-json" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
||||||
"org.scalatra" %% "scalatra-forms" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
"org.scalatra" %% "scalatra-forms" % ScalatraVersion cross CrossVersion.for3Use2_13,
|
||||||
"org.json4s" %% "json4s-jackson" % "4.0.6" cross CrossVersion.for3Use2_13,
|
"org.json4s" %% "json4s-jackson" % "4.0.5" cross CrossVersion.for3Use2_13,
|
||||||
"commons-io" % "commons-io" % "2.11.0",
|
"commons-io" % "commons-io" % "2.11.0",
|
||||||
"io.github.gitbucket" % "solidbase" % "1.0.5",
|
"io.github.gitbucket" % "solidbase" % "1.0.5",
|
||||||
"io.github.gitbucket" % "markedj" % "1.0.17",
|
"io.github.gitbucket" % "markedj" % "1.0.17",
|
||||||
@@ -42,11 +42,11 @@ libraryDependencies ++= Seq(
|
|||||||
"commons-net" % "commons-net" % "3.8.0",
|
"commons-net" % "commons-net" % "3.8.0",
|
||||||
"org.apache.httpcomponents" % "httpclient" % "4.5.13",
|
"org.apache.httpcomponents" % "httpclient" % "4.5.13",
|
||||||
"org.apache.sshd" % "apache-sshd" % "2.9.1" exclude ("org.slf4j", "slf4j-jdk14") exclude ("org.apache.sshd", "sshd-mina") exclude ("org.apache.sshd", "sshd-netty"),
|
"org.apache.sshd" % "apache-sshd" % "2.9.1" exclude ("org.slf4j", "slf4j-jdk14") exclude ("org.apache.sshd", "sshd-mina") exclude ("org.apache.sshd", "sshd-netty"),
|
||||||
"org.apache.tika" % "tika-core" % "2.5.0",
|
"org.apache.tika" % "tika-core" % "2.4.1",
|
||||||
"com.github.takezoe" %% "blocking-slick-32" % "0.0.12" cross CrossVersion.for3Use2_13,
|
"com.github.takezoe" %% "blocking-slick-32" % "0.0.12" cross CrossVersion.for3Use2_13,
|
||||||
"com.novell.ldap" % "jldap" % "2009-10-07",
|
"com.novell.ldap" % "jldap" % "2009-10-07",
|
||||||
"com.h2database" % "h2" % "1.4.199",
|
"com.h2database" % "h2" % "1.4.199",
|
||||||
"org.mariadb.jdbc" % "mariadb-java-client" % "3.0.8",
|
"org.mariadb.jdbc" % "mariadb-java-client" % "3.0.7",
|
||||||
"org.postgresql" % "postgresql" % "42.5.0",
|
"org.postgresql" % "postgresql" % "42.5.0",
|
||||||
"ch.qos.logback" % "logback-classic" % "1.2.11",
|
"ch.qos.logback" % "logback-classic" % "1.2.11",
|
||||||
"com.zaxxer" % "HikariCP" % "4.0.3" exclude ("org.slf4j", "slf4j-api"),
|
"com.zaxxer" % "HikariCP" % "4.0.3" exclude ("org.slf4j", "slf4j-api"),
|
||||||
@@ -54,21 +54,21 @@ libraryDependencies ++= Seq(
|
|||||||
"fr.brouillard.oss.security.xhub" % "xhub4j-core" % "1.1.0",
|
"fr.brouillard.oss.security.xhub" % "xhub4j-core" % "1.1.0",
|
||||||
"io.github.java-diff-utils" % "java-diff-utils" % "4.12",
|
"io.github.java-diff-utils" % "java-diff-utils" % "4.12",
|
||||||
"org.cache2k" % "cache2k-all" % "1.6.0.Final",
|
"org.cache2k" % "cache2k-all" % "1.6.0.Final",
|
||||||
"net.coobird" % "thumbnailator" % "0.4.18",
|
"net.coobird" % "thumbnailator" % "0.4.17",
|
||||||
"com.github.zafarkhaja" % "java-semver" % "0.9.0",
|
"com.github.zafarkhaja" % "java-semver" % "0.9.0",
|
||||||
"com.nimbusds" % "oauth2-oidc-sdk" % "10.1",
|
"com.nimbusds" % "oauth2-oidc-sdk" % "9.43.1",
|
||||||
"org.eclipse.jetty" % "jetty-webapp" % JettyVersion % "provided",
|
"org.eclipse.jetty" % "jetty-webapp" % JettyVersion % "provided",
|
||||||
"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
|
"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
|
||||||
"junit" % "junit" % "4.13.2" % "test",
|
"junit" % "junit" % "4.13.2" % "test",
|
||||||
"org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test" cross CrossVersion.for3Use2_13,
|
"org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test" cross CrossVersion.for3Use2_13,
|
||||||
"org.mockito" % "mockito-core" % "4.8.1" % "test",
|
"org.mockito" % "mockito-core" % "4.8.0" % "test",
|
||||||
"com.dimafeng" %% "testcontainers-scala" % "0.40.11" % "test",
|
"com.dimafeng" %% "testcontainers-scala" % "0.40.10" % "test",
|
||||||
"org.testcontainers" % "mysql" % "1.17.5" % "test",
|
"org.testcontainers" % "mysql" % "1.17.3" % "test",
|
||||||
"org.testcontainers" % "postgresql" % "1.17.5" % "test",
|
"org.testcontainers" % "postgresql" % "1.17.3" % "test",
|
||||||
"net.i2p.crypto" % "eddsa" % "0.3.0",
|
"net.i2p.crypto" % "eddsa" % "0.3.0",
|
||||||
"is.tagomor.woothee" % "woothee-java" % "1.11.0",
|
"is.tagomor.woothee" % "woothee-java" % "1.11.0",
|
||||||
"org.ec4j.core" % "ec4j-core" % "0.3.0",
|
"org.ec4j.core" % "ec4j-core" % "0.3.0",
|
||||||
"org.kohsuke" % "github-api" % "1.313" % "test"
|
"org.kohsuke" % "github-api" % "1.308" % "test"
|
||||||
)
|
)
|
||||||
|
|
||||||
libraryDependencies ~= {
|
libraryDependencies ~= {
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 203 KiB |
@@ -1 +1 @@
|
|||||||
sbt.version=1.7.2
|
sbt.version=1.7.1
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")
|
|||||||
|
|
||||||
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")
|
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")
|
||||||
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.5.1")
|
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.5.1")
|
||||||
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
|
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")
|
||||||
addSbtPlugin("org.scalatra.sbt" % "sbt-scalatra" % "1.0.4")
|
addSbtPlugin("org.scalatra.sbt" % "sbt-scalatra" % "1.0.4")
|
||||||
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
|
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
|
||||||
addSbtPlugin("com.typesafe.sbt" % "sbt-license-report" % "1.2.0")
|
addSbtPlugin("com.typesafe.sbt" % "sbt-license-report" % "1.2.0")
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.0 KiB |
@@ -100,16 +100,4 @@ trait ApiControllerBase extends ControllerBase {
|
|||||||
get("/api/v3/gitbucket/plugins") {
|
get("/api/v3/gitbucket/plugins") {
|
||||||
PluginRegistry().getPlugins().map { ApiPlugin(_) }
|
PluginRegistry().getPlugins().map { ApiPlugin(_) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* https://docs.github.com/en/enterprise-server@2.21/rest/reference/meta#get-github-enterprise-server-meta-information
|
|
||||||
*/
|
|
||||||
get("/api/v3/meta") {
|
|
||||||
JsonFormat(
|
|
||||||
Map(
|
|
||||||
"https://api.github.com/meta" -> context.loginAccount.isDefined,
|
|
||||||
"installed_version" -> "2.21.0"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,25 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
getRepository(pullreq.requestUserName, pullreq.requestRepositoryName),
|
getRepository(pullreq.requestUserName, pullreq.requestRepositoryName),
|
||||||
flash.iterator.map(f => f._1 -> f._2.toString).toMap
|
flash.iterator.map(f => f._1 -> f._2.toString).toMap
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// html.pullreq(
|
||||||
|
// issue,
|
||||||
|
// pullreq,
|
||||||
|
// comments,
|
||||||
|
// getIssueLabels(owner, name, issueId),
|
||||||
|
// getAssignableUserNames(owner, name),
|
||||||
|
// getMilestonesWithIssueCount(owner, name),
|
||||||
|
// getPriorities(owner, name),
|
||||||
|
// getLabels(owner, name),
|
||||||
|
// commits,
|
||||||
|
// diffs,
|
||||||
|
// isEditable(repository),
|
||||||
|
// isManageable(repository),
|
||||||
|
// hasDeveloperRole(pullreq.requestUserName, pullreq.requestRepositoryName, context.loginAccount),
|
||||||
|
// repository,
|
||||||
|
// getRepository(pullreq.requestUserName, pullreq.requestRepositoryName),
|
||||||
|
// flash.toMap.map(f => f._1 -> f._2.toString)
|
||||||
|
// )
|
||||||
}
|
}
|
||||||
} getOrElse NotFound()
|
} getOrElse NotFound()
|
||||||
})
|
})
|
||||||
@@ -377,9 +396,9 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
||||||
val headBranch = params.get("head")
|
val headBranch: Option[String] = params.get("head")
|
||||||
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
||||||
case (Some(originUserName), Some(originRepositoryName)) =>
|
case (Some(originUserName), Some(originRepositoryName)) => {
|
||||||
getRepository(originUserName, originRepositoryName).map {
|
getRepository(originUserName, originRepositoryName).map {
|
||||||
originRepository =>
|
originRepository =>
|
||||||
Using.resources(
|
Using.resources(
|
||||||
@@ -396,7 +415,8 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} getOrElse NotFound()
|
} getOrElse NotFound()
|
||||||
case _ =>
|
}
|
||||||
|
case _ => {
|
||||||
Using.resource(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))) { git =>
|
Using.resource(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))) { git =>
|
||||||
JGitUtil.getDefaultBranch(git, forkedRepository).map {
|
JGitUtil.getDefaultBranch(git, forkedRepository).map {
|
||||||
case (_, defaultBranch) =>
|
case (_, defaultBranch) =>
|
||||||
@@ -408,14 +428,15 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
private def getOriginRepositoryName(
|
get("/:owner/:repository/compare/*...*")(referrersOnly { forkedRepository =>
|
||||||
originOwner: String,
|
val Seq(origin, forked) = multiParams("splat")
|
||||||
forkedOwner: String,
|
val (originOwner, originId) = parseCompareIdentifier(origin, forkedRepository.owner)
|
||||||
forkedRepository: RepositoryInfo
|
val (forkedOwner, forkedId) = parseCompareIdentifier(forked, forkedRepository.owner)
|
||||||
): Option[String] = {
|
|
||||||
if (originOwner == forkedOwner) {
|
(for (originRepositoryName <- if (originOwner == forkedOwner) {
|
||||||
// Self repository
|
// Self repository
|
||||||
Some(forkedRepository.name)
|
Some(forkedRepository.name)
|
||||||
} else if (forkedRepository.repository.originUserName.isEmpty) {
|
} else if (forkedRepository.repository.originUserName.isEmpty) {
|
||||||
@@ -434,21 +455,13 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
x.repository.originRepositoryName == forkedRepository.repository.originRepositoryName
|
x.repository.originRepositoryName == forkedRepository.repository.originRepositoryName
|
||||||
}
|
}
|
||||||
.map(_.repository.repositoryName)
|
.map(_.repository.repositoryName)
|
||||||
}
|
};
|
||||||
}
|
|
||||||
|
|
||||||
get("/:owner/:repository/compare/*...*")(referrersOnly { forkedRepository =>
|
|
||||||
val Seq(origin, forked) = multiParams("splat")
|
|
||||||
val (originOwner, originId) = parseCompareIdentifier(origin, forkedRepository.owner)
|
|
||||||
val (forkedOwner, forkedId) = parseCompareIdentifier(forked, forkedRepository.owner)
|
|
||||||
|
|
||||||
(for (originRepositoryName <- getOriginRepositoryName(originOwner, forkedOwner, forkedRepository);
|
|
||||||
originRepository <- getRepository(originOwner, originRepositoryName)) yield {
|
originRepository <- getRepository(originOwner, originRepositoryName)) yield {
|
||||||
val (oldId, newId) =
|
val (oldId, newId) =
|
||||||
getPullRequestCommitFromTo(originRepository, forkedRepository, originId, forkedId)
|
getPullRequestCommitFromTo(originRepository, forkedRepository, originId, forkedId)
|
||||||
|
|
||||||
(oldId, newId) match {
|
(oldId, newId) match {
|
||||||
case (Some(oldId), Some(newId)) =>
|
case (Some(oldId), Some(newId)) => {
|
||||||
val (commits, diffs) = getRequestCompareInfo(
|
val (commits, diffs) = getRequestCompareInfo(
|
||||||
originRepository.owner,
|
originRepository.owner,
|
||||||
originRepository.name,
|
originRepository.name,
|
||||||
@@ -499,6 +512,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
getLabels(originRepository.owner, originRepository.name),
|
getLabels(originRepository.owner, originRepository.name),
|
||||||
getCustomFields(originRepository.owner, originRepository.name).filter(_.enableForPullRequests)
|
getCustomFields(originRepository.owner, originRepository.name).filter(_.enableForPullRequests)
|
||||||
)
|
)
|
||||||
|
}
|
||||||
case (oldId, newId) =>
|
case (oldId, newId) =>
|
||||||
redirect(
|
redirect(
|
||||||
s"/${forkedRepository.owner}/${forkedRepository.name}/compare/" +
|
s"/${forkedRepository.owner}/${forkedRepository.name}/compare/" +
|
||||||
@@ -510,54 +524,6 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
}) getOrElse NotFound()
|
}) getOrElse NotFound()
|
||||||
})
|
})
|
||||||
|
|
||||||
ajaxGet("/:owner/:repository/diff/:id")(referrersOnly { repository =>
|
|
||||||
(for {
|
|
||||||
commitId <- params.get("id")
|
|
||||||
path <- params.get("path")
|
|
||||||
diff <- getSingleDiff(repository.owner, repository.name, commitId, path)
|
|
||||||
} yield {
|
|
||||||
contentType = formats("json")
|
|
||||||
org.json4s.jackson.Serialization.write(
|
|
||||||
Map(
|
|
||||||
"oldContent" -> diff.oldContent,
|
|
||||||
"newContent" -> diff.newContent
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}) getOrElse NotFound()
|
|
||||||
})
|
|
||||||
|
|
||||||
ajaxGet("/:owner/:repository/diff/*...*")(referrersOnly { forkedRepository =>
|
|
||||||
val Seq(origin, forked) = multiParams("splat")
|
|
||||||
val (originOwner, originId) = parseCompareIdentifier(origin, forkedRepository.owner)
|
|
||||||
val (forkedOwner, forkedId) = parseCompareIdentifier(forked, forkedRepository.owner)
|
|
||||||
|
|
||||||
(for {
|
|
||||||
path <- params.get("path")
|
|
||||||
originRepositoryName <- getOriginRepositoryName(originOwner, forkedOwner, forkedRepository)
|
|
||||||
originRepository <- getRepository(originOwner, originRepositoryName)
|
|
||||||
(oldId, newId) = getPullRequestCommitFromTo(originRepository, forkedRepository, originId, forkedId)
|
|
||||||
oldId <- oldId
|
|
||||||
newId <- newId
|
|
||||||
diff <- getSingleDiff(
|
|
||||||
originRepository.owner,
|
|
||||||
originRepository.name,
|
|
||||||
oldId.getName,
|
|
||||||
forkedRepository.owner,
|
|
||||||
forkedRepository.name,
|
|
||||||
newId.getName,
|
|
||||||
path
|
|
||||||
)
|
|
||||||
} yield {
|
|
||||||
contentType = formats("json")
|
|
||||||
org.json4s.jackson.Serialization.write(
|
|
||||||
Map(
|
|
||||||
"oldContent" -> diff.oldContent,
|
|
||||||
"newContent" -> diff.newContent
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}) getOrElse NotFound()
|
|
||||||
})
|
|
||||||
|
|
||||||
ajaxGet("/:owner/:repository/compare/*...*/mergecheck")(readableUsersOnly { forkedRepository =>
|
ajaxGet("/:owner/:repository/compare/*...*/mergecheck")(readableUsersOnly { forkedRepository =>
|
||||||
val Seq(origin, forked) = multiParams("splat")
|
val Seq(origin, forked) = multiParams("splat")
|
||||||
val (originOwner, tmpOriginBranch) = parseCompareIdentifier(origin, forkedRepository.owner)
|
val (originOwner, tmpOriginBranch) = parseCompareIdentifier(origin, forkedRepository.owner)
|
||||||
|
|||||||
@@ -331,12 +331,15 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/upload", uploadForm)(writableUsersOnly { (form, repository) =>
|
post("/:owner/:repository/upload", uploadForm)(writableUsersOnly { (form, repository) =>
|
||||||
def _commit(
|
def _commit(
|
||||||
branchName: String,
|
branchName: String,
|
||||||
|
//files: Seq[CommitFile],
|
||||||
newFiles: Seq[CommitFile],
|
newFiles: Seq[CommitFile],
|
||||||
loginAccount: Account
|
loginAccount: Account
|
||||||
): Either[String, ObjectId] = {
|
): Either[String, ObjectId] = {
|
||||||
commitFiles(
|
commitFiles(
|
||||||
repository = repository,
|
repository = repository,
|
||||||
branch = branchName,
|
branch = branchName,
|
||||||
|
//path = form.path,
|
||||||
|
//files = files.toIndexedSeq,
|
||||||
message = form.message.getOrElse("Add files via upload"),
|
message = form.message.getOrElse("Add files via upload"),
|
||||||
loginAccount = loginAccount,
|
loginAccount = loginAccount,
|
||||||
settings = context.settings
|
settings = context.settings
|
||||||
@@ -611,7 +614,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
} else {
|
} else {
|
||||||
_commit(form.branch, loginAccount) match {
|
_commit(form.branch, loginAccount) match {
|
||||||
case Right(_) =>
|
case Right(_) =>
|
||||||
if (form.path.isEmpty) {
|
if (form.path.length == 0) {
|
||||||
redirect(s"/${repository.owner}/${repository.name}/tree/${encodeRefName(form.branch)}")
|
redirect(s"/${repository.owner}/${repository.name}/tree/${encodeRefName(form.branch)}")
|
||||||
} else {
|
} else {
|
||||||
redirect(
|
redirect(
|
||||||
|
|||||||
@@ -472,40 +472,6 @@ trait PullRequestService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getSingleDiff(
|
|
||||||
userName: String,
|
|
||||||
repositoryName: String,
|
|
||||||
commitId: String,
|
|
||||||
path: String
|
|
||||||
): Option[DiffInfo] = {
|
|
||||||
Using.resource(
|
|
||||||
Git.open(getRepositoryDir(userName, repositoryName))
|
|
||||||
) { git =>
|
|
||||||
val newId = git.getRepository.resolve(commitId)
|
|
||||||
JGitUtil.getDiff(git, None, newId.getName, path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def getSingleDiff(
|
|
||||||
userName: String,
|
|
||||||
repositoryName: String,
|
|
||||||
branch: String,
|
|
||||||
requestUserName: String,
|
|
||||||
requestRepositoryName: String,
|
|
||||||
requestCommitId: String,
|
|
||||||
path: String
|
|
||||||
): Option[DiffInfo] = {
|
|
||||||
Using.resources(
|
|
||||||
Git.open(getRepositoryDir(userName, repositoryName)),
|
|
||||||
Git.open(getRepositoryDir(requestUserName, requestRepositoryName))
|
|
||||||
) { (oldGit, newGit) =>
|
|
||||||
val oldId = oldGit.getRepository.resolve(branch)
|
|
||||||
val newId = newGit.getRepository.resolve(requestCommitId)
|
|
||||||
|
|
||||||
JGitUtil.getDiff(newGit, Some(oldId.getName), newId.getName, path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def getRequestCompareInfo(
|
def getRequestCompareInfo(
|
||||||
userName: String,
|
userName: String,
|
||||||
repositoryName: String,
|
repositoryName: String,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ object JGitUtil {
|
|||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(JGitUtil.getClass)
|
private val logger = LoggerFactory.getLogger(JGitUtil.getClass)
|
||||||
|
|
||||||
private implicit val objectDatabaseReleasable: Releasable[ObjectDatabase] =
|
implicit val objectDatabaseReleasable: Releasable[ObjectDatabase] =
|
||||||
_.close()
|
_.close()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -690,7 +690,7 @@ object JGitUtil {
|
|||||||
|
|
||||||
val toCommit = revWalk.parseCommit(git.getRepository.resolve(to))
|
val toCommit = revWalk.parseCommit(git.getRepository.resolve(to))
|
||||||
(from match {
|
(from match {
|
||||||
case None =>
|
case None => {
|
||||||
toCommit.getParentCount match {
|
toCommit.getParentCount match {
|
||||||
case 0 =>
|
case 0 =>
|
||||||
df.scan(
|
df.scan(
|
||||||
@@ -700,9 +700,11 @@ object JGitUtil {
|
|||||||
.asScala
|
.asScala
|
||||||
case _ => df.scan(toCommit.getParent(0), toCommit.getTree).asScala
|
case _ => df.scan(toCommit.getParent(0), toCommit.getTree).asScala
|
||||||
}
|
}
|
||||||
case Some(from) =>
|
}
|
||||||
|
case Some(from) => {
|
||||||
val fromCommit = revWalk.parseCommit(git.getRepository.resolve(from))
|
val fromCommit = revWalk.parseCommit(git.getRepository.resolve(from))
|
||||||
df.scan(fromCommit.getTree, toCommit.getTree).asScala
|
df.scan(fromCommit.getTree, toCommit.getTree).asScala
|
||||||
|
}
|
||||||
}).toSeq
|
}).toSeq
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -717,29 +719,6 @@ object JGitUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getDiff(git: Git, from: Option[String], to: String, path: String): Option[DiffInfo] = {
|
|
||||||
getDiffEntries(git, from, to).find(_.getNewPath == path).map { diff =>
|
|
||||||
val oldIsImage = FileUtil.isImage(diff.getOldPath)
|
|
||||||
val newIsImage = FileUtil.isImage(diff.getNewPath)
|
|
||||||
val includeContent = oldIsImage || newIsImage
|
|
||||||
DiffInfo(
|
|
||||||
changeType = diff.getChangeType,
|
|
||||||
oldPath = diff.getOldPath,
|
|
||||||
newPath = diff.getNewPath,
|
|
||||||
oldContent = if (includeContent) None else getTextContent(git, diff.getOldId.toObjectId),
|
|
||||||
newContent = if (includeContent) None else getTextContent(git, diff.getNewId.toObjectId),
|
|
||||||
oldIsImage = oldIsImage,
|
|
||||||
newIsImage = newIsImage,
|
|
||||||
oldObjectId = Option(diff.getOldId).map(_.name),
|
|
||||||
newObjectId = Option(diff.getNewId).map(_.name),
|
|
||||||
oldMode = diff.getOldMode.toString,
|
|
||||||
newMode = diff.getNewMode.toString,
|
|
||||||
tooLarge = false,
|
|
||||||
patch = None
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def getDiffs(
|
def getDiffs(
|
||||||
git: Git,
|
git: Git,
|
||||||
from: Option[String],
|
from: Option[String],
|
||||||
@@ -749,7 +728,7 @@ object JGitUtil {
|
|||||||
): List[DiffInfo] = {
|
): List[DiffInfo] = {
|
||||||
val diffs = getDiffEntries(git, from, to)
|
val diffs = getDiffEntries(git, from, to)
|
||||||
diffs.map { diff =>
|
diffs.map { diff =>
|
||||||
if (diffs.size > 100) { // Don't show diff if there are more than 100 files
|
if (diffs.size > 100) {
|
||||||
DiffInfo(
|
DiffInfo(
|
||||||
changeType = diff.getChangeType,
|
changeType = diff.getChangeType,
|
||||||
oldPath = diff.getOldPath,
|
oldPath = diff.getOldPath,
|
||||||
@@ -768,33 +747,47 @@ object JGitUtil {
|
|||||||
} else {
|
} else {
|
||||||
val oldIsImage = FileUtil.isImage(diff.getOldPath)
|
val oldIsImage = FileUtil.isImage(diff.getOldPath)
|
||||||
val newIsImage = FileUtil.isImage(diff.getNewPath)
|
val newIsImage = FileUtil.isImage(diff.getNewPath)
|
||||||
val patch = if (oldIsImage || newIsImage) None else Some(makePatchFromDiffEntry(git, diff)) // TODO use DiffFormatter
|
if (!fetchContent || oldIsImage || newIsImage) {
|
||||||
val tooLarge = patch.exists(_.count(_ == '\n') > 1000) // Don't show diff if the file has more than 1000 lines diff
|
|
||||||
val includeContent = tooLarge || !fetchContent || oldIsImage || newIsImage
|
|
||||||
DiffInfo(
|
DiffInfo(
|
||||||
changeType = diff.getChangeType,
|
changeType = diff.getChangeType,
|
||||||
oldPath = diff.getOldPath,
|
oldPath = diff.getOldPath,
|
||||||
newPath = diff.getNewPath,
|
newPath = diff.getNewPath,
|
||||||
oldContent = if (includeContent) None else getTextContent(git, diff.getOldId.toObjectId),
|
oldContent = None,
|
||||||
newContent = if (includeContent) None else getTextContent(git, diff.getNewId.toObjectId),
|
newContent = None,
|
||||||
oldIsImage = oldIsImage,
|
oldIsImage = oldIsImage,
|
||||||
newIsImage = newIsImage,
|
newIsImage = newIsImage,
|
||||||
oldObjectId = Option(diff.getOldId).map(_.name),
|
oldObjectId = Option(diff.getOldId).map(_.name),
|
||||||
newObjectId = Option(diff.getNewId).map(_.name),
|
newObjectId = Option(diff.getNewId).map(_.name),
|
||||||
oldMode = diff.getOldMode.toString,
|
oldMode = diff.getOldMode.toString,
|
||||||
newMode = diff.getNewMode.toString,
|
newMode = diff.getNewMode.toString,
|
||||||
tooLarge = tooLarge,
|
tooLarge = false,
|
||||||
patch = if (makePatch) patch else None
|
patch = (if (makePatch) Some(makePatchFromDiffEntry(git, diff)) else None) // TODO use DiffFormatter
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
DiffInfo(
|
||||||
|
changeType = diff.getChangeType,
|
||||||
|
oldPath = diff.getOldPath,
|
||||||
|
newPath = diff.getNewPath,
|
||||||
|
oldContent = JGitUtil
|
||||||
|
.getContentFromId(git, diff.getOldId.toObjectId, false)
|
||||||
|
.filter(FileUtil.isText)
|
||||||
|
.map(convertFromByteArray),
|
||||||
|
newContent = JGitUtil
|
||||||
|
.getContentFromId(git, diff.getNewId.toObjectId, false)
|
||||||
|
.filter(FileUtil.isText)
|
||||||
|
.map(convertFromByteArray),
|
||||||
|
oldIsImage = oldIsImage,
|
||||||
|
newIsImage = newIsImage,
|
||||||
|
oldObjectId = Option(diff.getOldId).map(_.name),
|
||||||
|
newObjectId = Option(diff.getNewId).map(_.name),
|
||||||
|
oldMode = diff.getOldMode.toString,
|
||||||
|
newMode = diff.getNewMode.toString,
|
||||||
|
tooLarge = false,
|
||||||
|
patch = (if (makePatch) Some(makePatchFromDiffEntry(git, diff)) else None) // TODO use DiffFormatter
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}.toList
|
|
||||||
}
|
}
|
||||||
|
}.toList
|
||||||
private def getTextContent(git: Git, objectId: ObjectId): Option[String] = {
|
|
||||||
JGitUtil
|
|
||||||
.getContentFromId(git, objectId, false)
|
|
||||||
.filter(FileUtil.isText)
|
|
||||||
.map(convertFromByteArray)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def makePatchFromDiffEntry(git: Git, diff: DiffEntry): String = {
|
private def makePatchFromDiffEntry(git: Git, diff: DiffEntry): String = {
|
||||||
|
|||||||
@@ -100,21 +100,8 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr class="diff-collapse-@i collapse in">
|
<tr class="diff-collapse-@i collapse in">
|
||||||
<td style="padding: 0;">
|
<td style="padding: 0;">
|
||||||
@if(diff.tooLarge) {
|
@if(diff.oldObjectId == diff.newObjectId){
|
||||||
<div style="padding: 12px;" id="show-diff-@i">
|
@if(diff.oldPath != diff.newPath){
|
||||||
@if(oldCommitId.isEmpty && newCommitId.isDefined) {
|
|
||||||
Too large (<a href="javascript:showDiff(@i, '', '@newCommitId', '@diff.newPath')">Show diff</a>)
|
|
||||||
}
|
|
||||||
@if(oldCommitId.isDefined && newCommitId.isDefined) {
|
|
||||||
Too large (<a href="javascript:showDiff(@i, '@oldCommitId', '@newCommitId', '@diff.newPath')">Show diff</a>)
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
<div id="diffText-@i" class="diffText"></div>
|
|
||||||
<input type="hidden" id="newText-@i" data-file-name="@diff.newPath" data-val="">
|
|
||||||
<input type="hidden" id="oldText-@i" data-file-name="@diff.oldPath" data-val="">
|
|
||||||
} else {
|
|
||||||
@if(diff.oldObjectId == diff.newObjectId) {
|
|
||||||
@if(diff.oldPath != diff.newPath) {
|
|
||||||
<div class="diff-same">File renamed without changes</div>
|
<div class="diff-same">File renamed without changes</div>
|
||||||
} else {
|
} else {
|
||||||
<div class="diff-same">File mode changed</div>
|
<div class="diff-same">File mode changed</div>
|
||||||
@@ -142,6 +129,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
} else {
|
||||||
|
@if(diff.tooLarge){
|
||||||
|
<div style="padding: 12px;">Too large</div>
|
||||||
} else {
|
} else {
|
||||||
<div style="padding: 12px;">Not supported</div>
|
<div style="padding: 12px;">Not supported</div>
|
||||||
}
|
}
|
||||||
@@ -210,10 +200,53 @@ $(function(){
|
|||||||
renderOneDiff($(this).closest("table").find(".diffText"), window.viewType, $(this).closest("table").find(".file-hash")[0].id);
|
renderOneDiff($(this).closest("table").find(".diffText"), window.viewType, $(this).closest("table").find(".file-hash")[0].id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function getInlineContainer(where) {
|
||||||
|
if (window.viewType == 0) {
|
||||||
|
if (where === 'new') {
|
||||||
|
return $('<tr class="not-diff"><td colspan="2"></td><td colspan="2" class="comment-box-container"></td></tr>');
|
||||||
|
} else {
|
||||||
|
return $('<tr class="not-diff"><td colspan="2" class="comment-box-container"></td><td colspan="2"></td></tr>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $('<tr class="not-diff"><td colspan="3" class="comment-box-container"></td></tr>');
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof $('#show-notes')[0] !== 'undefined' && !$('#show-notes')[0].checked) {
|
if (typeof $('#show-notes')[0] !== 'undefined' && !$('#show-notes')[0].checked) {
|
||||||
$('#comment-list').children('.inline-comment').hide();
|
$('#comment-list').children('.inline-comment').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showCommentForm(commitId, fileName, oldLineNumber, newLineNumber, $tr){
|
||||||
|
// assemble Ajax url
|
||||||
|
let url = '@helpers.url(repository)/commit/' + commitId + '/comment/_form?fileName=' + fileName@issueId.map { id => + '&issueId=@id' };
|
||||||
|
if (!isNaN(oldLineNumber) && oldLineNumber) {
|
||||||
|
url += ('&oldLineNumber=' + oldLineNumber)
|
||||||
|
}
|
||||||
|
if (!isNaN(newLineNumber) && newLineNumber) {
|
||||||
|
url += ('&newLineNumber=' + newLineNumber)
|
||||||
|
}
|
||||||
|
// send Ajax request
|
||||||
|
$.get(url, { dataType : 'html' }, function(responseContent) {
|
||||||
|
// create container
|
||||||
|
let tmp;
|
||||||
|
if (!isNaN(oldLineNumber) && oldLineNumber) {
|
||||||
|
if (!isNaN(newLineNumber) && newLineNumber) {
|
||||||
|
tmp = getInlineContainer();
|
||||||
|
} else {
|
||||||
|
tmp = getInlineContainer('old');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tmp = getInlineContainer('new');
|
||||||
|
}
|
||||||
|
// add comment textarea
|
||||||
|
tmp.addClass('inline-comment-form').children('.comment-box-container').html(responseContent);
|
||||||
|
$tr.nextAll(':not(.not-diff):first').before(tmp);
|
||||||
|
// hide reply comment field
|
||||||
|
$(tmp).closest('.not-diff').prev().find('.reply-comment').closest('.not-diff').hide();
|
||||||
|
// focus textarea
|
||||||
|
tmp.find('textarea').focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Add comment button
|
// Add comment button
|
||||||
$('.diff-outside').on('click','table.diff .add-comment',function() {
|
$('.diff-outside').on('click','table.diff .add-comment',function() {
|
||||||
const $this = $(this);
|
const $this = $(this);
|
||||||
@@ -269,52 +302,8 @@ $(function(){
|
|||||||
getSelection().empty();
|
getSelection().empty();
|
||||||
updateHighlighting();
|
updateHighlighting();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
function getInlineContainer(where) {
|
function renderOneCommitCommentIntoDiff($v, diff){
|
||||||
if (window.viewType == 0) {
|
|
||||||
if (where === 'new') {
|
|
||||||
return $('<tr class="not-diff"><td colspan="2"></td><td colspan="2" class="comment-box-container"></td></tr>');
|
|
||||||
} else {
|
|
||||||
return $('<tr class="not-diff"><td colspan="2" class="comment-box-container"></td><td colspan="2"></td></tr>');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $('<tr class="not-diff"><td colspan="3" class="comment-box-container"></td></tr>');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showCommentForm(commitId, fileName, oldLineNumber, newLineNumber, $tr){
|
|
||||||
// assemble Ajax url
|
|
||||||
let url = '@helpers.url(repository)/commit/' + commitId + '/comment/_form?fileName=' + fileName@issueId.map { id => + '&issueId=@id' };
|
|
||||||
if (!isNaN(oldLineNumber) && oldLineNumber) {
|
|
||||||
url += ('&oldLineNumber=' + oldLineNumber)
|
|
||||||
}
|
|
||||||
if (!isNaN(newLineNumber) && newLineNumber) {
|
|
||||||
url += ('&newLineNumber=' + newLineNumber)
|
|
||||||
}
|
|
||||||
// send Ajax request
|
|
||||||
$.get(url, { dataType : 'html' }, function(responseContent) {
|
|
||||||
// create container
|
|
||||||
let tmp;
|
|
||||||
if (!isNaN(oldLineNumber) && oldLineNumber) {
|
|
||||||
if (!isNaN(newLineNumber) && newLineNumber) {
|
|
||||||
tmp = getInlineContainer();
|
|
||||||
} else {
|
|
||||||
tmp = getInlineContainer('old');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tmp = getInlineContainer('new');
|
|
||||||
}
|
|
||||||
// add comment textarea
|
|
||||||
tmp.addClass('inline-comment-form').children('.comment-box-container').html(responseContent);
|
|
||||||
$tr.nextAll(':not(.not-diff):first').before(tmp);
|
|
||||||
// hide reply comment field
|
|
||||||
$(tmp).closest('.not-diff').prev().find('.reply-comment').closest('.not-diff').hide();
|
|
||||||
// focus textarea
|
|
||||||
tmp.find('textarea').focus();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderOneCommitCommentIntoDiff($v, diff){
|
|
||||||
//var filename = $v.attr('filename');
|
//var filename = $v.attr('filename');
|
||||||
const oldline = $v.attr('oldline');
|
const oldline = $v.attr('oldline');
|
||||||
const newline = $v.attr('newline');
|
const newline = $v.attr('newline');
|
||||||
@@ -335,9 +324,9 @@ function renderOneCommitCommentIntoDiff($v, diff){
|
|||||||
if (!diff.find('.toggle-notes').prop('checked')) {
|
if (!diff.find('.toggle-notes').prop('checked')) {
|
||||||
tmp.hide();
|
tmp.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderStatBar(add, del){
|
function renderStatBar(add, del){
|
||||||
if(add + del > 5){
|
if(add + del > 5){
|
||||||
if(add){
|
if(add){
|
||||||
if(add < del){
|
if(add < del){
|
||||||
@@ -361,9 +350,9 @@ function renderStatBar(add, del){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderOneDiff(diffText, viewType, fileHash){
|
function renderOneDiff(diffText, viewType, fileHash){
|
||||||
const table = diffText.closest("table[data-diff-id]");
|
const table = diffText.closest("table[data-diff-id]");
|
||||||
const i = table.data("diff-id");
|
const i = table.data("diff-id");
|
||||||
const ignoreWhiteSpace = table.find('.ignore-whitespace').prop('checked');
|
const ignoreWhiteSpace = table.find('.ignore-whitespace').prop('checked');
|
||||||
@@ -391,9 +380,9 @@ function renderOneDiff(diffText, viewType, fileHash){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderReplyComment($table){
|
function renderReplyComment($table){
|
||||||
const elements = {};
|
const elements = {};
|
||||||
let filename, newline, oldline;
|
let filename, newline, oldline;
|
||||||
$table.find('.comment-box-container .inline-comment').each(function(i, e){
|
$table.find('.comment-box-container .inline-comment').each(function(i, e){
|
||||||
@@ -433,9 +422,9 @@ function renderReplyComment($table){
|
|||||||
}
|
}
|
||||||
elements[key]['element'].closest('.not-diff').after(tmp);
|
elements[key]['element'].closest('.not-diff').after(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderDiffs() {
|
function renderDiffs() {
|
||||||
const diffs = $('.diffText');
|
const diffs = $('.diffText');
|
||||||
let i = 0;
|
let i = 0;
|
||||||
function render(){
|
function render(){
|
||||||
@@ -451,26 +440,8 @@ function renderDiffs() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
render();
|
render();
|
||||||
}
|
|
||||||
|
|
||||||
function showDiff(index, fromId, toId, path){
|
|
||||||
let url = '@helpers.url(repository)/diff/';
|
|
||||||
if (fromId == '') {
|
|
||||||
url = url + encodeURIComponent(toId);
|
|
||||||
} else {
|
|
||||||
url = url + encodeURIComponent(fromId) + '...' + encodeURIComponent(toId);
|
|
||||||
}
|
}
|
||||||
$.get(url, { path : path }, function(data) {
|
});
|
||||||
$('#oldText-' + index).attr('data-val', data.oldContent);
|
|
||||||
$('#newText-' + index).attr('data-val', data.newContent);
|
|
||||||
const diffs = $('.diffText');
|
|
||||||
const $table = renderOneDiff($(diffs[index]), window.viewType, $('.file-hash')[index].id);
|
|
||||||
@if(hasWritePermission) {
|
|
||||||
renderReplyComment($table);
|
|
||||||
}
|
|
||||||
$('#show-diff-' + index).hide();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeDisplaySetting(key, value){
|
function changeDisplaySetting(key, value){
|
||||||
let url = '';
|
let url = '';
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
comments: Seq[gitbucket.core.model.Comment],
|
comments: Seq[gitbucket.core.model.Comment],
|
||||||
changedFileSize: Int,
|
changedFileSize: Int,
|
||||||
issueLabels: List[gitbucket.core.model.Label],
|
issueLabels: List[gitbucket.core.model.Label],
|
||||||
issueAssignees: List[gitbucket.core.model.IssueAssignee],
|
issueAsignees: List[gitbucket.core.model.IssueAssignee],
|
||||||
collaborators: List[String],
|
collaborators: List[String],
|
||||||
milestones: List[(gitbucket.core.model.Milestone, Int, Int)],
|
milestones: List[(gitbucket.core.model.Milestone, Int, Int)],
|
||||||
priorities: List[gitbucket.core.model.Priority],
|
priorities: List[gitbucket.core.model.Priority],
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
Some(issue),
|
Some(issue),
|
||||||
comments.toList,
|
comments.toList,
|
||||||
issueLabels,
|
issueLabels,
|
||||||
issueAssignees,
|
issueAsignees,
|
||||||
collaborators,
|
collaborators,
|
||||||
milestones,
|
milestones,
|
||||||
priorities,
|
priorities,
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 85 B After Width: | Height: | Size: 949 B |
|
Before Width: | Height: | Size: 625 B After Width: | Height: | Size: 691 B |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 7.5 KiB |