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

View File

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

View File

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