diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index e5b9020..047a548 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -908,10 +908,6 @@ 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. * diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryContentsControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryContentsControllerBase.scala index 98dc8b6..6559e38 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryContentsControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryContentsControllerBase.scala @@ -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.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 @@ 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) diff --git a/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala index 6a0f651..9dbee15 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala @@ -116,6 +116,11 @@ } } + def readmeFiles: Seq[String] = + PluginRegistry().renderableExtensions.map { extension => + s"readme.${extension}" + } ++ Seq("readme.txt", "readme") + private def _commitFile( repository: RepositoryService.RepositoryInfo, branch: String,