diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala index 92173b7..3670b8e 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala @@ -9,6 +9,7 @@ import gitbucket.core.util.{JGitUtil, ReferrerAuthenticator, RepositoryName} import org.eclipse.jgit.api.Git import org.eclipse.jgit.revwalk.RevWalk +import scala.jdk.CollectionConverters._ import scala.util.Using trait ApiRepositoryCommitControllerBase extends ControllerBase { @@ -17,6 +18,33 @@ * i. List commits on a repository * https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository */ + get("/api/v3/repos/:owner/:repository/commits")(referrersOnly { repository => + val owner = repository.owner + val name = repository.name + // TODO: The following parameters need to be implemented. [:path, :author, :since, :until] + val sha = if (request.body.nonEmpty) (parse(request.body) \ "sha").extract[String] else "refs/heads/master"; + Using.resource(Git.open(getRepositoryDir(owner, name))) { + git => + val repo = git.getRepository + Using.resource(new RevWalk(repo)) { + revWalk => + val objectId = repo.resolve(sha) + revWalk.markStart(revWalk.parseCommit(objectId)) + JsonFormat(revWalk.asScala.take(30).map { + commit => + val commitInfo = new CommitInfo(commit) + ApiCommits( + repositoryName = RepositoryName(repository), + commitInfo = commitInfo, + diffs = JGitUtil.getDiffs(git, commitInfo.parents.headOption, commitInfo.id, false, true), + author = getAccount(commitInfo.authorName, commitInfo.authorEmailAddress), + committer = getAccount(commitInfo.committerName, commitInfo.committerEmailAddress), + commentCount = getCommitComment(repository.owner, repository.name, commitInfo.id.toString).size + ) + }) + } + } + }) /* * ii. Get a single commit