Add get-a-repository-README endpoint (#2535)

This commit is contained in:
onukura
2020-09-07 04:05:46 +09:00
committed by GitHub
parent 0da781c33d
commit bfc44cff98
3 changed files with 36 additions and 12 deletions

View File

@@ -908,10 +908,6 @@ trait RepositoryViewerControllerBase extends ControllerBase {
lazy val isValid: Boolean = fileIds.nonEmpty
}
private val readmeFiles = PluginRegistry().renderableExtensions.map { extension =>
s"readme.${extension}"
} ++ Seq("readme.txt", "readme")
/**
* Provides HTML of the file list.
*

View File

@@ -1,6 +1,7 @@
package gitbucket.core.controller.api
import gitbucket.core.api.{ApiContents, ApiError, CreateAFile, JsonFormat}
import gitbucket.core.controller.ControllerBase
import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.service.{RepositoryCommitFileService, RepositoryService}
import gitbucket.core.util.Directory.getRepositoryDir
import gitbucket.core.util.JGitUtil.{FileInfo, getContentFromId, getFileList}
@@ -8,15 +9,27 @@ import gitbucket.core.util._
import gitbucket.core.view.helpers.{isRenderable, renderMarkup}
import gitbucket.core.util.Implicits._
import org.eclipse.jgit.api.Git
import scala.util.Using
trait ApiRepositoryContentsControllerBase extends ControllerBase {
self: ReferrerAuthenticator with WritableUsersAuthenticator with RepositoryCommitFileService =>
/*
* i. Get the README
* https://developer.github.com/v3/repos/contents/#get-the-readme
/**
* i. Get a repository README
* https://docs.github.com/en/rest/reference/repos#get-a-repository-readme
*/
get("/api/v3/repos/:owner/:repository/readme")(referrersOnly { repository =>
Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) {
git =>
val refStr = params.getOrElse("ref", repository.repository.defaultBranch)
val fileList = getFileList(git, refStr, ".", maxFiles = context.settings.repositoryViewer.maxFiles)
fileList.map(f => f.name).find(p => readmeFiles.map(_.toLowerCase).contains(p.toLowerCase)) match {
case Some(x) => getContents(repository = repository, path = x, refStr = refStr, ignoreCase = true)
case _ => NotFound()
}
}
})
/**
* ii. Get contents
@@ -34,22 +47,32 @@ trait ApiRepositoryContentsControllerBase extends ControllerBase {
getContents(repository, multiParams("splat").head, params.getOrElse("ref", repository.repository.defaultBranch))
})
private def getContents(repository: RepositoryService.RepositoryInfo, path: String, refStr: String) = {
def getFileInfo(git: Git, revision: String, pathStr: String): Option[FileInfo] = {
private def getContents(
repository: RepositoryService.RepositoryInfo,
path: String,
refStr: String,
ignoreCase: Boolean = false
) = {
def getFileInfo(git: Git, revision: String, pathStr: String, ignoreCase: Boolean): Option[FileInfo] = {
val (dirName, fileName) = pathStr.lastIndexOf('/') match {
case -1 =>
(".", pathStr)
case n =>
(pathStr.take(n), pathStr.drop(n + 1))
}
getFileList(git, revision, dirName, maxFiles = context.settings.repositoryViewer.maxFiles)
.find(_.name.equals(fileName))
if (ignoreCase) {
getFileList(git, revision, dirName, maxFiles = context.settings.repositoryViewer.maxFiles)
.find(_.name.toLowerCase.equals(fileName.toLowerCase))
} else {
getFileList(git, revision, dirName, maxFiles = context.settings.repositoryViewer.maxFiles)
.find(_.name.equals(fileName))
}
}
Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git =>
val fileList = getFileList(git, refStr, path, maxFiles = context.settings.repositoryViewer.maxFiles)
if (fileList.isEmpty) { // file or NotFound
getFileInfo(git, refStr, path)
getFileInfo(git, refStr, path, ignoreCase)
.flatMap { f =>
val largeFile = params.get("large_file").exists(s => s.equals("true"))
val content = getContentFromId(git, f.id, largeFile)

View File

@@ -116,6 +116,11 @@ trait RepositoryCommitFileService {
}
}
def readmeFiles: Seq[String] =
PluginRegistry().renderableExtensions.map { extension =>
s"readme.${extension}"
} ++ Seq("readme.txt", "readme")
private def _commitFile(
repository: RepositoryService.RepositoryInfo,
branch: String,