Fix authentication for repository.

This commit is contained in:
takezoe
2013-07-03 16:34:35 +09:00
parent 04da7eb9de
commit ac5d380602
3 changed files with 159 additions and 271 deletions

View File

@@ -18,194 +18,159 @@ class RepositoryViewerController extends RepositoryViewerControllerBase
* The repository viewer.
*/
trait RepositoryViewerControllerBase extends ControllerBase {
self: RepositoryService with AccountService with ReferrerAuthenticator =>
self: RepositoryService with AccountService with ReferrerAuthenticator =>
/**
* Returns converted HTML from Markdown for preview.
*/
post("/:owner/:repository/_preview")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val content = params("content")
val enableWikiLink = params("enableWikiLink").toBoolean
val enableCommitLink = params("enableCommitLink").toBoolean
val enableIssueLink = params("enableIssueLink").toBoolean
post("/:owner/:repository/_preview")(referrersOnly { repository =>
contentType = "text/html"
view.helpers.markdown(content, getRepository(owner, repository, baseUrl).get,
enableWikiLink, enableCommitLink, enableIssueLink)
view.helpers.markdown(params("content"), repository,
params("enableWikiLink").toBoolean,
params("enableCommitLink").toBoolean,
params("enableIssueLink").toBoolean)
})
/**
* Displays the file list of the repository root and the default branch.
*/
get("/:owner/:repository")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
fileList(owner, repository)
fileList(_)
})
/**
* Displays the file list of the repository root and the specified branch.
*/
get("/:owner/:repository/tree/:id")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
fileList(owner, repository, params("id"))
fileList(_, params("id"))
})
/**
* Displays the file list of the specified path and branch.
*/
get("/:owner/:repository/tree/:id/*")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
fileList(owner, repository, params("id"), multiParams("splat").head)
fileList(_, params("id"), multiParams("splat").head)
})
/**
* Displays the commit list of the specified branch.
*/
get("/:owner/:repository/commits/:branch")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
get("/:owner/:repository/commits/:branch")(referrersOnly { repository =>
val branchName = params("branch")
val page = params.getOrElse("page", "1").toInt
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30)
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30)
repo.html.commits(Nil, branchName, repositoryInfo, logs.splitWith{ (commit1, commit2) =>
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
}, page, hasNext)
}
} getOrElse NotFound
repo.html.commits(Nil, branchName, repository, logs.splitWith{ (commit1, commit2) =>
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
}, page, hasNext)
}
})
/**
* Displays the commit list of the specified resource.
*/
get("/:owner/:repository/commits/:branch/*")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
get("/:owner/:repository/commits/:branch/*")(referrersOnly { repository =>
val branchName = params("branch")
val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "")
val page = params.getOrElse("page", "1").toInt
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30, path)
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
val (logs, hasNext) = JGitUtil.getCommitLog(git, branchName, page, 30, path)
repo.html.commits(path.split("/").toList, branchName, repositoryInfo,
logs.splitWith{ (commit1, commit2) =>
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
}, page, hasNext)
}
} getOrElse NotFound
repo.html.commits(path.split("/").toList, branchName, repository,
logs.splitWith{ (commit1, commit2) =>
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
}, page, hasNext)
}
})
/**
* Displays the file content of the specified branch or commit.
*/
get("/:owner/:repository/blob/:id/*")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
get("/:owner/:repository/blob/:id/*")(referrersOnly { repository =>
val id = params("id") // branch name or commit id
val raw = params.get("raw").getOrElse("false").toBoolean
val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
@scala.annotation.tailrec
def getPathObjectId(path: String, walk: TreeWalk): ObjectId = walk.next match {
case true if(walk.getPathString == path) => walk.getObjectId(0)
case true => getPathObjectId(path, walk)
}
val treeWalk = new TreeWalk(git.getRepository)
val objectId = try {
treeWalk.addTree(revCommit.getTree)
treeWalk.setRecursive(true)
getPathObjectId(path, treeWalk)
} finally {
treeWalk.release
}
if(raw){
// Download
contentType = "application/octet-stream"
JGitUtil.getContent(git, objectId, false).get
} else {
// Viewer
val large = FileUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize)
val viewer = if(FileUtil.isImage(path)) "image" else if(large) "large" else "other"
val bytes = if(viewer == "other") JGitUtil.getContent(git, objectId, false) else None
val content = if(viewer == "other"){
if(bytes.isDefined && FileUtil.isText(bytes.get)){
// text
JGitUtil.ContentInfo("text", bytes.map(new String(_, "UTF-8")))
} else {
// binary
JGitUtil.ContentInfo("binary", None)
}
} else {
// image or large
JGitUtil.ContentInfo(viewer, None)
}
repo.html.blob(id, repositoryInfo, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit))
}
@scala.annotation.tailrec
def getPathObjectId(path: String, walk: TreeWalk): ObjectId = walk.next match {
case true if(walk.getPathString == path) => walk.getObjectId(0)
case true => getPathObjectId(path, walk)
}
} getOrElse NotFound
val treeWalk = new TreeWalk(git.getRepository)
val objectId = try {
treeWalk.addTree(revCommit.getTree)
treeWalk.setRecursive(true)
getPathObjectId(path, treeWalk)
} finally {
treeWalk.release
}
if(raw){
// Download
contentType = "application/octet-stream"
JGitUtil.getContent(git, objectId, false).get
} else {
// Viewer
val large = FileUtil.isLarge(git.getRepository.getObjectDatabase.open(objectId).getSize)
val viewer = if(FileUtil.isImage(path)) "image" else if(large) "large" else "other"
val bytes = if(viewer == "other") JGitUtil.getContent(git, objectId, false) else None
val content = if(viewer == "other"){
if(bytes.isDefined && FileUtil.isText(bytes.get)){
// text
JGitUtil.ContentInfo("text", bytes.map(new String(_, "UTF-8")))
} else {
// binary
JGitUtil.ContentInfo("binary", None)
}
} else {
// image or large
JGitUtil.ContentInfo(viewer, None)
}
repo.html.blob(id, repository, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit))
}
}
})
/**
* Displays details of the specified commit.
*/
get("/:owner/:repository/commit/:id")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val id = params("id")
get("/:owner/:repository/commit/:id")(referrersOnly { repository =>
val id = params("id")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
repo.html.commit(id, new JGitUtil.CommitInfo(revCommit),
JGitUtil.getBranchesOfCommit(git, revCommit.getName), JGitUtil.getTagsOfCommit(git, revCommit.getName),
repositoryInfo, JGitUtil.getDiffs(git, id))
}
} getOrElse NotFound
repo.html.commit(id, new JGitUtil.CommitInfo(revCommit),
JGitUtil.getBranchesOfCommit(git, revCommit.getName), JGitUtil.getTagsOfCommit(git, revCommit.getName),
repository, JGitUtil.getDiffs(git, id))
}
})
/**
* Displays tags.
*/
get("/:owner/:repository/tags")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map(repo.html.tags(_)) getOrElse NotFound
repo.html.tags(_)
})
/**
* Download repository contents as an archive.
*/
get("/:owner/:repository/archive/:name")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val name = params("name")
get("/:owner/:repository/archive/:name")(referrersOnly { repository =>
val name = params("name")
if(name.endsWith(".zip")){
val revision = name.replaceFirst("\\.zip$", "")
val workDir = getDownloadWorkDir(owner, repository, session.getId)
val workDir = getDownloadWorkDir(repository.owner, repository.name, session.getId)
if(workDir.exists){
FileUtils.deleteDirectory(workDir)
}
@@ -214,7 +179,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
// clone the repository
val cloneDir = new File(workDir, revision)
JGitUtil.withGit(Git.cloneRepository
.setURI(getRepositoryDir(owner, repository).toURI.toString)
.setURI(getRepositoryDir(repository.owner, repository.name).toURI.toString)
.setDirectory(cloneDir)
.call){ git =>
@@ -239,21 +204,20 @@ trait RepositoryViewerControllerBase extends ControllerBase {
/**
* Provides HTML of the file list.
*
* @param owner the repository owner
* @param repository the repository name
* @param repository the repository information
* @param revstr the branch name or commit id(optional)
* @param path the directory path (optional)
* @return HTML of the file list
*/
private def fileList(owner: String, repository: String, revstr: String = "", path: String = ".") = {
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = {
getRepository(repository.owner, repository.name, baseUrl).map { repositoryInfo =>
val revision = if(revstr.isEmpty){
repositoryInfo.repository.defaultBranch
} else {
revstr
}
JGitUtil.withGit(getRepositoryDir(owner, repository)){ git =>
JGitUtil.withGit(getRepositoryDir(repositoryInfo.owner, repositoryInfo.name)){ git =>
// get latest commit
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision))
@@ -261,7 +225,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
// process README.md
val readme = files.find(_.name == "README.md").map { file =>
new String(JGitUtil.getContent(Git.open(getRepositoryDir(owner, repository)), file.id, true).get, "UTF-8")
new String(JGitUtil.getContent(Git.open(getRepositoryDir(repositoryInfo.owner, repositoryInfo.name)), file.id, true).get, "UTF-8")
}
repo.html.files(

View File

@@ -29,45 +29,30 @@ trait SettingsControllerBase extends ControllerBase {
/**
* Redirect to the Options page.
*/
get("/:owner/:repository/settings")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
redirect("/%s/%s/settings/options".format(owner, repository))
get("/:owner/:repository/settings")(ownerOnly { repository =>
redirect("/%s/%s/settings/options".format(repository.owner, repository.name))
})
/**
* Display the Options page.
*/
get("/:owner/:repository/settings/options")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map(settings.html.options(_)) getOrElse NotFound
settings.html.options(_)
})
/**
* Save the repository options.
*/
post("/:owner/:repository/settings/options", optionsForm)(ownerOnly { form =>
val owner = params("owner")
val repository = params("repository")
// save repository options
saveRepositoryOptions(owner, repository, form.description, form.defaultBranch, form.isPrivate)
redirect("%s/%s/settings/options".format(owner, repository))
post("/:owner/:repository/settings/options", optionsForm)(ownerOnly { (form, repository) =>
saveRepositoryOptions(repository.owner, repository.name, form.description, form.defaultBranch, form.isPrivate)
redirect("%s/%s/settings/options".format(repository.owner, repository.name))
})
/**
* Display the Collaborators page.
*/
get("/:owner/:repository/settings/collaborators")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map(
settings.html.collaborators(getCollaborators(owner, repository), _)) getOrElse NotFound
get("/:owner/:repository/settings/collaborators")(ownerOnly { repository =>
settings.html.collaborators(getCollaborators(repository.owner, repository.name), repository)
})
/**
@@ -81,50 +66,37 @@ trait SettingsControllerBase extends ControllerBase {
/**
* Add the collaborator.
*/
post("/:owner/:repository/settings/collaborators/add", collaboratorForm)(ownerOnly { form =>
val owner = params("owner")
val repository = params("repository")
addCollaborator(owner, repository, form.userName)
redirect("/%s/%s/settings/collaborators".format(owner, repository))
post("/:owner/:repository/settings/collaborators/add", collaboratorForm)(ownerOnly { (form, repository) =>
addCollaborator(repository.owner, repository.name, form.userName)
redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name))
})
/**
* Add the collaborator.
*/
get("/:owner/:repository/settings/collaborators/remove")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
val userName = params("name")
removeCollaborator(owner, repository, userName)
redirect("/%s/%s/settings/collaborators".format(owner, repository))
get("/:owner/:repository/settings/collaborators/remove")(ownerOnly { repository =>
removeCollaborator(repository.owner, repository.name, params("name"))
redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name))
})
/**
* Display the delete repository page.
*/
get("/:owner/:repository/settings/delete")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map(settings.html.delete(_)) getOrElse NotFound
settings.html.delete(_)
})
/**
* Delete the repository.
*/
post("/:owner/:repository/settings/delete")(ownerOnly {
val owner = params("owner")
val repository = params("repository")
post("/:owner/:repository/settings/delete")(ownerOnly { repository =>
deleteRepository(repository.owner, repository.name)
deleteRepository(owner, repository)
FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name))
FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name))
FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name))
FileUtils.deleteDirectory(getRepositoryDir(owner, repository))
FileUtils.deleteDirectory(getWikiRepositoryDir(owner, repository))
FileUtils.deleteDirectory(getTemporaryDir(owner, repository))
redirect("/%s".format(owner))
redirect("/%s".format(repository.owner))
})
/**

View File

@@ -27,140 +27,92 @@ trait WikiControllerBase extends ControllerBase {
"currentPageName" -> trim(label("Current page name" , text(required)))
)(WikiPageEditForm.apply)
get("/:owner/:repository/wiki")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
getWikiPage(owner, repository, "Home").map { page =>
wiki.html.page("Home", page, repositoryInfo, hasWritePermission(owner, repository, context.loginAccount))
} getOrElse redirect("/%s/%s/wiki/Home/_edit".format(owner, repository))
} getOrElse NotFound
get("/:owner/:repository/wiki")(referrersOnly { repository =>
getWikiPage(repository.owner, repository.name, "Home").map { page =>
wiki.html.page("Home", page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
} getOrElse redirect("/%s/%s/wiki/Home/_edit".format(repository.owner, repository.name))
})
get("/:owner/:repository/wiki/:page")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val pageName = params("page")
get("/:owner/:repository/wiki/:page")(referrersOnly { repository =>
val pageName = params("page")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
getWikiPage(owner, repository, pageName).map { page =>
wiki.html.page(pageName, page, repositoryInfo, hasWritePermission(owner, repository, context.loginAccount))
} getOrElse redirect("/%s/%s/wiki/%s/_edit".format(owner, repository, pageName)) // TODO URLEncode
} getOrElse NotFound
getWikiPage(repository.owner, repository.name, pageName).map { page =>
wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
} getOrElse redirect("/%s/%s/wiki/%s/_edit".format(repository.owner, repository.name, pageName)) // TODO URLEncode
})
get("/:owner/:repository/wiki/:page/_history")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val page = params("page")
get("/:owner/:repository/wiki/:page/_history")(referrersOnly { repository =>
val pageName = params("page")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.history(Some(page), JGitUtil.getCommitLog(git, "master", path = page + ".md")._1, repositoryInfo)
}
} getOrElse NotFound
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
wiki.html.history(Some(pageName), JGitUtil.getCommitLog(git, "master", path = pageName + ".md")._1, repository)
}
})
get("/:owner/:repository/wiki/:page/_compare/:commitId")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val page = params("page")
get("/:owner/:repository/wiki/:page/_compare/:commitId")(referrersOnly { repository =>
val pageName = params("page")
val commitId = params("commitId").split("\\.\\.\\.")
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
wiki.html.compare(Some(pageName), getWikiDiffs(git, commitId(0), commitId(1)), repository)
}
})
get("/:owner/:repository/wiki/_compare/:commitId")(referrersOnly { repository =>
val commitId = params("commitId").split("\\.\\.\\.")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.compare(Some(page), getWikiDiffs(git, commitId(0), commitId(1)), repositoryInfo)
}
} getOrElse NotFound
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
wiki.html.compare(None, getWikiDiffs(git, commitId(0), commitId(1)), repository)
}
})
get("/:owner/:repository/wiki/_compare/:commitId")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val commitId = params("commitId").split("\\.\\.\\.")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.compare(None, getWikiDiffs(git, commitId(0), commitId(1)), repositoryInfo)
}
} getOrElse NotFound
get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository =>
val pageName = params("page")
wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository)
})
get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly {
val owner = params("owner")
val repository = params("repository")
val page = params("page")
getRepository(owner, repository, baseUrl).map(
wiki.html.edit(page, getWikiPage(owner, repository, page), _)) getOrElse NotFound
})
post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { form =>
val owner = params("owner")
val repository = params("repository")
saveWikiPage(owner, repository, form.currentPageName, form.pageName,
post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { (form, repository) =>
saveWikiPage(repository.owner, repository.name, form.currentPageName, form.pageName,
form.content, context.loginAccount.get, form.message.getOrElse(""))
updateLastActivityDate(owner, repository)
updateLastActivityDate(repository.owner, repository.name)
redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName))
redirect("%s/%s/wiki/%s".format(repository.owner, repository.name, form.pageName))
})
get("/:owner/:repository/wiki/_new")(collaboratorsOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map(wiki.html.edit("", None, _)) getOrElse NotFound
wiki.html.edit("", None, _)
})
post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { form =>
val owner = params("owner")
val repository = params("repository")
saveWikiPage(owner, repository, form.currentPageName, form.pageName,
post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) =>
saveWikiPage(repository.owner, repository.name, form.currentPageName, form.pageName,
form.content, context.loginAccount.get, form.message.getOrElse(""))
updateLastActivityDate(repository.owner, repository.name)
redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName))
redirect("%s/%s/wiki/%s".format(repository.owner, repository.name, form.pageName))
})
get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly {
val owner = params("owner")
val repository = params("repository")
val page = params("page")
get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly { repository =>
val pageName = params("page")
deleteWikiPage(owner, repository, page, context.loginAccount.get.userName, "Delete %s".format(page))
updateLastActivityDate(owner, repository)
deleteWikiPage(repository.owner, repository.name, pageName, context.loginAccount.get.userName, "Delete %s".format(pageName))
updateLastActivityDate(repository.owner, repository.name)
redirect("%s/%s/wiki".format(owner, repository))
redirect("%s/%s/wiki".format(repository.owner, repository.name))
})
get("/:owner/:repository/wiki/_pages")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map {
wiki.html.pages(getWikiPageList(owner, repository), _, hasWritePermission(owner, repository, context.loginAccount))
} getOrElse NotFound
get("/:owner/:repository/wiki/_pages")(referrersOnly { repository =>
wiki.html.pages(getWikiPageList(repository.owner, repository.name), repository,
hasWritePermission(repository.owner, repository.name, context.loginAccount))
})
get("/:owner/:repository/wiki/_history")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
JGitUtil.withGit(getWikiRepositoryDir(owner, repository)){ git =>
wiki.html.history(None, JGitUtil.getCommitLog(git, "master")._1, repositoryInfo)
}
} getOrElse NotFound
get("/:owner/:repository/wiki/_history")(referrersOnly { repository =>
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
wiki.html.history(None, JGitUtil.getCommitLog(git, "master")._1, repository)
}
})
get("/:owner/:repository/wiki/_blob/*")(referrersOnly {
val owner = params("owner")
val repository = params("repository")
val path = multiParams("splat").head
getFileContent(owner, repository, path).map { content =>
get("/:owner/:repository/wiki/_blob/*")(referrersOnly { repository =>
getFileContent(repository.owner, repository.name, multiParams("splat").head).map { content =>
contentType = "application/octet-stream"
content
} getOrElse NotFound