mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 06:55:54 +01:00
Merge pull request #925 from team-lab/feature/add-compare-link-for-webhook-push
Feature/add properties for webhook push
This commit is contained in:
@@ -20,13 +20,21 @@ case class ApiCommit(
|
|||||||
removed: List[String],
|
removed: List[String],
|
||||||
modified: List[String],
|
modified: List[String],
|
||||||
author: ApiPersonIdent,
|
author: ApiPersonIdent,
|
||||||
committer: ApiPersonIdent)(repositoryName:RepositoryName) extends FieldSerializable{
|
committer: ApiPersonIdent)(repositoryName:RepositoryName, urlIsHtmlUrl: Boolean) extends FieldSerializable{
|
||||||
val url = ApiPath(s"/api/v3/${repositoryName.fullName}/commits/${id}")
|
val url = if(urlIsHtmlUrl){
|
||||||
val html_url = ApiPath(s"/${repositoryName.fullName}/commit/${id}")
|
ApiPath(s"/${repositoryName.fullName}/commit/${id}")
|
||||||
|
}else{
|
||||||
|
ApiPath(s"/api/v3/${repositoryName.fullName}/commits/${id}")
|
||||||
|
}
|
||||||
|
val html_url = if(urlIsHtmlUrl){
|
||||||
|
None
|
||||||
|
}else{
|
||||||
|
Some(ApiPath(s"/${repositoryName.fullName}/commit/${id}"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object ApiCommit{
|
object ApiCommit{
|
||||||
def apply(git: Git, repositoryName: RepositoryName, commit: CommitInfo): ApiCommit = {
|
def apply(git: Git, repositoryName: RepositoryName, commit: CommitInfo, urlIsHtmlUrl: Boolean = false): ApiCommit = {
|
||||||
val diffs = JGitUtil.getDiffs(git, commit.id, false)
|
val diffs = JGitUtil.getDiffs(git, commit.id, false)
|
||||||
ApiCommit(
|
ApiCommit(
|
||||||
id = commit.id,
|
id = commit.id,
|
||||||
@@ -43,6 +51,7 @@ object ApiCommit{
|
|||||||
},
|
},
|
||||||
author = ApiPersonIdent.author(commit),
|
author = ApiPersonIdent.author(commit),
|
||||||
committer = ApiPersonIdent.committer(commit)
|
committer = ApiPersonIdent.committer(commit)
|
||||||
)(repositoryName)
|
)(repositoryName, urlIsHtmlUrl)
|
||||||
}
|
}
|
||||||
|
def forPushPayload(git: Git, repositoryName: RepositoryName, commit: CommitInfo): ApiCommit = apply(git, repositoryName, commit, true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
package gitbucket.core.api
|
|
||||||
|
|
||||||
import gitbucket.core.util.JGitUtil
|
|
||||||
import gitbucket.core.util.JGitUtil.CommitInfo
|
|
||||||
import gitbucket.core.util.RepositoryName
|
|
||||||
|
|
||||||
import org.eclipse.jgit.diff.DiffEntry
|
|
||||||
import org.eclipse.jgit.api.Git
|
|
||||||
|
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
/**
|
|
||||||
* https://developer.github.com/v3/activity/events/types/#pushevent
|
|
||||||
*/
|
|
||||||
case class ApiPushCommit(
|
|
||||||
id: String,
|
|
||||||
message: String,
|
|
||||||
timestamp: Date,
|
|
||||||
added: List[String],
|
|
||||||
removed: List[String],
|
|
||||||
modified: List[String],
|
|
||||||
author: ApiPersonIdent,
|
|
||||||
committer: ApiPersonIdent)(repositoryName:RepositoryName) extends FieldSerializable {
|
|
||||||
val url = ApiPath(s"/${repositoryName.fullName}/commit/${id}")
|
|
||||||
}
|
|
||||||
|
|
||||||
object ApiPushCommit{
|
|
||||||
def apply(commit: ApiCommit, repositoryName: RepositoryName): ApiPushCommit = ApiPushCommit(
|
|
||||||
id = commit.id,
|
|
||||||
message = commit.message,
|
|
||||||
timestamp = commit.timestamp,
|
|
||||||
added = commit.added,
|
|
||||||
removed = commit.removed,
|
|
||||||
modified = commit.modified,
|
|
||||||
author = commit.author,
|
|
||||||
committer = commit.committer)(repositoryName)
|
|
||||||
def apply(git: Git, repositoryName: RepositoryName, commit: CommitInfo): ApiPushCommit =
|
|
||||||
ApiPushCommit(ApiCommit(git, repositoryName, commit), repositoryName)
|
|
||||||
}
|
|
||||||
@@ -13,10 +13,14 @@ case class ApiRepository(
|
|||||||
forks: Int,
|
forks: Int,
|
||||||
`private`: Boolean,
|
`private`: Boolean,
|
||||||
default_branch: String,
|
default_branch: String,
|
||||||
owner: ApiUser) {
|
owner: ApiUser)(urlIsHtmlUrl: Boolean) {
|
||||||
val forks_count = forks
|
val forks_count = forks
|
||||||
val watchers_count = watchers
|
val watchers_count = watchers
|
||||||
val url = ApiPath(s"/api/v3/repos/${full_name}")
|
val url = if(urlIsHtmlUrl){
|
||||||
|
ApiPath(s"/${full_name}")
|
||||||
|
}else{
|
||||||
|
ApiPath(s"/api/v3/repos/${full_name}")
|
||||||
|
}
|
||||||
val http_url = ApiPath(s"/git/${full_name}.git")
|
val http_url = ApiPath(s"/git/${full_name}.git")
|
||||||
val clone_url = ApiPath(s"/git/${full_name}.git")
|
val clone_url = ApiPath(s"/git/${full_name}.git")
|
||||||
val html_url = ApiPath(s"/${full_name}")
|
val html_url = ApiPath(s"/${full_name}")
|
||||||
@@ -27,7 +31,8 @@ object ApiRepository{
|
|||||||
repository: Repository,
|
repository: Repository,
|
||||||
owner: ApiUser,
|
owner: ApiUser,
|
||||||
forkedCount: Int =0,
|
forkedCount: Int =0,
|
||||||
watchers: Int = 0): ApiRepository =
|
watchers: Int = 0,
|
||||||
|
urlIsHtmlUrl: Boolean = false): ApiRepository =
|
||||||
ApiRepository(
|
ApiRepository(
|
||||||
name = repository.repositoryName,
|
name = repository.repositoryName,
|
||||||
full_name = s"${repository.userName}/${repository.repositoryName}",
|
full_name = s"${repository.userName}/${repository.repositoryName}",
|
||||||
@@ -37,7 +42,7 @@ object ApiRepository{
|
|||||||
`private` = repository.isPrivate,
|
`private` = repository.isPrivate,
|
||||||
default_branch = repository.defaultBranch,
|
default_branch = repository.defaultBranch,
|
||||||
owner = owner
|
owner = owner
|
||||||
)
|
)(urlIsHtmlUrl)
|
||||||
|
|
||||||
def apply(repositoryInfo: RepositoryInfo, owner: ApiUser): ApiRepository =
|
def apply(repositoryInfo: RepositoryInfo, owner: ApiUser): ApiRepository =
|
||||||
ApiRepository(repositoryInfo.repository, owner, forkedCount=repositoryInfo.forkedCount)
|
ApiRepository(repositoryInfo.repository, owner, forkedCount=repositoryInfo.forkedCount)
|
||||||
@@ -45,4 +50,7 @@ object ApiRepository{
|
|||||||
def apply(repositoryInfo: RepositoryInfo, owner: Account): ApiRepository =
|
def apply(repositoryInfo: RepositoryInfo, owner: Account): ApiRepository =
|
||||||
this(repositoryInfo.repository, ApiUser(owner))
|
this(repositoryInfo.repository, ApiUser(owner))
|
||||||
|
|
||||||
|
def forPushPayload(repositoryInfo: RepositoryInfo, owner: ApiUser): ApiRepository =
|
||||||
|
ApiRepository(repositoryInfo.repository, owner, forkedCount=repositoryInfo.forkedCount, urlIsHtmlUrl=true)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import org.apache.commons.io.FileUtils
|
|||||||
import org.scalatra.i18n.Messages
|
import org.scalatra.i18n.Messages
|
||||||
import org.eclipse.jgit.api.Git
|
import org.eclipse.jgit.api.Git
|
||||||
import org.eclipse.jgit.lib.Constants
|
import org.eclipse.jgit.lib.Constants
|
||||||
|
import org.eclipse.jgit.lib.ObjectId
|
||||||
|
|
||||||
|
|
||||||
class RepositorySettingsController extends RepositorySettingsControllerBase
|
class RepositorySettingsController extends RepositorySettingsControllerBase
|
||||||
@@ -165,13 +166,15 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
val commits = if(repository.commitCount == 0) List.empty else git.log
|
val commits = if(repository.commitCount == 0) List.empty else git.log
|
||||||
.add(git.getRepository.resolve(repository.repository.defaultBranch))
|
.add(git.getRepository.resolve(repository.repository.defaultBranch))
|
||||||
.setMaxCount(3)
|
.setMaxCount(4)
|
||||||
.call.iterator.asScala.map(new CommitInfo(_))
|
.call.iterator.asScala.map(new CommitInfo(_)).toList
|
||||||
|
|
||||||
getAccountByUserName(repository.owner).foreach { ownerAccount =>
|
getAccountByUserName(repository.owner).foreach { ownerAccount =>
|
||||||
callWebHook("push",
|
callWebHook("push",
|
||||||
List(WebHook(repository.owner, repository.name, form.url)),
|
List(WebHook(repository.owner, repository.name, form.url)),
|
||||||
WebHookPushPayload(git, ownerAccount, "refs/heads/" + repository.repository.defaultBranch, repository, commits.toList, ownerAccount)
|
WebHookPushPayload(git, ownerAccount, "refs/heads/" + repository.repository.defaultBranch, repository, (if(commits.isEmpty){Nil}else{commits.tail}), ownerAccount,
|
||||||
|
oldId = commits.lastOption.map(_.id).map(ObjectId.fromString).getOrElse(ObjectId.zeroId()),
|
||||||
|
newId = commits.headOption.map(_.id).map(ObjectId.fromString).getOrElse(ObjectId.zeroId()))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
flash += "url" -> form.url
|
flash += "url" -> form.url
|
||||||
|
|||||||
@@ -669,7 +669,8 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
val commit = new JGitUtil.CommitInfo(JGitUtil.getRevCommitFromId(git, commitId))
|
val commit = new JGitUtil.CommitInfo(JGitUtil.getRevCommitFromId(git, commitId))
|
||||||
callWebHookOf(repository.owner, repository.name, "push") {
|
callWebHookOf(repository.owner, repository.name, "push") {
|
||||||
getAccountByUserName(repository.owner).map{ ownerAccount =>
|
getAccountByUserName(repository.owner).map{ ownerAccount =>
|
||||||
WebHookPushPayload(git, loginAccount, headName, repository, List(commit), ownerAccount)
|
WebHookPushPayload(git, loginAccount, headName, repository, List(commit), ownerAccount,
|
||||||
|
oldId = headTip, newId = commitId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import org.apache.http.NameValuePair
|
|||||||
import org.apache.http.client.entity.UrlEncodedFormEntity
|
import org.apache.http.client.entity.UrlEncodedFormEntity
|
||||||
import org.apache.http.message.BasicNameValuePair
|
import org.apache.http.message.BasicNameValuePair
|
||||||
import org.eclipse.jgit.api.Git
|
import org.eclipse.jgit.api.Git
|
||||||
|
import org.eclipse.jgit.lib.ObjectId
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
|
|
||||||
@@ -192,21 +193,33 @@ object WebHookService {
|
|||||||
case class WebHookPushPayload(
|
case class WebHookPushPayload(
|
||||||
pusher: ApiUser,
|
pusher: ApiUser,
|
||||||
ref: String,
|
ref: String,
|
||||||
commits: List[ApiPushCommit],
|
before: String,
|
||||||
|
after: String,
|
||||||
|
commits: List[ApiCommit],
|
||||||
repository: ApiRepository
|
repository: ApiRepository
|
||||||
) extends WebHookPayload
|
) extends FieldSerializable with WebHookPayload {
|
||||||
|
val compare = commits.size match {
|
||||||
|
case 0 => ApiPath(s"/${repository.full_name}") // maybe test hook on un-initalied repository
|
||||||
|
case 1 => ApiPath(s"/${repository.full_name}/commit/${after}")
|
||||||
|
case _ if before.filterNot(_=='0').isEmpty => ApiPath(s"/${repository.full_name}/compare/${commits.head.id}^...${after}")
|
||||||
|
case _ => ApiPath(s"/${repository.full_name}/compare/${before}...${after}")
|
||||||
|
}
|
||||||
|
val head_commit = commits.lastOption
|
||||||
|
}
|
||||||
|
|
||||||
object WebHookPushPayload {
|
object WebHookPushPayload {
|
||||||
def apply(git: Git, pusher: Account, refName: String, repositoryInfo: RepositoryInfo,
|
def apply(git: Git, pusher: Account, refName: String, repositoryInfo: RepositoryInfo,
|
||||||
commits: List[CommitInfo], repositoryOwner: Account): WebHookPushPayload =
|
commits: List[CommitInfo], repositoryOwner: Account,
|
||||||
|
newId: ObjectId, oldId: ObjectId): WebHookPushPayload =
|
||||||
WebHookPushPayload(
|
WebHookPushPayload(
|
||||||
ApiUser(pusher),
|
pusher = ApiUser(pusher),
|
||||||
refName,
|
ref = refName,
|
||||||
commits.map{ commit => ApiPushCommit(git, RepositoryName(repositoryInfo), commit) },
|
before = ObjectId.toString(oldId),
|
||||||
ApiRepository(
|
after = ObjectId.toString(newId),
|
||||||
|
commits = commits.map{ commit => ApiCommit.forPushPayload(git, RepositoryName(repositoryInfo), commit) },
|
||||||
|
repository = ApiRepository.forPushPayload(
|
||||||
repositoryInfo,
|
repositoryInfo,
|
||||||
owner= ApiUser(repositoryOwner)
|
owner= ApiUser(repositoryOwner))
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,8 @@ class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl:
|
|||||||
callWebHookOf(owner, repository, "push"){
|
callWebHookOf(owner, repository, "push"){
|
||||||
for(pusherAccount <- getAccountByUserName(pusher);
|
for(pusherAccount <- getAccountByUserName(pusher);
|
||||||
ownerAccount <- getAccountByUserName(owner)) yield {
|
ownerAccount <- getAccountByUserName(owner)) yield {
|
||||||
WebHookPushPayload(git, pusherAccount, command.getRefName, repositoryInfo, newCommits, ownerAccount)
|
WebHookPushPayload(git, pusherAccount, command.getRefName, repositoryInfo, newCommits, ownerAccount,
|
||||||
|
newId = command.getNewId(), oldId = command.getOldId())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class JsonFormatSpec extends Specification {
|
|||||||
forks = 0,
|
forks = 0,
|
||||||
`private` = false,
|
`private` = false,
|
||||||
default_branch = "master",
|
default_branch = "master",
|
||||||
owner = apiUser)
|
owner = apiUser)(urlIsHtmlUrl = false)
|
||||||
val repositoryJson = s"""{
|
val repositoryJson = s"""{
|
||||||
"name" : "Hello-World",
|
"name" : "Hello-World",
|
||||||
"full_name" : "octocat/Hello-World",
|
"full_name" : "octocat/Hello-World",
|
||||||
@@ -85,7 +85,7 @@ class JsonFormatSpec extends Specification {
|
|||||||
"url": "http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/commits/6dcb09b5b57875f334f61aebed695e2e4193db5e/statuses"
|
"url": "http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/commits/6dcb09b5b57875f334f61aebed695e2e4193db5e/statuses"
|
||||||
}"""
|
}"""
|
||||||
|
|
||||||
val apiPushCommit = ApiPushCommit(
|
val apiPushCommit = ApiCommit(
|
||||||
id = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
|
id = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
|
||||||
message = "Update README.md",
|
message = "Update README.md",
|
||||||
timestamp = date1,
|
timestamp = date1,
|
||||||
@@ -93,7 +93,7 @@ class JsonFormatSpec extends Specification {
|
|||||||
removed = Nil,
|
removed = Nil,
|
||||||
modified = List("README.md"),
|
modified = List("README.md"),
|
||||||
author = ApiPersonIdent("baxterthehacker","baxterthehacker@users.noreply.github.com",date1),
|
author = ApiPersonIdent("baxterthehacker","baxterthehacker@users.noreply.github.com",date1),
|
||||||
committer = ApiPersonIdent("baxterthehacker","baxterthehacker@users.noreply.github.com",date1))(RepositoryName("baxterthehacker", "public-repo"))
|
committer = ApiPersonIdent("baxterthehacker","baxterthehacker@users.noreply.github.com",date1))(RepositoryName("baxterthehacker", "public-repo"), true)
|
||||||
val apiPushCommitJson = s"""{
|
val apiPushCommitJson = s"""{
|
||||||
"id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
|
"id": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c",
|
||||||
// "distinct": true,
|
// "distinct": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user