mirror of
https://github.com/gitbucket/gitbucket.git
synced 2026-01-02 21:59:56 +01:00
Add get-a-repository-README endpoint (#2535)
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user