Change package name

This commit is contained in:
Naoki Takezoe
2015-03-02 16:59:32 +09:00
parent 32006e02c0
commit d495b04d85
190 changed files with 821 additions and 745 deletions

View File

@@ -8,7 +8,7 @@ import sbtassembly._
import sbtassembly.AssemblyKeys._ import sbtassembly.AssemblyKeys._
object MyBuild extends Build { object MyBuild extends Build {
val Organization = "jp.sf.amateras" val Organization = "gitbucket"
val Name = "gitbucket" val Name = "gitbucket"
val Version = "0.0.1" val Version = "0.0.1"
val ScalaVersion = "2.11.2" val ScalaVersion = "2.11.2"
@@ -66,6 +66,7 @@ object MyBuild extends Build {
"com.typesafe" % "config" % "1.2.1", "com.typesafe" % "config" % "1.2.1",
"com.typesafe.play" %% "twirl-compiler" % "1.0.2" "com.typesafe.play" %% "twirl-compiler" % "1.0.2"
), ),
play.twirl.sbt.Import.TwirlKeys.templateImports += "gitbucket.core._",
EclipseKeys.withSource := true, EclipseKeys.withSource := true,
javacOptions in compile ++= Seq("-target", "7", "-source", "7"), javacOptions in compile ++= Seq("-target", "7", "-source", "7"),
testOptions in Test += Tests.Argument(TestFrameworks.Specs2, "junitxml", "console"), testOptions in Test += Tests.Argument(TestFrameworks.Specs2, "junitxml", "console"),

View File

@@ -1,4 +1,4 @@
package util; package gitbucket.core.util;
import org.eclipse.jgit.api.errors.PatchApplyException; import org.eclipse.jgit.api.errors.PatchApplyException;
import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.diff.RawText;

View File

@@ -1,6 +1,8 @@
import _root_.servlet.{BasicAuthenticationFilter, TransactionFilter}
import app._ import gitbucket.core.controller._
import plugin.PluginRegistry import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.servlet.{TransactionFilter, BasicAuthenticationFilter}
import gitbucket.core.util.Directory
//import jp.sf.amateras.scalatra.forms.ValidationJavaScriptProvider //import jp.sf.amateras.scalatra.forms.ValidationJavaScriptProvider
import org.scalatra._ import org.scalatra._
@@ -38,7 +40,7 @@ class ScalatraBootstrap extends LifeCycle {
context.mount(new RepositorySettingsController, "/*") context.mount(new RepositorySettingsController, "/*")
// Create GITBUCKET_HOME directory if it does not exist // Create GITBUCKET_HOME directory if it does not exist
val dir = new java.io.File(_root_.util.Directory.GitBucketHome) val dir = new java.io.File(Directory.GitBucketHome)
if(!dir.exists){ if(!dir.exists){
dir.mkdirs() dir.mkdirs()
} }

View File

@@ -1,19 +1,22 @@
package app package gitbucket.core.controller
import service._ import gitbucket.core.account.html
import util._ import gitbucket.core.helper
import util.StringUtil._ import gitbucket.core.model.GroupMember
import util.Directory._ import gitbucket.core.util._
import util.ControlUtil._ import gitbucket.core.util.Implicits._
import util.Implicits._ import gitbucket.core.util.Directory._
import ssh.SshUtil import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.StringUtil._
import gitbucket.core.ssh.SshUtil
import gitbucket.core.service._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.{FileMode, Constants} import org.eclipse.jgit.lib.{FileMode, Constants}
import org.eclipse.jgit.dircache.DirCache import org.eclipse.jgit.dircache.DirCache
import model.GroupMember
class AccountController extends AccountControllerBase class AccountController extends AccountControllerBase
with AccountService with RepositoryService with ActivityService with WikiService with LabelsService with SshKeyService with AccountService with RepositoryService with ActivityService with WikiService with LabelsService with SshKeyService
@@ -103,21 +106,21 @@ trait AccountControllerBase extends AccountManagementControllerBase {
params.getOrElse("tab", "repositories") match { params.getOrElse("tab", "repositories") match {
// Public Activity // Public Activity
case "activity" => case "activity" =>
_root_.account.html.activity(account, gitbucket.core.account.html.activity(account,
if(account.isGroupAccount) Nil else getGroupsByUserName(userName), if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
getActivitiesByUser(userName, true)) getActivitiesByUser(userName, true))
// Members // Members
case "members" if(account.isGroupAccount) => { case "members" if(account.isGroupAccount) => {
val members = getGroupMembers(account.userName) val members = getGroupMembers(account.userName)
_root_.account.html.members(account, members.map(_.userName), gitbucket.core.account.html.members(account, members.map(_.userName),
context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })) context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }))
} }
// Repositories // Repositories
case _ => { case _ => {
val members = getGroupMembers(account.userName) val members = getGroupMembers(account.userName)
_root_.account.html.repositories(account, gitbucket.core.account.html.repositories(account,
if(account.isGroupAccount) Nil else getGroupsByUserName(userName), if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
getVisibleRepositories(context.loginAccount, context.baseUrl, Some(userName)), getVisibleRepositories(context.loginAccount, context.baseUrl, Some(userName)),
context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })) context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }))
@@ -145,7 +148,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
get("/:userName/_edit")(oneselfOnly { get("/:userName/_edit")(oneselfOnly {
val userName = params("userName") val userName = params("userName")
getAccountByUserName(userName).map { x => getAccountByUserName(userName).map { x =>
account.html.edit(x, flash.get("info")) html.edit(x, flash.get("info"))
} getOrElse NotFound } getOrElse NotFound
}) })
@@ -189,7 +192,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
get("/:userName/_ssh")(oneselfOnly { get("/:userName/_ssh")(oneselfOnly {
val userName = params("userName") val userName = params("userName")
getAccountByUserName(userName).map { x => getAccountByUserName(userName).map { x =>
account.html.ssh(x, getPublicKeys(x.userName)) html.ssh(x, getPublicKeys(x.userName))
} getOrElse NotFound } getOrElse NotFound
}) })
@@ -211,7 +214,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
if(context.loginAccount.isDefined){ if(context.loginAccount.isDefined){
redirect("/") redirect("/")
} else { } else {
account.html.register() html.register()
} }
} else NotFound } else NotFound
} }
@@ -225,7 +228,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
} }
get("/groups/new")(usersOnly { get("/groups/new")(usersOnly {
account.html.group(None, List(GroupMember("", context.loginAccount.get.userName, true))) html.group(None, List(GroupMember("", context.loginAccount.get.userName, true)))
}) })
post("/groups/new", newGroupForm)(usersOnly { form => post("/groups/new", newGroupForm)(usersOnly { form =>
@@ -241,7 +244,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
get("/:groupName/_editgroup")(managersOnly { get("/:groupName/_editgroup")(managersOnly {
defining(params("groupName")){ groupName => defining(params("groupName")){ groupName =>
account.html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName))
} }
}) })
@@ -290,7 +293,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
* Show the new repository form. * Show the new repository form.
*/ */
get("/new")(usersOnly { get("/new")(usersOnly {
account.html.newrepo(getGroupsByUserName(context.loginAccount.get.userName), context.settings.isCreateRepoOptionPublic) html.newrepo(getGroupsByUserName(context.loginAccount.get.userName), context.settings.isCreateRepoOptionPublic)
}) })
/** /**
@@ -366,7 +369,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
val members = getGroupMembers(group) val members = getGroupMembers(group)
context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }) context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })
} }
_root_.helper.html.forkrepository( helper.html.forkrepository(
repository, repository,
(groups zip managerPermissions).toMap (groups zip managerPermissions).toMap
) )

View File

@@ -1,4 +1,4 @@
package app package gitbucket.core.controller
class AnonymousAccessController extends AnonymousAccessControllerBase class AnonymousAccessController extends AnonymousAccessControllerBase

View File

@@ -1,16 +1,16 @@
package app package gitbucket.core.controller
import _root_.util.Directory._ import gitbucket.core.service.{AccountService, SystemSettingsService}
import _root_.util.Implicits._ import gitbucket.core.util._
import _root_.util.ControlUtil._ import gitbucket.core.util.Implicits._
import _root_.util.{StringUtil, FileUtil, Validations, Keys} import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Directory._
import gitbucket.core.model.Account
import org.scalatra._ import org.scalatra._
import org.scalatra.json._ import org.scalatra.json._
import org.json4s._ import org.json4s._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import model._
import service.{SystemSettingsService, AccountService}
import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
import javax.servlet.{FilterChain, ServletResponse, ServletRequest} import javax.servlet.{FilterChain, ServletResponse, ServletRequest}
import org.scalatra.i18n._ import org.scalatra.i18n._
@@ -104,10 +104,10 @@ abstract class ControllerBase extends ScalatraFilter
if(request.hasAttribute(Keys.Request.Ajax)){ if(request.hasAttribute(Keys.Request.Ajax)){
org.scalatra.NotFound() org.scalatra.NotFound()
} else { } else {
org.scalatra.NotFound(html.error("Not Found")) org.scalatra.NotFound(gitbucket.core.html.error("Not Found"))
} }
protected def Unauthorized()(implicit context: app.Context) = protected def Unauthorized()(implicit context: Context) =
if(request.hasAttribute(Keys.Request.Ajax)){ if(request.hasAttribute(Keys.Request.Ajax)){
org.scalatra.Unauthorized() org.scalatra.Unauthorized()
} else { } else {

View File

@@ -1,9 +1,10 @@
package app package gitbucket.core.controller
import service._ import gitbucket.core.dashboard.html
import util.{StringUtil, UsersAuthenticator, Keys} import gitbucket.core.service.{RepositoryService, PullRequestService, AccountService, IssuesService}
import util.Implicits._ import gitbucket.core.util.{StringUtil, Keys, UsersAuthenticator}
import service.IssuesService.IssueSearchCondition import gitbucket.core.util.Implicits._
import gitbucket.core.service.IssuesService._
class DashboardController extends DashboardControllerBase class DashboardController extends DashboardControllerBase
with IssuesService with PullRequestService with RepositoryService with AccountService with IssuesService with PullRequestService with RepositoryService with AccountService
@@ -96,7 +97,7 @@ trait DashboardControllerBase extends ControllerBase {
val userRepos = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name) val userRepos = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name)
val page = IssueSearchCondition.page(request) val page = IssueSearchCondition.page(request)
dashboard.html.issues( html.issues(
searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*), searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*),
page, page,
countIssue(condition.copy(state = "open" ), false, userRepos: _*), countIssue(condition.copy(state = "open" ), false, userRepos: _*),
@@ -119,7 +120,7 @@ trait DashboardControllerBase extends ControllerBase {
val allRepos = getAllRepositories(userName) val allRepos = getAllRepositories(userName)
val page = IssueSearchCondition.page(request) val page = IssueSearchCondition.page(request)
dashboard.html.pulls( html.pulls(
searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, allRepos: _*), searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, allRepos: _*),
page, page,
countIssue(condition.copy(state = "open" ), true, allRepos: _*), countIssue(condition.copy(state = "open" ), true, allRepos: _*),

View File

@@ -1,8 +1,8 @@
package app package gitbucket.core.controller
import util.{Keys, FileUtil} import gitbucket.core.util.{Keys, FileUtil}
import util.ControlUtil._ import gitbucket.core.util.ControlUtil._
import util.Directory._ import gitbucket.core.util.Directory._
import org.scalatra._ import org.scalatra._
import org.scalatra.servlet.{MultipartConfig, FileUploadSupport, FileItem} import org.scalatra.servlet.{MultipartConfig, FileUploadSupport, FileItem}
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils

View File

@@ -1,8 +1,11 @@
package app package gitbucket.core.controller
import util._ import gitbucket.core.html
import util.Implicits._ import gitbucket.core.helper.xml
import service._ import gitbucket.core.model.Account
import gitbucket.core.service.{RepositoryService, ActivityService, AccountService}
import gitbucket.core.util.{LDAPUtil, Keys, UsersAuthenticator}
import gitbucket.core.util.Implicits._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
class IndexController extends IndexControllerBase class IndexController extends IndexControllerBase
@@ -61,13 +64,13 @@ trait IndexControllerBase extends ControllerBase {
get("/activities.atom"){ get("/activities.atom"){
contentType = "application/atom+xml; type=feed" contentType = "application/atom+xml; type=feed"
helper.xml.feed(getRecentActivities()) xml.feed(getRecentActivities())
} }
/** /**
* Set account information into HttpSession and redirect. * Set account information into HttpSession and redirect.
*/ */
private def signin(account: model.Account) = { private def signin(account: Account) = {
session.setAttribute(Keys.Session.LoginAccount, account) session.setAttribute(Keys.Session.LoginAccount, account)
updateLastLoginDate(account.userName) updateLastLoginDate(account.userName)

View File

@@ -1,14 +1,17 @@
package app package gitbucket.core.controller
import gitbucket.core.issues.html
import gitbucket.core.model.Issue
import gitbucket.core.service._
import gitbucket.core.util._
import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Implicits._
import gitbucket.core.view
import gitbucket.core.view.Markdown
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import service._
import IssuesService._ import IssuesService._
import util._
import util.Implicits._
import util.ControlUtil._
import org.scalatra.Ok import org.scalatra.Ok
import model.Issue
class IssuesController extends IssuesControllerBase class IssuesController extends IssuesControllerBase
with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService
@@ -60,7 +63,7 @@ trait IssuesControllerBase extends ControllerBase {
get("/:owner/:repository/issues/:id")(referrersOnly { repository => get("/:owner/:repository/issues/:id")(referrersOnly { repository =>
defining(repository.owner, repository.name, params("id")){ case (owner, name, issueId) => defining(repository.owner, repository.name, params("id")){ case (owner, name, issueId) =>
getIssue(owner, name, issueId) map { getIssue(owner, name, issueId) map {
issues.html.issue( html.issue(
_, _,
getComments(owner, name, issueId.toInt), getComments(owner, name, issueId.toInt),
getIssueLabels(owner, name, issueId.toInt), getIssueLabels(owner, name, issueId.toInt),
@@ -75,7 +78,7 @@ trait IssuesControllerBase extends ControllerBase {
get("/:owner/:repository/issues/new")(readableUsersOnly { repository => get("/:owner/:repository/issues/new")(readableUsersOnly { repository =>
defining(repository.owner, repository.name){ case (owner, name) => defining(repository.owner, repository.name){ case (owner, name) =>
issues.html.create( html.create(
(getCollaborators(owner, name) ::: (if(getAccountByUserName(owner).get.isGroupAccount) Nil else List(owner))).sorted, (getCollaborators(owner, name) ::: (if(getAccountByUserName(owner).get.isGroupAccount) Nil else List(owner))).sorted,
getMilestones(owner, name), getMilestones(owner, name),
getLabels(owner, name), getLabels(owner, name),
@@ -192,13 +195,13 @@ trait IssuesControllerBase extends ControllerBase {
getIssue(repository.owner, repository.name, params("id")) map { x => getIssue(repository.owner, repository.name, params("id")) map { x =>
if(isEditable(x.userName, x.repositoryName, x.openedUserName)){ if(isEditable(x.userName, x.repositoryName, x.openedUserName)){
params.get("dataType") collect { params.get("dataType") collect {
case t if t == "html" => issues.html.editissue( case t if t == "html" => html.editissue(
x.content, x.issueId, x.userName, x.repositoryName) x.content, x.issueId, x.userName, x.repositoryName)
} getOrElse { } getOrElse {
contentType = formats("json") contentType = formats("json")
org.json4s.jackson.Serialization.write( org.json4s.jackson.Serialization.write(
Map("title" -> x.title, Map("title" -> x.title,
"content" -> view.Markdown.toHtml(x.content getOrElse "No description given.", "content" -> Markdown.toHtml(x.content getOrElse "No description given.",
repository, false, true, true, isEditable(x.userName, x.repositoryName, x.openedUserName)) repository, false, true, true, isEditable(x.userName, x.repositoryName, x.openedUserName))
)) ))
} }
@@ -210,7 +213,7 @@ trait IssuesControllerBase extends ControllerBase {
getComment(repository.owner, repository.name, params("id")) map { x => getComment(repository.owner, repository.name, params("id")) map { x =>
if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){ if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){
params.get("dataType") collect { params.get("dataType") collect {
case t if t == "html" => issues.html.editcomment( case t if t == "html" => html.editcomment(
x.content, x.commentId, x.userName, x.repositoryName) x.content, x.commentId, x.userName, x.repositoryName)
} getOrElse { } getOrElse {
contentType = formats("json") contentType = formats("json")
@@ -226,14 +229,14 @@ trait IssuesControllerBase extends ControllerBase {
ajaxPost("/:owner/:repository/issues/:id/label/new")(collaboratorsOnly { repository => ajaxPost("/:owner/:repository/issues/:id/label/new")(collaboratorsOnly { repository =>
defining(params("id").toInt){ issueId => defining(params("id").toInt){ issueId =>
registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt)
issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
} }
}) })
ajaxPost("/:owner/:repository/issues/:id/label/delete")(collaboratorsOnly { repository => ajaxPost("/:owner/:repository/issues/:id/label/delete")(collaboratorsOnly { repository =>
defining(params("id").toInt){ issueId => defining(params("id").toInt){ issueId =>
deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt)
issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
} }
}) })
@@ -247,7 +250,7 @@ trait IssuesControllerBase extends ControllerBase {
milestoneId("milestoneId").map { milestoneId => milestoneId("milestoneId").map { milestoneId =>
getMilestonesWithIssueCount(repository.owner, repository.name) getMilestonesWithIssueCount(repository.owner, repository.name)
.find(_._1.milestoneId == milestoneId).map { case (_, openCount, closeCount) => .find(_._1.milestoneId == milestoneId).map { case (_, openCount, closeCount) =>
issues.milestones.html.progress(openCount + closeCount, closeCount) gitbucket.core.issues.milestones.html.progress(openCount + closeCount, closeCount)
} getOrElse NotFound } getOrElse NotFound
} getOrElse Ok() } getOrElse Ok()
}) })
@@ -301,7 +304,7 @@ trait IssuesControllerBase extends ControllerBase {
val assignedUserName = (key: String) => params.get(key) filter (_.trim != "") val assignedUserName = (key: String) => params.get(key) filter (_.trim != "")
val milestoneId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt) val milestoneId: String => Option[Int] = (key: String) => params.get(key).flatMap(_.toIntOpt)
private def isEditable(owner: String, repository: String, author: String)(implicit context: app.Context): Boolean = private def isEditable(owner: String, repository: String, author: String)(implicit context: Context): Boolean =
hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName
private def executeBatch(repository: RepositoryService.RepositoryInfo)(execute: Int => Unit) = { private def executeBatch(repository: RepositoryService.RepositoryInfo)(execute: Int => Unit) = {
@@ -325,7 +328,7 @@ trait IssuesControllerBase extends ControllerBase {
* @see [[https://github.com/takezoe/gitbucket/wiki/CommentAction]] * @see [[https://github.com/takezoe/gitbucket/wiki/CommentAction]]
*/ */
private def handleComment(issueId: Int, content: Option[String], repository: RepositoryService.RepositoryInfo) private def handleComment(issueId: Int, content: Option[String], repository: RepositoryService.RepositoryInfo)
(getAction: model.Issue => Option[String] = (getAction: Issue => Option[String] =
p1 => params.get("action").filter(_ => isEditable(p1.userName, p1.repositoryName, p1.openedUserName))) = { p1 => params.get("action").filter(_ => isEditable(p1.userName, p1.repositoryName, p1.openedUserName))) = {
defining(repository.owner, repository.name){ case (owner, name) => defining(repository.owner, repository.name){ case (owner, name) =>
@@ -402,7 +405,7 @@ trait IssuesControllerBase extends ControllerBase {
} else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) } else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition())
) )
issues.html.list( html.list(
"issues", "issues",
searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName),
page, page,

View File

@@ -1,9 +1,10 @@
package app package gitbucket.core.controller
import gitbucket.core.issues.labels.html
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, LabelsService}
import gitbucket.core.util.{ReferrerAuthenticator, CollaboratorsAuthenticator}
import gitbucket.core.util.Implicits._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import service._
import util.{ReferrerAuthenticator, CollaboratorsAuthenticator}
import util.Implicits._
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages
import org.scalatra.Ok import org.scalatra.Ok
@@ -23,7 +24,7 @@ trait LabelsControllerBase extends ControllerBase {
)(LabelForm.apply) )(LabelForm.apply)
get("/:owner/:repository/issues/labels")(referrersOnly { repository => get("/:owner/:repository/issues/labels")(referrersOnly { repository =>
issues.labels.html.list( html.list(
getLabels(repository.owner, repository.name), getLabels(repository.owner, repository.name),
countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty), countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty),
repository, repository,
@@ -31,12 +32,12 @@ trait LabelsControllerBase extends ControllerBase {
}) })
ajaxGet("/:owner/:repository/issues/labels/new")(collaboratorsOnly { repository => ajaxGet("/:owner/:repository/issues/labels/new")(collaboratorsOnly { repository =>
issues.labels.html.edit(None, repository) html.edit(None, repository)
}) })
ajaxPost("/:owner/:repository/issues/labels/new", labelForm)(collaboratorsOnly { (form, repository) => ajaxPost("/:owner/:repository/issues/labels/new", labelForm)(collaboratorsOnly { (form, repository) =>
val labelId = createLabel(repository.owner, repository.name, form.labelName, form.color.substring(1)) val labelId = createLabel(repository.owner, repository.name, form.labelName, form.color.substring(1))
issues.labels.html.label( html.label(
getLabel(repository.owner, repository.name, labelId).get, getLabel(repository.owner, repository.name, labelId).get,
// TODO futility // TODO futility
countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty), countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty),
@@ -46,13 +47,13 @@ trait LabelsControllerBase extends ControllerBase {
ajaxGet("/:owner/:repository/issues/labels/:labelId/edit")(collaboratorsOnly { repository => ajaxGet("/:owner/:repository/issues/labels/:labelId/edit")(collaboratorsOnly { repository =>
getLabel(repository.owner, repository.name, params("labelId").toInt).map { label => getLabel(repository.owner, repository.name, params("labelId").toInt).map { label =>
issues.labels.html.edit(Some(label), repository) html.edit(Some(label), repository)
} getOrElse NotFound() } getOrElse NotFound()
}) })
ajaxPost("/:owner/:repository/issues/labels/:labelId/edit", labelForm)(collaboratorsOnly { (form, repository) => ajaxPost("/:owner/:repository/issues/labels/:labelId/edit", labelForm)(collaboratorsOnly { (form, repository) =>
updateLabel(repository.owner, repository.name, params("labelId").toInt, form.labelName, form.color.substring(1)) updateLabel(repository.owner, repository.name, params("labelId").toInt, form.labelName, form.color.substring(1))
issues.labels.html.label( html.label(
getLabel(repository.owner, repository.name, params("labelId").toInt).get, getLabel(repository.owner, repository.name, params("labelId").toInt).get,
// TODO futility // TODO futility
countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty), countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty),

View File

@@ -1,11 +1,11 @@
package app package gitbucket.core.controller
import gitbucket.core.issues.milestones.html
import gitbucket.core.service.{RepositoryService, MilestonesService, AccountService}
import gitbucket.core.util.{ReferrerAuthenticator, CollaboratorsAuthenticator}
import gitbucket.core.util.Implicits._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import service._
import util.{CollaboratorsAuthenticator, ReferrerAuthenticator}
import util.Implicits._
class MilestonesController extends MilestonesControllerBase class MilestonesController extends MilestonesControllerBase
with MilestonesService with RepositoryService with AccountService with MilestonesService with RepositoryService with AccountService
with ReferrerAuthenticator with CollaboratorsAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator
@@ -23,7 +23,7 @@ trait MilestonesControllerBase extends ControllerBase {
)(MilestoneForm.apply) )(MilestoneForm.apply)
get("/:owner/:repository/issues/milestones")(referrersOnly { repository => get("/:owner/:repository/issues/milestones")(referrersOnly { repository =>
issues.milestones.html.list( html.list(
params.getOrElse("state", "open"), params.getOrElse("state", "open"),
getMilestonesWithIssueCount(repository.owner, repository.name), getMilestonesWithIssueCount(repository.owner, repository.name),
repository, repository,
@@ -31,7 +31,7 @@ trait MilestonesControllerBase extends ControllerBase {
}) })
get("/:owner/:repository/issues/milestones/new")(collaboratorsOnly { get("/:owner/:repository/issues/milestones/new")(collaboratorsOnly {
issues.milestones.html.edit(None, _) html.edit(None, _)
}) })
post("/:owner/:repository/issues/milestones/new", milestoneForm)(collaboratorsOnly { (form, repository) => post("/:owner/:repository/issues/milestones/new", milestoneForm)(collaboratorsOnly { (form, repository) =>
@@ -41,7 +41,7 @@ trait MilestonesControllerBase extends ControllerBase {
get("/:owner/:repository/issues/milestones/:milestoneId/edit")(collaboratorsOnly { repository => get("/:owner/:repository/issues/milestones/:milestoneId/edit")(collaboratorsOnly { repository =>
params("milestoneId").toIntOpt.map{ milestoneId => params("milestoneId").toIntOpt.map{ milestoneId =>
issues.milestones.html.edit(getMilestone(repository.owner, repository.name, milestoneId), repository) html.edit(getMilestone(repository.owner, repository.name, milestoneId), repository)
} getOrElse NotFound } getOrElse NotFound
}) })

View File

@@ -1,23 +1,25 @@
package app package gitbucket.core.controller
import util._ import gitbucket.core.pulls.html
import util.Directory._ import gitbucket.core.util._
import util.Implicits._ import gitbucket.core.util.JGitUtil._
import util.ControlUtil._ import gitbucket.core.util.ControlUtil._
import service._ import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory._
import gitbucket.core.view
import gitbucket.core.view.helpers
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.eclipse.jgit.transport.RefSpec import org.eclipse.jgit.transport.RefSpec
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent} import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent}
import service.IssuesService._ import gitbucket.core.service._
import service.PullRequestService._ import gitbucket.core.service.IssuesService._
import gitbucket.core.service.PullRequestService._
import gitbucket.core.service.WebHookService.WebHookPayload
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.eclipse.jgit.merge.MergeStrategy import org.eclipse.jgit.merge.MergeStrategy
import org.eclipse.jgit.errors.NoMergeBaseException import org.eclipse.jgit.errors.NoMergeBaseException
import service.WebHookService.WebHookPayload
import util.JGitUtil.DiffInfo
import util.JGitUtil.CommitInfo
class PullRequestsController extends PullRequestsControllerBase class PullRequestsController extends PullRequestsControllerBase
@@ -77,7 +79,7 @@ trait PullRequestsControllerBase extends ControllerBase {
val (commits, diffs) = val (commits, diffs) =
getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo) getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo)
pulls.html.pullreq( html.pullreq(
issue, pullreq, issue, pullreq,
(commits.flatten.map(commit => getCommitComments(owner, name, commit.id, true)).flatten.toList ::: getComments(owner, name, issueId)) (commits.flatten.map(commit => getCommitComments(owner, name, commit.id, true)).flatten.toList ::: getComments(owner, name, issueId))
.sortWith((a, b) => a.registeredDate before b.registeredDate), .sortWith((a, b) => a.registeredDate before b.registeredDate),
@@ -99,7 +101,7 @@ trait PullRequestsControllerBase extends ControllerBase {
val owner = repository.owner val owner = repository.owner
val name = repository.name val name = repository.name
getPullRequest(owner, name, issueId) map { case(issue, pullreq) => getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
pulls.html.mergeguide( html.mergeguide(
checkConflictInPullRequest(owner, name, pullreq.branch, pullreq.requestUserName, name, pullreq.requestBranch, issueId), checkConflictInPullRequest(owner, name, pullreq.branch, pullreq.requestUserName, name, pullreq.requestBranch, issueId),
pullreq, pullreq,
s"${context.baseUrl}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git") s"${context.baseUrl}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git")
@@ -276,7 +278,7 @@ trait PullRequestsControllerBase extends ControllerBase {
originRepository.owner, originRepository.name, oldId.getName, originRepository.owner, originRepository.name, oldId.getName,
forkedRepository.owner, forkedRepository.name, newId.getName) forkedRepository.owner, forkedRepository.name, newId.getName)
pulls.html.compare( html.compare(
commits, commits,
diffs, diffs,
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { (forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
@@ -318,7 +320,7 @@ trait PullRequestsControllerBase extends ControllerBase {
val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2 val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2
val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2 val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2
pulls.html.mergecheck( html.mergecheck(
checkConflict(originRepository.owner, originRepository.name, originBranch, checkConflict(originRepository.owner, originRepository.name, originBranch,
forkedRepository.owner, forkedRepository.name, forkedBranch)) forkedRepository.owner, forkedRepository.name, forkedBranch))
} }
@@ -450,7 +452,7 @@ trait PullRequestsControllerBase extends ControllerBase {
val commits = newGit.log.addRange(oldId, newId).call.iterator.asScala.map { revCommit => val commits = newGit.log.addRange(oldId, newId).call.iterator.asScala.map { revCommit =>
new CommitInfo(revCommit) new CommitInfo(revCommit)
}.toList.splitWith { (commit1, commit2) => }.toList.splitWith { (commit1, commit2) =>
view.helpers.date(commit1.commitTime) == view.helpers.date(commit2.commitTime) helpers.date(commit1.commitTime) == view.helpers.date(commit2.commitTime)
} }
val diffs = JGitUtil.getDiffs(newGit, oldId.getName, newId.getName, true) val diffs = JGitUtil.getDiffs(newGit, oldId.getName, newId.getName, true)
@@ -469,7 +471,7 @@ trait PullRequestsControllerBase extends ControllerBase {
else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition())
) )
issues.html.list( gitbucket.core.issues.html.list(
"pulls", "pulls",
searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName),
page, page,

View File

@@ -1,15 +1,17 @@
package app package gitbucket.core.controller
import service._ import gitbucket.core.settings.html
import util.Directory._ import gitbucket.core.model.WebHook
import util.Implicits._ import gitbucket.core.service.{RepositoryService, AccountService, WebHookService}
import util.{LockUtil, UsersAuthenticator, OwnerAuthenticator} import gitbucket.core.service.WebHookService.WebHookPayload
import gitbucket.core.util._
import gitbucket.core.util.JGitUtil._
import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages
import service.WebHookService.WebHookPayload
import util.JGitUtil.CommitInfo
import util.ControlUtil._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.Constants
@@ -63,7 +65,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
* Display the Options page. * Display the Options page.
*/ */
get("/:owner/:repository/settings/options")(ownerOnly { get("/:owner/:repository/settings/options")(ownerOnly {
settings.html.options(_, flash.get("info")) html.options(_, flash.get("info"))
}) })
/** /**
@@ -105,7 +107,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
* Display the Collaborators page. * Display the Collaborators page.
*/ */
get("/:owner/:repository/settings/collaborators")(ownerOnly { repository => get("/:owner/:repository/settings/collaborators")(ownerOnly { repository =>
settings.html.collaborators( html.collaborators(
getCollaborators(repository.owner, repository.name), getCollaborators(repository.owner, repository.name),
getAccountByUserName(repository.owner).get.isGroupAccount, getAccountByUserName(repository.owner).get.isGroupAccount,
repository) repository)
@@ -135,7 +137,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
* Display the web hook page. * Display the web hook page.
*/ */
get("/:owner/:repository/settings/hooks")(ownerOnly { repository => get("/:owner/:repository/settings/hooks")(ownerOnly { repository =>
settings.html.hooks(getWebHookURLs(repository.owner, repository.name), flash.get("url"), repository, flash.get("info")) html.hooks(getWebHookURLs(repository.owner, repository.name), flash.get("url"), repository, flash.get("info"))
}) })
/** /**
@@ -167,7 +169,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
getAccountByUserName(repository.owner).foreach { ownerAccount => getAccountByUserName(repository.owner).foreach { ownerAccount =>
callWebHook(repository.owner, repository.name, callWebHook(repository.owner, repository.name,
List(model.WebHook(repository.owner, repository.name, form.url)), List(WebHook(repository.owner, repository.name, form.url)),
WebHookPayload(git, ownerAccount, "refs/heads/" + repository.repository.defaultBranch, repository, commits.toList, ownerAccount) WebHookPayload(git, ownerAccount, "refs/heads/" + repository.repository.defaultBranch, repository, commits.toList, ownerAccount)
) )
} }
@@ -181,7 +183,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
* Display the danger zone. * Display the danger zone.
*/ */
get("/:owner/:repository/settings/danger")(ownerOnly { get("/:owner/:repository/settings/danger")(ownerOnly {
settings.html.danger(_) html.danger(_)
}) })
/** /**

View File

@@ -1,13 +1,18 @@
package app package gitbucket.core.controller
import _root_.util.JGitUtil.CommitInfo import gitbucket.core.repo.html
import util.Directory._ import gitbucket.core.helper
import util.Implicits._ import gitbucket.core.service._
import _root_.util.ControlUtil._ import gitbucket.core.util._
import _root_.util._ import gitbucket.core.util.JGitUtil._
import service._ import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory._
import gitbucket.core.model.Account
import gitbucket.core.service.WebHookService.WebHookPayload
import gitbucket.core.view
import gitbucket.core.view.helpers
import org.scalatra._ import org.scalatra._
import java.io.File
import org.eclipse.jgit.api.{ArchiveCommand, Git} import org.eclipse.jgit.api.{ArchiveCommand, Git}
import org.eclipse.jgit.archive.{TgzFormat, ZipFormat} import org.eclipse.jgit.archive.{TgzFormat, ZipFormat}
@@ -17,7 +22,6 @@ import org.eclipse.jgit.treewalk._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.eclipse.jgit.dircache.DirCache import org.eclipse.jgit.dircache.DirCache
import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevCommit
import service.WebHookService.WebHookPayload
class RepositoryViewerController extends RepositoryViewerControllerBase class RepositoryViewerController extends RepositoryViewerControllerBase
with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService
@@ -91,7 +95,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
*/ */
post("/:owner/:repository/_preview")(referrersOnly { repository => post("/:owner/:repository/_preview")(referrersOnly { repository =>
contentType = "text/html" contentType = "text/html"
view.helpers.markdown(params("content"), repository, helpers.markdown(params("content"), repository,
params("enableWikiLink").toBoolean, params("enableWikiLink").toBoolean,
params("enableRefsLink").toBoolean, params("enableRefsLink").toBoolean,
params("enableTaskList").toBoolean, params("enableTaskList").toBoolean,
@@ -127,7 +131,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
JGitUtil.getCommitLog(git, branchName, page, 30, path) match { JGitUtil.getCommitLog(git, branchName, page, 30, path) match {
case Right((logs, hasNext)) => case Right((logs, hasNext)) =>
repo.html.commits(if(path.isEmpty) Nil else path.split("/").toList, branchName, repository, html.commits(if(path.isEmpty) Nil else path.split("/").toList, branchName, repository,
logs.splitWith{ (commit1, commit2) => logs.splitWith{ (commit1, commit2) =>
view.helpers.date(commit1.commitTime) == view.helpers.date(commit2.commitTime) view.helpers.date(commit1.commitTime) == view.helpers.date(commit2.commitTime)
}, page, hasNext, hasWritePermission(repository.owner, repository.name, context.loginAccount)) }, page, hasNext, hasWritePermission(repository.owner, repository.name, context.loginAccount))
@@ -138,7 +142,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
get("/:owner/:repository/new/*")(collaboratorsOnly { repository => get("/:owner/:repository/new/*")(collaboratorsOnly { repository =>
val (branch, path) = splitPath(repository, multiParams("splat").head) val (branch, path) = splitPath(repository, multiParams("splat").head)
repo.html.editor(branch, repository, if(path.length == 0) Nil else path.split("/").toList, html.editor(branch, repository, if(path.length == 0) Nil else path.split("/").toList,
None, JGitUtil.ContentInfo("text", None, Some("UTF-8"))) None, JGitUtil.ContentInfo("text", None, Some("UTF-8")))
}) })
@@ -150,7 +154,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
getPathObjectId(git, path, revCommit).map { objectId => getPathObjectId(git, path, revCommit).map { objectId =>
val paths = path.split("/") val paths = path.split("/")
repo.html.editor(branch, repository, paths.take(paths.size - 1).toList, Some(paths.last), html.editor(branch, repository, paths.take(paths.size - 1).toList, Some(paths.last),
JGitUtil.getContentInfo(git, path, objectId)) JGitUtil.getContentInfo(git, path, objectId))
} getOrElse NotFound } getOrElse NotFound
} }
@@ -163,7 +167,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
getPathObjectId(git, path, revCommit).map { objectId => getPathObjectId(git, path, revCommit).map { objectId =>
val paths = path.split("/") val paths = path.split("/")
repo.html.delete(branch, repository, paths.take(paths.size - 1).toList, paths.last, html.delete(branch, repository, paths.take(paths.size - 1).toList, paths.last,
JGitUtil.getContentInfo(git, path, objectId)) JGitUtil.getContentInfo(git, path, objectId))
} getOrElse NotFound } getOrElse NotFound
} }
@@ -217,7 +221,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
RawData(FileUtil.getContentType(path, bytes), bytes) RawData(FileUtil.getContentType(path, bytes), bytes)
} }
} else { } else {
repo.html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId), html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId),
new JGitUtil.CommitInfo(lastModifiedCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount)) new JGitUtil.CommitInfo(lastModifiedCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount))
} }
} getOrElse NotFound } getOrElse NotFound
@@ -233,7 +237,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
defining(JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))){ revCommit => defining(JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))){ revCommit =>
JGitUtil.getDiffs(git, id) match { case (diffs, oldCommitId) => JGitUtil.getDiffs(git, id) match { case (diffs, oldCommitId) =>
repo.html.commit(id, new JGitUtil.CommitInfo(revCommit), html.commit(id, new JGitUtil.CommitInfo(revCommit),
JGitUtil.getBranchesOfCommit(git, revCommit.getName), JGitUtil.getBranchesOfCommit(git, revCommit.getName),
JGitUtil.getTagsOfCommit(git, revCommit.getName), JGitUtil.getTagsOfCommit(git, revCommit.getName),
getCommitComments(repository.owner, repository.name, id, false), getCommitComments(repository.owner, repository.name, id, false),
@@ -260,7 +264,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
val oldLineNumber = params.get("oldLineNumber") map (_.toInt) val oldLineNumber = params.get("oldLineNumber") map (_.toInt)
val newLineNumber = params.get("newLineNumber") map (_.toInt) val newLineNumber = params.get("newLineNumber") map (_.toInt)
val issueId = params.get("issueId") map (_.toInt) val issueId = params.get("issueId") map (_.toInt)
repo.html.commentform( html.commentform(
commitId = id, commitId = id,
fileName, oldLineNumber, newLineNumber, issueId, fileName, oldLineNumber, newLineNumber, issueId,
hasWritePermission = hasWritePermission(repository.owner, repository.name, context.loginAccount), hasWritePermission = hasWritePermission(repository.owner, repository.name, context.loginAccount),
@@ -284,7 +288,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
getCommitComment(repository.owner, repository.name, params("id")) map { x => getCommitComment(repository.owner, repository.name, params("id")) map { x =>
if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){ if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){
params.get("dataType") collect { params.get("dataType") collect {
case t if t == "html" => repo.html.editcomment( case t if t == "html" => html.editcomment(
x.content, x.commentId, x.userName, x.repositoryName) x.content, x.commentId, x.userName, x.repositoryName)
} getOrElse { } getOrElse {
contentType = formats("json") contentType = formats("json")
@@ -326,7 +330,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
.sortBy(br => (br.mergeInfo.isEmpty, br.commitTime)) .sortBy(br => (br.mergeInfo.isEmpty, br.commitTime))
.map(br => br -> getPullRequestByRequestCommit(repository.owner, repository.name, repository.repository.defaultBranch, br.name, br.commitId)) .map(br => br -> getPullRequestByRequestCommit(repository.owner, repository.name, repository.repository.defaultBranch, br.name, br.commitId))
.reverse .reverse
repo.html.branches(branches, hasWritePermission(repository.owner, repository.name, context.loginAccount), repository) html.branches(branches, hasWritePermission(repository.owner, repository.name, context.loginAccount), repository)
}) })
/** /**
@@ -366,7 +370,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
* Displays tags. * Displays tags.
*/ */
get("/:owner/:repository/tags")(referrersOnly { get("/:owner/:repository/tags")(referrersOnly {
repo.html.tags(_) html.tags(_)
}) })
/** /**
@@ -383,7 +387,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
}) })
get("/:owner/:repository/network/members")(referrersOnly { repository => get("/:owner/:repository/network/members")(referrersOnly { repository =>
repo.html.forked( html.forked(
getRepository( getRepository(
repository.repository.originUserName.getOrElse(repository.owner), repository.repository.originUserName.getOrElse(repository.owner),
repository.repository.originRepositoryName.getOrElse(repository.name), repository.repository.originRepositoryName.getOrElse(repository.name),
@@ -394,7 +398,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
repository) repository)
}) })
private def splitPath(repository: service.RepositoryService.RepositoryInfo, path: String): (String, String) = { private def splitPath(repository: RepositoryService.RepositoryInfo, path: String): (String, String) = {
val id = repository.branchList.collectFirst { val id = repository.branchList.collectFirst {
case branch if(path == branch || path.startsWith(branch + "/")) => branch case branch if(path == branch || path.startsWith(branch + "/")) => branch
} orElse repository.tags.collectFirst { } orElse repository.tags.collectFirst {
@@ -417,7 +421,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
*/ */
private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = { private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = {
if(repository.commitCount == 0){ if(repository.commitCount == 0){
repo.html.guide(repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) html.guide(repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
} else { } else {
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
// get specified commit // get specified commit
@@ -436,11 +440,11 @@ trait RepositoryViewerControllerBase extends ControllerBase {
Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get) Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get)
} }
repo.html.files(revision, repository, html.files(revision, repository,
if(path == ".") Nil else path.split("/").toList, // current path if(path == ".") Nil else path.split("/").toList, // current path
context.loginAccount match { context.loginAccount match {
case None => List() case None => List()
case account: Option[model.Account] => getGroupsByUserName(account.get.userName) case account: Option[Account] => getGroupsByUserName(account.get.userName)
}, // groups of current user }, // groups of current user
new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount), files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount),
@@ -451,7 +455,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
} }
} }
private def commitFile(repository: service.RepositoryService.RepositoryInfo, private def commitFile(repository: RepositoryService.RepositoryInfo,
branch: String, path: String, newFileName: Option[String], oldFileName: Option[String], branch: String, path: String, newFileName: Option[String], oldFileName: Option[String],
content: String, charset: String, message: String) = { content: String, charset: String, message: String) = {
@@ -559,6 +563,6 @@ trait RepositoryViewerControllerBase extends ControllerBase {
} }
} }
private def isEditable(owner: String, repository: String, author: String)(implicit context: app.Context): Boolean = private def isEditable(owner: String, repository: String, author: String)(implicit context: Context): Boolean =
hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName hasWritePermission(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName
} }

View File

@@ -1,9 +1,10 @@
package app package gitbucket.core.controller
import util._ import gitbucket.core.search.html
import gitbucket.core.service._
import gitbucket.core.util.{StringUtil, ControlUtil, ReferrerAuthenticator, Implicits}
import ControlUtil._ import ControlUtil._
import Implicits._ import Implicits._
import service._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
class SearchController extends SearchControllerBase class SearchController extends SearchControllerBase
@@ -34,12 +35,12 @@ trait SearchControllerBase extends ControllerBase { self: RepositoryService
} }
target.toLowerCase match { target.toLowerCase match {
case "issue" => search.html.issues( case "issue" => html.issues(
searchIssues(repository.owner, repository.name, query), searchIssues(repository.owner, repository.name, query),
countFiles(repository.owner, repository.name, query), countFiles(repository.owner, repository.name, query),
query, page, repository) query, page, repository)
case _ => search.html.code( case _ => html.code(
searchFiles(repository.owner, repository.name, query), searchFiles(repository.owner, repository.name, query),
countIssues(repository.owner, repository.name, query), countIssues(repository.owner, repository.name, query),
query, page, repository) query, page, repository)

View File

@@ -1,10 +1,11 @@
package app package gitbucket.core.controller
import service.{AccountService, SystemSettingsService} import gitbucket.core.admin.html
import gitbucket.core.service.{AccountService, SystemSettingsService}
import gitbucket.core.util.AdminAuthenticator
import gitbucket.core.ssh.SshServer
import SystemSettingsService._ import SystemSettingsService._
import util.AdminAuthenticator
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import ssh.SshServer
class SystemSettingsController extends SystemSettingsControllerBase class SystemSettingsController extends SystemSettingsControllerBase
with AccountService with AdminAuthenticator with AccountService with AdminAuthenticator
@@ -59,7 +60,7 @@ trait SystemSettingsControllerBase extends ControllerBase {
case class PluginForm(pluginIds: List[String]) case class PluginForm(pluginIds: List[String])
get("/admin/system")(adminOnly { get("/admin/system")(adminOnly {
admin.html.system(flash.get("info")) html.system(flash.get("info"))
}) })
post("/admin/system", form)(adminOnly { form => post("/admin/system", form)(adminOnly { form =>

View File

@@ -1,11 +1,12 @@
package app package gitbucket.core.controller
import service._ import gitbucket.core.service.{RepositoryService, AccountService}
import util.AdminAuthenticator import gitbucket.core.admin.users.html
import util.StringUtil._ import gitbucket.core.util._
import util.ControlUtil._ import gitbucket.core.util.ControlUtil._
import util.Directory._ import gitbucket.core.util.StringUtil._
import util.Implicits._ import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
@@ -75,11 +76,11 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
account.userName -> getGroupMembers(account.userName).map(_.userName) account.userName -> getGroupMembers(account.userName).map(_.userName)
}.toMap }.toMap
admin.users.html.list(users, members, includeRemoved) html.list(users, members, includeRemoved)
}) })
get("/admin/users/_newuser")(adminOnly { get("/admin/users/_newuser")(adminOnly {
admin.users.html.user(None) html.user(None)
}) })
post("/admin/users/_newuser", newUserForm)(adminOnly { form => post("/admin/users/_newuser", newUserForm)(adminOnly { form =>
@@ -90,7 +91,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
get("/admin/users/:userName/_edituser")(adminOnly { get("/admin/users/:userName/_edituser")(adminOnly {
val userName = params("userName") val userName = params("userName")
admin.users.html.user(getAccountByUserName(userName, true)) html.user(getAccountByUserName(userName, true))
}) })
post("/admin/users/:name/_edituser", editUserForm)(adminOnly { form => post("/admin/users/:name/_edituser", editUserForm)(adminOnly { form =>
@@ -124,7 +125,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
}) })
get("/admin/users/_newgroup")(adminOnly { get("/admin/users/_newgroup")(adminOnly {
admin.users.html.group(None, Nil) html.group(None, Nil)
}) })
post("/admin/users/_newgroup", newGroupForm)(adminOnly { form => post("/admin/users/_newgroup", newGroupForm)(adminOnly { form =>
@@ -140,7 +141,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
get("/admin/users/:groupName/_editgroup")(adminOnly { get("/admin/users/:groupName/_editgroup")(adminOnly {
defining(params("groupName")){ groupName => defining(params("groupName")){ groupName =>
admin.users.html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName))
} }
}) })

View File

@@ -1,14 +1,14 @@
package app package gitbucket.core.controller
import service._ import gitbucket.core.wiki.html
import util._ import gitbucket.core.service.{RepositoryService, WikiService, ActivityService, AccountService}
import util.Directory._ import gitbucket.core.util._
import util.ControlUtil._ import gitbucket.core.util.ControlUtil._
import util.Implicits._ import gitbucket.core.util.Implicits._
import gitbucket.core.util.Directory._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages
import java.util.ResourceBundle
class WikiController extends WikiControllerBase class WikiController extends WikiControllerBase
with WikiService with RepositoryService with AccountService with ActivityService with CollaboratorsAuthenticator with ReferrerAuthenticator with WikiService with RepositoryService with AccountService with ActivityService with CollaboratorsAuthenticator with ReferrerAuthenticator
@@ -36,7 +36,7 @@ trait WikiControllerBase extends ControllerBase {
get("/:owner/:repository/wiki")(referrersOnly { repository => get("/:owner/:repository/wiki")(referrersOnly { repository =>
getWikiPage(repository.owner, repository.name, "Home").map { page => getWikiPage(repository.owner, repository.name, "Home").map { page =>
wiki.html.page("Home", page, getWikiPageList(repository.owner, repository.name), html.page("Home", page, getWikiPageList(repository.owner, repository.name),
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit") } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit")
}) })
@@ -45,7 +45,7 @@ trait WikiControllerBase extends ControllerBase {
val pageName = StringUtil.urlDecode(params("page")) val pageName = StringUtil.urlDecode(params("page"))
getWikiPage(repository.owner, repository.name, pageName).map { page => getWikiPage(repository.owner, repository.name, pageName).map { page =>
wiki.html.page(pageName, page, getWikiPageList(repository.owner, repository.name), html.page(pageName, page, getWikiPageList(repository.owner, repository.name),
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_edit") } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_edit")
}) })
@@ -55,7 +55,7 @@ trait WikiControllerBase extends ControllerBase {
using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git =>
JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match { JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match {
case Right((logs, hasNext)) => wiki.html.history(Some(pageName), logs, repository) case Right((logs, hasNext)) => html.history(Some(pageName), logs, repository)
case Left(_) => NotFound case Left(_) => NotFound
} }
} }
@@ -66,7 +66,7 @@ trait WikiControllerBase extends ControllerBase {
val Array(from, to) = params("commitId").split("\\.\\.\\.") val Array(from, to) = params("commitId").split("\\.\\.\\.")
using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git =>
wiki.html.compare(Some(pageName), from, to, JGitUtil.getDiffs(git, from, to, true).filter(_.newPath == pageName + ".md"), repository, html.compare(Some(pageName), from, to, JGitUtil.getDiffs(git, from, to, true).filter(_.newPath == pageName + ".md"), repository,
hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info")) hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info"))
} }
}) })
@@ -75,7 +75,7 @@ trait WikiControllerBase extends ControllerBase {
val Array(from, to) = params("commitId").split("\\.\\.\\.") val Array(from, to) = params("commitId").split("\\.\\.\\.")
using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git =>
wiki.html.compare(None, from, to, JGitUtil.getDiffs(git, from, to, true), repository, html.compare(None, from, to, JGitUtil.getDiffs(git, from, to, true), repository,
hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info")) hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info"))
} }
}) })
@@ -105,7 +105,7 @@ trait WikiControllerBase extends ControllerBase {
get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository => get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository =>
val pageName = StringUtil.urlDecode(params("page")) val pageName = StringUtil.urlDecode(params("page"))
wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository) html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository)
}) })
post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { (form, repository) => post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { (form, repository) =>
@@ -120,7 +120,7 @@ trait WikiControllerBase extends ControllerBase {
}) })
get("/:owner/:repository/wiki/_new")(collaboratorsOnly { get("/:owner/:repository/wiki/_new")(collaboratorsOnly {
wiki.html.edit("", None, _) html.edit("", None, _)
}) })
post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) => post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) =>
@@ -147,14 +147,14 @@ trait WikiControllerBase extends ControllerBase {
}) })
get("/:owner/:repository/wiki/_pages")(referrersOnly { repository => get("/:owner/:repository/wiki/_pages")(referrersOnly { repository =>
wiki.html.pages(getWikiPageList(repository.owner, repository.name), repository, html.pages(getWikiPageList(repository.owner, repository.name), repository,
hasWritePermission(repository.owner, repository.name, context.loginAccount)) hasWritePermission(repository.owner, repository.name, context.loginAccount))
}) })
get("/:owner/:repository/wiki/_history")(referrersOnly { repository => get("/:owner/:repository/wiki/_history")(referrersOnly { repository =>
using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git =>
JGitUtil.getCommitLog(git, "master") match { JGitUtil.getCommitLog(git, "master") match {
case Right((logs, hasNext)) => wiki.html.history(None, logs, repository) case Right((logs, hasNext)) => html.history(None, logs, repository)
case Left(_) => NotFound case Left(_) => NotFound
} }
} }

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait AccountComponent { self: Profile => trait AccountComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait ActivityComponent extends TemplateComponent { self: Profile => trait ActivityComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
protected[model] trait TemplateComponent { self: Profile => protected[model] trait TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait CollaboratorComponent extends TemplateComponent { self: Profile => trait CollaboratorComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait Comment { trait Comment {
val commentedUserName: String val commentedUserName: String

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait GroupMemberComponent { self: Profile => trait GroupMemberComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait IssueComponent extends TemplateComponent { self: Profile => trait IssueComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait IssueLabelComponent extends TemplateComponent { self: Profile => trait IssueLabelComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait LabelComponent extends TemplateComponent { self: Profile => trait LabelComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait MilestoneComponent extends TemplateComponent { self: Profile => trait MilestoneComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait PluginComponent extends TemplateComponent { self: Profile => trait PluginComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait Profile { trait Profile {
val profile: slick.driver.JdbcProfile val profile: slick.driver.JdbcProfile
@@ -14,9 +14,14 @@ trait Profile {
def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1 def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1
} }
/**
* Returns system date.
*/
def currentDate = new java.util.Date()
} }
trait ProfileBase extends Profile trait CoreProfile extends Profile
with AccountComponent with AccountComponent
with ActivityComponent with ActivityComponent
with CollaboratorComponent with CollaboratorComponent
@@ -34,12 +39,6 @@ trait ProfileBase extends Profile
with PluginComponent { with PluginComponent {
val profile = slick.driver.H2Driver val profile = slick.driver.H2Driver
/**
* Returns system date.
*/
def currentDate = new java.util.Date()
} }
object Profile extends ProfileBase object Profile extends CoreProfile

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait PullRequestComponent extends TemplateComponent { self: Profile => trait PullRequestComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait RepositoryComponent extends TemplateComponent { self: Profile => trait RepositoryComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait SshKeyComponent { self: Profile => trait SshKeyComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,4 +1,4 @@
package model package gitbucket.core.model
trait WebHookComponent extends TemplateComponent { self: Profile => trait WebHookComponent extends TemplateComponent { self: Profile =>
import profile.simple._ import profile.simple._

View File

@@ -1,3 +1,5 @@
package gitbucket.core
package object model { package object model {
type Session = slick.jdbc.JdbcBackend#Session type Session = slick.jdbc.JdbcBackend#Session
} }

View File

@@ -1,4 +1,4 @@
package plugin package gitbucket.core.plugin
/** /**
* Provides a helper method to generate data URI of images registered by plug-in. * Provides a helper method to generate data URI of images registered by plug-in.

View File

@@ -1,8 +1,6 @@
package plugin package gitbucket.core.plugin
import javax.servlet.ServletContext import gitbucket.core.util.Version
import util.Version
/** /**
* Trait for define plugin interface. * Trait for define plugin interface.

View File

@@ -1,21 +1,21 @@
package plugin package gitbucket.core.plugin
import java.io.{InputStream, FilenameFilter, File} import java.io.{File, FilenameFilter, InputStream}
import java.net.URLClassLoader import java.net.URLClassLoader
import javax.servlet.ServletContext import javax.servlet.ServletContext
import javax.servlet.http.{HttpServletRequest, HttpServletResponse} import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import gitbucket.core.controller.{Context, ControllerBase}
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Directory._
import gitbucket.core.util.JDBCUtil._
import gitbucket.core.util.{Version, Versions}
import org.apache.commons.codec.binary.{Base64, StringUtils}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.apache.commons.codec.binary.{StringUtils, Base64}
import service.RepositoryService.RepositoryInfo
import util.Directory._
import util.JDBCUtil._
import util.ControlUtil._
import util.{Version, Versions}
import scala.collection.mutable import scala.collection.mutable
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
import app.{ControllerBase, Context}
class PluginRegistry { class PluginRegistry {

View File

@@ -1,4 +1,4 @@
package plugin package gitbucket.core.plugin
import play.twirl.api.Html import play.twirl.api.Html

View File

@@ -1,6 +1,6 @@
package plugin package gitbucket.core.plugin
import slick.jdbc.JdbcBackend.Session import scala.slick.jdbc.JdbcBackend.Session
/** /**
* Provides Slick Session to Plug-ins. * Provides Slick Session to Plug-ins.

View File

@@ -1,14 +1,14 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.{GroupMember, Account}
import gitbucket.core.model.Profile._
import gitbucket.core.util.{StringUtil, LDAPUtil}
import gitbucket.core.service.SystemSettingsService.SystemSettings
import profile.simple._ import profile.simple._
import model.{Account, GroupMember} import StringUtil._
// TODO [Slick 2.0]NOT import directly?
import model.Profile.dateColumnType
import service.SystemSettingsService.SystemSettings
import util.StringUtil._
import util.LDAPUtil
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
// TODO Why is direct import required?
import gitbucket.core.model.Profile.dateColumnType
trait AccountService { trait AccountService {

View File

@@ -1,8 +1,9 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.Activity
import gitbucket.core.model.Profile._
import gitbucket.core.util.JGitUtil
import profile.simple._ import profile.simple._
import model.Activity
trait ActivityService { trait ActivityService {
@@ -121,7 +122,7 @@ trait ActivityService {
currentDate) currentDate)
def recordPushActivity(userName: String, repositoryName: String, activityUserName: String, def recordPushActivity(userName: String, repositoryName: String, activityUserName: String,
branchName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = branchName: String, commits: List[JGitUtil.CommitInfo])(implicit s: Session): Unit =
Activities insert Activity(userName, repositoryName, activityUserName, Activities insert Activity(userName, repositoryName, activityUserName,
"push", "push",
s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
@@ -129,7 +130,7 @@ trait ActivityService {
currentDate) currentDate)
def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String, def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String,
tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = tagName: String, commits: List[JGitUtil.CommitInfo])(implicit s: Session): Unit =
Activities insert Activity(userName, repositoryName, activityUserName, Activities insert Activity(userName, repositoryName, activityUserName,
"create_tag", "create_tag",
s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]", s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]",
@@ -137,7 +138,7 @@ trait ActivityService {
currentDate) currentDate)
def recordDeleteTagActivity(userName: String, repositoryName: String, activityUserName: String, def recordDeleteTagActivity(userName: String, repositoryName: String, activityUserName: String,
tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = tagName: String, commits: List[JGitUtil.CommitInfo])(implicit s: Session): Unit =
Activities insert Activity(userName, repositoryName, activityUserName, Activities insert Activity(userName, repositoryName, activityUserName,
"delete_tag", "delete_tag",
s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]", s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]",

View File

@@ -1,13 +1,14 @@
package service package gitbucket.core.service
import gitbucket.core.model.CommitComment
import gitbucket.core.util.{StringUtil, Implicits}
import scala.slick.jdbc.{StaticQuery => Q} import scala.slick.jdbc.{StaticQuery => Q}
import Q.interpolation import Q.interpolation
import gitbucket.core.model.Profile._
import model.Profile._
import profile.simple._ import profile.simple._
import model.CommitComment import Implicits._
import util.Implicits._ import StringUtil._
import util.StringUtil._
trait CommitsService { trait CommitsService {

View File

@@ -1,13 +1,13 @@
package service package gitbucket.core.service
import gitbucket.core.model._
import gitbucket.core.util.StringUtil._
import gitbucket.core.util.Implicits._
import scala.slick.jdbc.{StaticQuery => Q} import scala.slick.jdbc.{StaticQuery => Q}
import Q.interpolation import Q.interpolation
import model.Profile._ import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
import model.{Issue, IssueComment, IssueLabel, Label}
import util.Implicits._
import util.StringUtil._
trait IssuesService { trait IssuesService {
import IssuesService._ import IssuesService._

View File

@@ -1,8 +1,8 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.Label
import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
import model.Label
trait LabelsService { trait LabelsService {

View File

@@ -1,10 +1,10 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.Milestone
import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
import model.Milestone // TODO Why is direct import required?
// TODO [Slick 2.0]NOT import directly? import gitbucket.core.model.Profile.dateColumnType
import model.Profile.dateColumnType
trait MilestonesService { trait MilestonesService {

View File

@@ -1,8 +1,8 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.Plugin
import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
import model.Plugin
trait PluginService { trait PluginService {

View File

@@ -1,9 +1,9 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.{Issue, PullRequest}
import gitbucket.core.model.Profile._
import gitbucket.core.util.JGitUtil
import profile.simple._ import profile.simple._
import model.{PullRequest, Issue}
import util.JGitUtil
trait PullRequestService { self: IssuesService => trait PullRequestService { self: IssuesService =>
import PullRequestService._ import PullRequestService._

View File

@@ -1,13 +1,15 @@
package service package gitbucket.core.service
import util.{FileUtil, StringUtil, JGitUtil} import gitbucket.core.model.Issue
import util.Directory._ import gitbucket.core.util._
import util.ControlUtil._ import gitbucket.core.util.StringUtil
import Directory._
import ControlUtil._
import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.treewalk.TreeWalk import org.eclipse.jgit.treewalk.TreeWalk
import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.lib.FileMode
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import model.Profile._ import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
trait RepositorySearchService { self: IssuesService => trait RepositorySearchService { self: IssuesService =>
@@ -108,7 +110,7 @@ object RepositorySearchService {
case class SearchResult( case class SearchResult(
files : List[(String, String)], files : List[(String, String)],
issues: List[(model.Issue, Int, String)]) issues: List[(Issue, Int, String)])
case class IssueSearchResult( case class IssueSearchResult(
issueId: Int, issueId: Int,

View File

@@ -1,9 +1,9 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.{Collaborator, Repository, Account}
import gitbucket.core.model.Profile._
import gitbucket.core.util.JGitUtil
import profile.simple._ import profile.simple._
import model.{Repository, Account, Collaborator, Label}
import util.JGitUtil
trait RepositoryService { self: AccountService => trait RepositoryService { self: AccountService =>
import RepositoryService._ import RepositoryService._
@@ -375,7 +375,7 @@ object RepositoryService {
case class RepositoryInfo(owner: String, name: String, httpUrl: String, repository: Repository, case class RepositoryInfo(owner: String, name: String, httpUrl: String, repository: Repository,
issueCount: Int, pullCount: Int, commitCount: Int, forkedCount: Int, issueCount: Int, pullCount: Int, commitCount: Int, forkedCount: Int,
branchList: Seq[String], tags: Seq[util.JGitUtil.TagInfo], managers: Seq[String]){ branchList: Seq[String], tags: Seq[JGitUtil.TagInfo], managers: Seq[String]){
lazy val host = """^https?://(.+?)(:\d+)?/""".r.findFirstMatchIn(httpUrl).get.group(1) lazy val host = """^https?://(.+?)(:\d+)?/""".r.findFirstMatchIn(httpUrl).get.group(1)

View File

@@ -1,7 +1,9 @@
package service package gitbucket.core.service
import model.{Account, Issue, Session} import gitbucket.core.model.{Session, Issue, Account}
import util.Implicits.request2Session import gitbucket.core.util.Implicits
import gitbucket.core.controller.Context
import Implicits.request2Session
/** /**
* This service is used for a view helper mainly. * This service is used for a view helper mainly.
@@ -11,25 +13,22 @@ import util.Implicits.request2Session
*/ */
trait RequestCache extends SystemSettingsService with AccountService with IssuesService { trait RequestCache extends SystemSettingsService with AccountService with IssuesService {
private implicit def context2Session(implicit context: app.Context): Session = private implicit def context2Session(implicit context: Context): Session =
request2Session(context.request) request2Session(context.request)
def getIssue(userName: String, repositoryName: String, issueId: String) def getIssue(userName: String, repositoryName: String, issueId: String)(implicit context: Context): Option[Issue] = {
(implicit context: app.Context): Option[Issue] = {
context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){ context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){
super.getIssue(userName, repositoryName, issueId) super.getIssue(userName, repositoryName, issueId)
} }
} }
def getAccountByUserName(userName: String) def getAccountByUserName(userName: String)(implicit context: Context): Option[Account] = {
(implicit context: app.Context): Option[Account] = {
context.cache(s"account.${userName}"){ context.cache(s"account.${userName}"){
super.getAccountByUserName(userName) super.getAccountByUserName(userName)
} }
} }
def getAccountByMailAddress(mailAddress: String) def getAccountByMailAddress(mailAddress: String)(implicit context: Context): Option[Account] = {
(implicit context: app.Context): Option[Account] = {
context.cache(s"account.${mailAddress}"){ context.cache(s"account.${mailAddress}"){
super.getAccountByMailAddress(mailAddress) super.getAccountByMailAddress(mailAddress)
} }

View File

@@ -1,8 +1,8 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.SshKey
import gitbucket.core.model.Profile._
import profile.simple._ import profile.simple._
import model.SshKey
trait SshKeyService { trait SshKeyService {

View File

@@ -1,7 +1,8 @@
package service package gitbucket.core.service
import util.Directory._ import gitbucket.core.util.{Directory, ControlUtil}
import util.ControlUtil._ import Directory._
import ControlUtil._
import SystemSettingsService._ import SystemSettingsService._
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest

View File

@@ -1,13 +1,14 @@
package service package gitbucket.core.service
import model.Profile._ import gitbucket.core.model.{WebHook, Account}
import gitbucket.core.model.Profile._
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.util.JGitUtil
import profile.simple._ import profile.simple._
import model.{WebHook, Account}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import service.RepositoryService.RepositoryInfo import RepositoryService.RepositoryInfo
import util.JGitUtil
import org.eclipse.jgit.diff.DiffEntry import org.eclipse.jgit.diff.DiffEntry
import util.JGitUtil.CommitInfo import JGitUtil.CommitInfo
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.apache.http.message.BasicNameValuePair import org.apache.http.message.BasicNameValuePair
import org.apache.http.client.entity.UrlEncodedFormEntity import org.apache.http.client.entity.UrlEncodedFormEntity

View File

@@ -1,9 +1,10 @@
package service package gitbucket.core.service
import java.util.Date import java.util.Date
import gitbucket.core.model.Account
import gitbucket.core.util._
import gitbucket.core.util.ControlUtil._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import util._
import _root_.util.ControlUtil._
import org.eclipse.jgit.treewalk.CanonicalTreeParser import org.eclipse.jgit.treewalk.CanonicalTreeParser
import org.eclipse.jgit.lib._ import org.eclipse.jgit.lib._
import org.eclipse.jgit.dircache.DirCache import org.eclipse.jgit.dircache.DirCache
@@ -12,7 +13,7 @@ import java.io.ByteArrayInputStream
import org.eclipse.jgit.patch._ import org.eclipse.jgit.patch._
import org.eclipse.jgit.api.errors.PatchFormatException import org.eclipse.jgit.api.errors.PatchFormatException
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
import service.RepositoryService.RepositoryInfo import RepositoryService.RepositoryInfo
object WikiService { object WikiService {
@@ -46,7 +47,7 @@ object WikiService {
trait WikiService { trait WikiService {
import WikiService._ import WikiService._
def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = def createWikiRepository(loginAccount: Account, owner: String, repository: String): Unit =
LockUtil.lock(s"${owner}/${repository}/wiki"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
defining(Directory.getWikiRepositoryDir(owner, repository)){ dir => defining(Directory.getWikiRepositoryDir(owner, repository)){ dir =>
if(!dir.exists){ if(!dir.exists){
@@ -102,7 +103,7 @@ trait WikiService {
* Reverts specified changes. * Reverts specified changes.
*/ */
def revertWikiPage(owner: String, repository: String, from: String, to: String, def revertWikiPage(owner: String, repository: String, from: String, to: String,
committer: model.Account, pageName: Option[String]): Boolean = { committer: Account, pageName: Option[String]): Boolean = {
case class RevertInfo(operation: String, filePath: String, source: String) case class RevertInfo(operation: String, filePath: String, source: String)
@@ -204,7 +205,7 @@ trait WikiService {
* Save the wiki page. * Save the wiki page.
*/ */
def saveWikiPage(owner: String, repository: String, currentPageName: String, newPageName: String, def saveWikiPage(owner: String, repository: String, currentPageName: String, newPageName: String,
content: String, committer: model.Account, message: String, currentId: Option[String]): Option[String] = { content: String, committer: Account, message: String, currentId: Option[String]): Option[String] = {
LockUtil.lock(s"${owner}/${repository}/wiki"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git => using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git =>
val builder = DirCache.newInCore.builder() val builder = DirCache.newInCore.builder()

View File

@@ -1,16 +1,15 @@
package servlet package gitbucket.core.servlet
import javax.servlet._ import javax.servlet._
import javax.servlet.http._ import javax.servlet.http._
import service.{SystemSettingsService, AccountService, RepositoryService} import gitbucket.core.service.{RepositoryService, AccountService, SystemSettingsService}
import model._ import gitbucket.core.util.{ControlUtil, Keys, Implicits}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import util.Implicits._ import Implicits._
import util.ControlUtil._ import ControlUtil._
import util.Keys
/** /**
* Provides BASIC Authentication for [[servlet.GitRepositoryServlet]]. * Provides BASIC Authentication for [[GitRepositoryServlet]].
*/ */
class BasicAuthenticationFilter extends Filter with RepositoryService with AccountService with SystemSettingsService { class BasicAuthenticationFilter extends Filter with RepositoryService with AccountService with SystemSettingsService {

View File

@@ -1,5 +1,8 @@
package servlet package gitbucket.core.servlet
import gitbucket.core.model.Session
import gitbucket.core.service._
import gitbucket.core.util._
import org.eclipse.jgit.http.server.GitServlet import org.eclipse.jgit.http.server.GitServlet
import org.eclipse.jgit.lib._ import org.eclipse.jgit.lib._
import org.eclipse.jgit.transport._ import org.eclipse.jgit.transport._
@@ -9,21 +12,19 @@ import org.slf4j.LoggerFactory
import javax.servlet.ServletConfig import javax.servlet.ServletConfig
import javax.servlet.ServletContext import javax.servlet.ServletContext
import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
import util.{StringUtil, Keys, JGitUtil, Directory} import gitbucket.core.util.StringUtil
import util.ControlUtil._ import gitbucket.core.util.ControlUtil._
import util.Implicits._ import gitbucket.core.util.Implicits._
import service._
import WebHookService._ import WebHookService._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import util.JGitUtil.CommitInfo import JGitUtil.CommitInfo
import service.IssuesService.IssueSearchCondition import IssuesService.IssueSearchCondition
import model.Session
/** /**
* Provides Git repository via HTTP. * Provides Git repository via HTTP.
* *
* This servlet provides only Git repository functionality. * This servlet provides only Git repository functionality.
* Authentication is provided by [[servlet.BasicAuthenticationFilter]]. * Authentication is provided by [[BasicAuthenticationFilter]].
*/ */
class GitRepositoryServlet extends GitServlet with SystemSettingsService { class GitRepositoryServlet extends GitServlet with SystemSettingsService {

View File

@@ -1,17 +1,19 @@
package servlet package gitbucket.core.servlet
import java.io.File import java.io.File
import java.sql.{DriverManager, Connection} import java.sql.{DriverManager, Connection}
import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.util._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import javax.servlet.{ServletContextListener, ServletContextEvent} import javax.servlet.{ServletContextListener, ServletContextEvent}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import util.Directory._ import Directory._
import util.ControlUtil._ import ControlUtil._
import util.JDBCUtil._ import JDBCUtil._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import util.{Version, Versions} import gitbucket.core.util.Versions
import plugin._ import gitbucket.core.util.Directory
import util.{DatabaseConfig, Directory} import gitbucket.core.plugin._
object AutoUpdate { object AutoUpdate {

View File

@@ -1,8 +1,9 @@
package servlet package gitbucket.core.servlet
import javax.servlet.http.{HttpSessionEvent, HttpSessionListener} import javax.servlet.http.{HttpSessionEvent, HttpSessionListener}
import gitbucket.core.util.Directory
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import util.Directory._ import Directory._
/** /**
* Removes session associated temporary files when session is destroyed. * Removes session associated temporary files when session is destroyed.

View File

@@ -1,11 +1,12 @@
package servlet package gitbucket.core.servlet
import javax.servlet._ import javax.servlet._
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import com.mchange.v2.c3p0.ComboPooledDataSource import com.mchange.v2.c3p0.ComboPooledDataSource
import gitbucket.core.util.DatabaseConfig
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import slick.jdbc.JdbcBackend.{Database => SlickDatabase, Session} import slick.jdbc.JdbcBackend.{Database => SlickDatabase, Session}
import util.{DatabaseConfig, Keys} import gitbucket.core.util.Keys
/** /**
* Controls the transaction with the open session in view pattern. * Controls the transaction with the open session in view pattern.

View File

@@ -1,17 +1,18 @@
package ssh package gitbucket.core.ssh
import gitbucket.core.model.Session
import gitbucket.core.service.{RepositoryService, AccountService, SystemSettingsService}
import gitbucket.core.servlet.{Database, CommitLogHook}
import gitbucket.core.util.{Directory, ControlUtil}
import org.apache.sshd.server.{CommandFactory, Environment, ExitCallback, Command} import org.apache.sshd.server.{CommandFactory, Environment, ExitCallback, Command}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.{InputStream, OutputStream} import java.io.{InputStream, OutputStream}
import util.ControlUtil._ import ControlUtil._
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import util.Directory._ import Directory._
import org.eclipse.jgit.transport.{ReceivePack, UploadPack} import org.eclipse.jgit.transport.{ReceivePack, UploadPack}
import org.apache.sshd.server.command.UnknownCommand import org.apache.sshd.server.command.UnknownCommand
import servlet.{Database, CommitLogHook}
import service.{AccountService, RepositoryService, SystemSettingsService}
import org.eclipse.jgit.errors.RepositoryNotFoundException import org.eclipse.jgit.errors.RepositoryNotFoundException
import model.Session
object GitCommand { object GitCommand {
val CommandRegex = """\Agit-(upload|receive)-pack '/([a-zA-Z0-9\-_.]+)/([a-zA-Z0-9\-_.]+).git'\Z""".r val CommandRegex = """\Agit-(upload|receive)-pack '/([a-zA-Z0-9\-_.]+)/([a-zA-Z0-9\-_.]+).git'\Z""".r

View File

@@ -1,10 +1,10 @@
package ssh package gitbucket.core.ssh
import gitbucket.core.service.SystemSettingsService
import org.apache.sshd.common.Factory import org.apache.sshd.common.Factory
import org.apache.sshd.server.{Environment, ExitCallback, Command} import org.apache.sshd.server.{Environment, ExitCallback, Command}
import java.io.{OutputStream, InputStream} import java.io.{OutputStream, InputStream}
import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.Constants
import service.SystemSettingsService
class NoShell extends Factory[Command] with SystemSettingsService { class NoShell extends Factory[Command] with SystemSettingsService {
override def create(): Command = new Command() { override def create(): Command = new Command() {

View File

@@ -1,10 +1,10 @@
package ssh package gitbucket.core.ssh
import gitbucket.core.service.SshKeyService
import gitbucket.core.servlet.Database
import org.apache.sshd.server.PublickeyAuthenticator import org.apache.sshd.server.PublickeyAuthenticator
import org.apache.sshd.server.session.ServerSession import org.apache.sshd.server.session.ServerSession
import java.security.PublicKey import java.security.PublicKey
import service.SshKeyService
import servlet.Database
class PublicKeyAuthenticator extends PublickeyAuthenticator with SshKeyService { class PublicKeyAuthenticator extends PublickeyAuthenticator with SshKeyService {

View File

@@ -1,10 +1,10 @@
package ssh package gitbucket.core.ssh
import javax.servlet.{ServletContextEvent, ServletContextListener} import javax.servlet.{ServletContextEvent, ServletContextListener}
import gitbucket.core.service.SystemSettingsService
import gitbucket.core.util.Directory
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import util.Directory
import service.SystemSettingsService
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
object SshServer { object SshServer {

View File

@@ -1,4 +1,4 @@
package ssh package gitbucket.core.ssh
import java.security.PublicKey import java.security.PublicKey
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View File

@@ -1,10 +1,10 @@
package util package gitbucket.core.util
import app.ControllerBase import gitbucket.core.controller.ControllerBase
import service._ import gitbucket.core.service.{RepositoryService, AccountService}
import RepositoryService.RepositoryInfo import RepositoryService.RepositoryInfo
import util.Implicits._ import Implicits._
import util.ControlUtil._ import ControlUtil._
/** /**
* Allows only oneself and administrators. * Allows only oneself and administrators.

View File

@@ -1,4 +1,4 @@
package util package gitbucket.core.util
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.revwalk.RevWalk

View File

@@ -1,7 +1,7 @@
package util package gitbucket.core.util
import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigFactory
import util.Directory.DatabaseHome import Directory.DatabaseHome
object DatabaseConfig { object DatabaseConfig {

View File

@@ -1,7 +1,7 @@
package util package gitbucket.core.util
import java.io.File import java.io.File
import util.ControlUtil._ import ControlUtil._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
/** /**

View File

@@ -1,9 +1,9 @@
package util package gitbucket.core.util
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import java.net.URLConnection import java.net.URLConnection
import java.io.File import java.io.File
import util.ControlUtil._ import ControlUtil._
import scala.util.Random import scala.util.Random
object FileUtil { object FileUtil {

View File

@@ -1,9 +1,10 @@
package util package gitbucket.core.util
import gitbucket.core.servlet.Database
import scala.util.matching.Regex import scala.util.matching.Regex
import scala.util.control.Exception._ import scala.util.control.Exception._
import slick.jdbc.JdbcBackend import slick.jdbc.JdbcBackend
import servlet.Database
import javax.servlet.http.{HttpSession, HttpServletRequest} import javax.servlet.http.{HttpSession, HttpServletRequest}
/** /**

View File

@@ -1,7 +1,7 @@
package util package gitbucket.core.util
import java.sql._ import java.sql._
import util.ControlUtil._ import ControlUtil._
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
/** /**

View File

@@ -1,9 +1,10 @@
package util package gitbucket.core.util
import gitbucket.core.service.RepositoryService
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
import util.Directory._ import Directory._
import util.StringUtil._ import StringUtil._
import util.ControlUtil._ import ControlUtil._
import scala.annotation.tailrec import scala.annotation.tailrec
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
import org.eclipse.jgit.lib._ import org.eclipse.jgit.lib._
@@ -16,7 +17,6 @@ import org.eclipse.jgit.errors.{ConfigInvalidException, MissingObjectException}
import org.eclipse.jgit.transport.RefSpec import org.eclipse.jgit.transport.RefSpec
import java.util.Date import java.util.Date
import org.eclipse.jgit.api.errors.{JGitInternalException, InvalidRefNameException, RefAlreadyExistsException, NoHeadException} import org.eclipse.jgit.api.errors.{JGitInternalException, InvalidRefNameException, RefAlreadyExistsException, NoHeadException}
import service.RepositoryService
import org.eclipse.jgit.dircache.DirCacheEntry import org.eclipse.jgit.dircache.DirCacheEntry
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View File

@@ -1,4 +1,4 @@
package util package gitbucket.core.util
/** /**
* Define key strings for request attributes, session attributes or flash attributes. * Define key strings for request attributes, session attributes or flash attributes.

View File

@@ -1,13 +1,13 @@
package util package gitbucket.core.util
import util.ControlUtil._ import gitbucket.core.model.Account
import service.SystemSettingsService import ControlUtil._
import gitbucket.core.service.SystemSettingsService
import gitbucket.core.service.SystemSettingsService.Ldap
import com.novell.ldap._ import com.novell.ldap._
import java.security.Security import java.security.Security
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import service.SystemSettingsService.Ldap
import scala.annotation.tailrec import scala.annotation.tailrec
import model.Account
/** /**
* Utility for LDAP authentication. * Utility for LDAP authentication.

View File

@@ -1,8 +1,8 @@
package util package gitbucket.core.util
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.locks.{ReentrantLock, Lock} import java.util.concurrent.locks.{ReentrantLock, Lock}
import util.ControlUtil._ import ControlUtil._
object LockUtil { object LockUtil {

View File

@@ -1,22 +1,24 @@
package util package gitbucket.core.util
import gitbucket.core.model.{Session, Issue}
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, SystemSettingsService}
import gitbucket.core.servlet.Database
import gitbucket.core.view.Markdown
import scala.concurrent._ import scala.concurrent._
import ExecutionContext.Implicits.global import ExecutionContext.Implicits.global
import org.apache.commons.mail.{DefaultAuthenticator, HtmlEmail} import org.apache.commons.mail.{DefaultAuthenticator, HtmlEmail}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import app.Context import gitbucket.core.controller.Context
import model.Session
import service.{AccountService, RepositoryService, IssuesService, SystemSettingsService}
import servlet.Database
import SystemSettingsService.Smtp import SystemSettingsService.Smtp
import _root_.util.ControlUtil.defining import ControlUtil.defining
trait Notifier extends RepositoryService with AccountService with IssuesService { trait Notifier extends RepositoryService with AccountService with IssuesService {
def toNotify(r: RepositoryService.RepositoryInfo, issueId: Int, content: String) def toNotify(r: RepositoryService.RepositoryInfo, issueId: Int, content: String)
(msg: String => String)(implicit context: Context): Unit (msg: String => String)(implicit context: Context): Unit
protected def recipients(issue: model.Issue)(notify: String => Unit)(implicit session: Session, context: Context) = protected def recipients(issue: Issue)(notify: String => Unit)(implicit session: Session, context: Context) =
( (
// individual repository's owner // individual repository's owner
issue.userName :: issue.userName ::
@@ -74,7 +76,7 @@ class Mailer(private val smtp: Smtp) extends Notifier {
getIssue(r.owner, r.name, issueId.toString) foreach { issue => getIssue(r.owner, r.name, issueId.toString) foreach { issue =>
defining( defining(
s"[${r.name}] ${issue.title} (#${issueId})" -> s"[${r.name}] ${issue.title} (#${issueId})" ->
msg(view.Markdown.toHtml(content, r, false, true))) { case (subject, msg) => msg(Markdown.toHtml(content, r, false, true))) { case (subject, msg) =>
recipients(issue) { to => recipients(issue) { to =>
val email = new HtmlEmail val email = new HtmlEmail
email.setHostName(smtp.host) email.setHostName(smtp.host)

View File

@@ -1,8 +1,8 @@
package util package gitbucket.core.util
import java.net.{URLDecoder, URLEncoder} import java.net.{URLDecoder, URLEncoder}
import org.mozilla.universalchardet.UniversalDetector import org.mozilla.universalchardet.UniversalDetector
import util.ControlUtil._ import ControlUtil._
import org.apache.commons.io.input.BOMInputStream import org.apache.commons.io.input.BOMInputStream
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
@@ -30,7 +30,7 @@ object StringUtil {
value.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;") value.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;")
/** /**
* Make string from byte array. Character encoding is detected automatically by [[util.StringUtil.detectEncoding]]. * Make string from byte array. Character encoding is detected automatically by [[StringUtil.detectEncoding]].
* And if given bytes contains UTF-8 BOM, it's removed from returned string. * And if given bytes contains UTF-8 BOM, it's removed from returned string.
*/ */
def convertFromByteArray(content: Array[Byte]): String = def convertFromByteArray(content: Array[Byte]): String =

View File

@@ -1,4 +1,4 @@
package util package gitbucket.core.util
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.scalatra.i18n.Messages import org.scalatra.i18n.Messages

View File

@@ -1,10 +1,10 @@
package util package gitbucket.core.util
import java.sql.Connection import java.sql.Connection
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import util.ControlUtil._ import ControlUtil._
case class Version(majorVersion: Int, minorVersion: Int) { case class Version(majorVersion: Int, minorVersion: Int) {

View File

@@ -1,8 +1,9 @@
package view package gitbucket.core.view
import service.RequestCache import gitbucket.core.controller.Context
import gitbucket.core.service.RequestCache
import gitbucket.core.util.StringUtil
import play.twirl.api.Html import play.twirl.api.Html
import util.StringUtil
trait AvatarImageProvider { self: RequestCache => trait AvatarImageProvider { self: RequestCache =>
@@ -11,7 +12,7 @@ trait AvatarImageProvider { self: RequestCache =>
* Looks up Gravatar if avatar icon has not been configured in user settings. * Looks up Gravatar if avatar icon has not been configured in user settings.
*/ */
protected def getAvatarImageHtml(userName: String, size: Int, protected def getAvatarImageHtml(userName: String, size: Int,
mailAddress: String = "", tooltip: Boolean = false)(implicit context: app.Context): Html = { mailAddress: String = "", tooltip: Boolean = false)(implicit context: Context): Html = {
val src = if(mailAddress.isEmpty){ val src = if(mailAddress.isEmpty){
// by user name // by user name

View File

@@ -1,15 +1,17 @@
package view package gitbucket.core.view
import service.RequestCache import gitbucket.core.controller.Context
import util.Implicits.RichString import gitbucket.core.service.{RepositoryService, RequestCache}
import gitbucket.core.util.Implicits
import gitbucket.core.util.Implicits.RichString
trait LinkConverter { self: RequestCache => trait LinkConverter { self: RequestCache =>
/** /**
* Converts issue id, username and commit id to link. * Converts issue id, username and commit id to link.
*/ */
protected def convertRefsLinks(value: String, repository: service.RepositoryService.RepositoryInfo, protected def convertRefsLinks(value: String, repository: RepositoryService.RepositoryInfo,
issueIdPrefix: String = "#")(implicit context: app.Context): String = { issueIdPrefix: String = "#")(implicit context: Context): String = {
value value
// escape HTML tags // escape HTML tags
.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;") .replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;")

View File

@@ -1,17 +1,18 @@
package view package gitbucket.core.view
import util.StringUtil
import util.ControlUtil._
import util.Directory._
import org.parboiled.common.StringUtils
import org.pegdown._
import org.pegdown.ast._
import org.pegdown.LinkRenderer.Rendering
import java.text.Normalizer import java.text.Normalizer
import java.util.Locale import java.util.Locale
import java.util.regex.Pattern import java.util.regex.Pattern
import gitbucket.core.controller.Context
import gitbucket.core.service.{RepositoryService, RequestCache, WikiService}
import gitbucket.core.util.StringUtil
import org.parboiled.common.StringUtils
import org.pegdown.LinkRenderer.Rendering
import org.pegdown._
import org.pegdown.ast._
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
import service.{RequestCache, WikiService}
object Markdown { object Markdown {
@@ -19,12 +20,12 @@ object Markdown {
* Converts Markdown of Wiki pages to HTML. * Converts Markdown of Wiki pages to HTML.
*/ */
def toHtml(markdown: String, def toHtml(markdown: String,
repository: service.RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableTaskList: Boolean = false, enableTaskList: Boolean = false,
hasWritePermission: Boolean = false, hasWritePermission: Boolean = false,
pages: List[String] = Nil)(implicit context: app.Context): String = { pages: List[String] = Nil)(implicit context: Context): String = {
// escape issue id // escape issue id
val s = if(enableRefsLink){ val s = if(enableRefsLink){
@@ -45,8 +46,8 @@ object Markdown {
} }
class GitBucketLinkRender( class GitBucketLinkRender(
context: app.Context, context: Context,
repository: service.RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
pages: List[String]) extends LinkRenderer with WikiService { pages: List[String]) extends LinkRenderer with WikiService {
@@ -96,13 +97,13 @@ class GitBucketVerbatimSerializer extends VerbatimSerializer {
class GitBucketHtmlSerializer( class GitBucketHtmlSerializer(
markdown: String, markdown: String,
repository: service.RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableTaskList: Boolean, enableTaskList: Boolean,
hasWritePermission: Boolean, hasWritePermission: Boolean,
pages: List[String] pages: List[String]
)(implicit val context: app.Context) extends ToHtmlSerializer( )(implicit val context: Context) extends ToHtmlSerializer(
new GitBucketLinkRender(context, repository, enableWikiLink, pages), new GitBucketLinkRender(context, repository, enableWikiLink, pages),
Map[String, VerbatimSerializer](VerbatimSerializer.DEFAULT -> new GitBucketVerbatimSerializer).asJava Map[String, VerbatimSerializer](VerbatimSerializer.DEFAULT -> new GitBucketVerbatimSerializer).asJava
) with LinkConverter with RequestCache { ) with LinkConverter with RequestCache {

View File

@@ -1,4 +1,4 @@
package view package gitbucket.core.view
/** /**
* Provides control information for pagination. * Provides control information for pagination.

View File

@@ -1,9 +1,12 @@
package view package gitbucket.core.view
import java.util.{Locale, Date, TimeZone}
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.{Date, Locale, TimeZone}
import gitbucket.core.controller.Context
import gitbucket.core.service.{RepositoryService, RequestCache}
import gitbucket.core.util.{JGitUtil, StringUtil}
import play.twirl.api.Html import play.twirl.api.Html
import util.StringUtil
import service.RequestCache
/** /**
* Provides helper methods for Twirl templates. * Provides helper methods for Twirl templates.
@@ -75,7 +78,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
def plural(count: Int, singular: String, plural: String = ""): String = def plural(count: Int, singular: String, plural: String = ""): String =
if(count == 1) singular else if(plural.isEmpty) singular + "s" else plural if(count == 1) singular else if(plural.isEmpty) singular + "s" else plural
private[this] val renderersBySuffix: Seq[(String, (List[String], String, String, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] = private[this] val renderersBySuffix: Seq[(String, (List[String], String, String, RepositoryService.RepositoryInfo, Boolean, Boolean, Context) => Html)] =
Seq( Seq(
".md" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)), ".md" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
".markdown" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)) ".markdown" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context))
@@ -87,17 +90,17 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
* Converts Markdown of Wiki pages to HTML. * Converts Markdown of Wiki pages to HTML.
*/ */
def markdown(value: String, def markdown(value: String,
repository: service.RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableTaskList: Boolean = false, enableTaskList: Boolean = false,
hasWritePermission: Boolean = false, hasWritePermission: Boolean = false,
pages: List[String] = Nil)(implicit context: app.Context): Html = pages: List[String] = Nil)(implicit context: Context): Html =
Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink, enableTaskList, hasWritePermission, pages)) Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink, enableTaskList, hasWritePermission, pages))
def renderMarkup(filePath: List[String], fileContent: String, branch: String, def renderMarkup(filePath: List[String], fileContent: String, branch: String,
repository: service.RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = { enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: Context): Html = {
val fileNameLower = filePath.reverse.head.toLowerCase val fileNameLower = filePath.reverse.head.toLowerCase
renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match { renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match {
@@ -114,20 +117,20 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
* Returns &lt;img&gt; which displays the avatar icon for the given user name. * Returns &lt;img&gt; which displays the avatar icon for the given user name.
* This method looks up Gravatar if avatar icon has not been configured in user settings. * This method looks up Gravatar if avatar icon has not been configured in user settings.
*/ */
def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: app.Context): Html = def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: Context): Html =
getAvatarImageHtml(userName, size, "", tooltip) getAvatarImageHtml(userName, size, "", tooltip)
/** /**
* Returns &lt;img&gt; which displays the avatar icon for the given mail address. * Returns &lt;img&gt; which displays the avatar icon for the given mail address.
* This method looks up Gravatar if avatar icon has not been configured in user settings. * This method looks up Gravatar if avatar icon has not been configured in user settings.
*/ */
def avatar(commit: util.JGitUtil.CommitInfo, size: Int)(implicit context: app.Context): Html = def avatar(commit: JGitUtil.CommitInfo, size: Int)(implicit context: Context): Html =
getAvatarImageHtml(commit.authorName, size, commit.authorEmailAddress) getAvatarImageHtml(commit.authorName, size, commit.authorEmailAddress)
/** /**
* Converts commit id, issue id and username to the link. * Converts commit id, issue id and username to the link.
*/ */
def link(value: String, repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context): Html = def link(value: String, repository: RepositoryService.RepositoryInfo)(implicit context: Context): Html =
Html(convertRefsLinks(value, repository)) Html(convertRefsLinks(value, repository))
def cut(value: String, length: Int): String = def cut(value: String, length: Int): String =
@@ -147,7 +150,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
/** /**
* Convert link notations in the activity message. * Convert link notations in the activity message.
*/ */
def activityMessage(message: String)(implicit context: app.Context): Html = def activityMessage(message: String)(implicit context: Context): Html =
Html(message Html(message
.replaceAll("\\[issue:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""<a href="${context.path}/$$1/$$2/issues/$$3">$$1/$$2#$$3</a>""") .replaceAll("\\[issue:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""<a href="${context.path}/$$1/$$2/issues/$$3">$$1/$$2#$$3</a>""")
.replaceAll("\\[pullreq:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""<a href="${context.path}/$$1/$$2/pull/$$3">$$1/$$2#$$3</a>""") .replaceAll("\\[pullreq:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""<a href="${context.path}/$$1/$$2/pull/$$3">$$1/$$2#$$3</a>""")
@@ -170,34 +173,34 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
/** /**
* Generates the url to the repository. * Generates the url to the repository.
*/ */
def url(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context): String = def url(repository: RepositoryService.RepositoryInfo)(implicit context: Context): String =
s"${context.path}/${repository.owner}/${repository.name}" s"${context.path}/${repository.owner}/${repository.name}"
/** /**
* Generates the url to the account page. * Generates the url to the account page.
*/ */
def url(userName: String)(implicit context: app.Context): String = s"${context.path}/${userName}" def url(userName: String)(implicit context: Context): String = s"${context.path}/${userName}"
/** /**
* Returns the url to the root of assets. * Returns the url to the root of assets.
*/ */
def assets(implicit context: app.Context): String = s"${context.path}/assets" def assets(implicit context: Context): String = s"${context.path}/assets"
/** /**
* Generates the text link to the account page. * Generates the text link to the account page.
* If user does not exist or disabled, this method returns user name as text without link. * If user does not exist or disabled, this method returns user name as text without link.
*/ */
def user(userName: String, mailAddress: String = "", styleClass: String = "")(implicit context: app.Context): Html = def user(userName: String, mailAddress: String = "", styleClass: String = "")(implicit context: Context): Html =
userWithContent(userName, mailAddress, styleClass)(Html(userName)) userWithContent(userName, mailAddress, styleClass)(Html(userName))
/** /**
* Generates the avatar link to the account page. * Generates the avatar link to the account page.
* If user does not exist or disabled, this method returns avatar image without link. * If user does not exist or disabled, this method returns avatar image without link.
*/ */
def avatarLink(userName: String, size: Int, mailAddress: String = "", tooltip: Boolean = false)(implicit context: app.Context): Html = def avatarLink(userName: String, size: Int, mailAddress: String = "", tooltip: Boolean = false)(implicit context: Context): Html =
userWithContent(userName, mailAddress)(avatar(userName, size, tooltip)) userWithContent(userName, mailAddress)(avatar(userName, size, tooltip))
private def userWithContent(userName: String, mailAddress: String = "", styleClass: String = "")(content: Html)(implicit context: app.Context): Html = private def userWithContent(userName: String, mailAddress: String = "", styleClass: String = "")(content: Html)(implicit context: Context): Html =
(if(mailAddress.isEmpty){ (if(mailAddress.isEmpty){
getAccountByUserName(userName) getAccountByUserName(userName)
} else { } else {

View File

@@ -1,4 +0,0 @@
@(title: String)(implicit context: app.Context)
@main("Error"){
<h1>@title</h1>
}

View File

@@ -1,6 +1,8 @@
@(account: model.Account, groupNames: List[String], activities: List[model.Activity])(implicit context: app.Context) @(account: gitbucket.core.model.Account,
groupNames: List[String],
activities: List[gitbucket.core.model.Activity])(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@main(account, groupNames, "activity"){ @main(account, groupNames, "activity"){
<div class="pull-right"> <div class="pull-right">
<a href="@path/@{account.userName}.atom"><img src="@assets/common/images/feed.png" alt="activities"></a> <a href="@path/@{account.userName}.atom"><img src="@assets/common/images/feed.png" alt="activities"></a>

View File

@@ -1,7 +1,7 @@
@(account: model.Account, info: Option[Any])(implicit context: app.Context) @(account: gitbucket.core.model.Account, info: Option[Any])(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.util.LDAPUtil
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@import util.LDAPUtil
@html.main("Edit your profile"){ @html.main("Edit your profile"){
<div class="container"> <div class="container">
<div class="row-fluid"> <div class="row-fluid">

View File

@@ -1,6 +1,6 @@
@(account: Option[model.Account], members: List[model.GroupMember])(implicit context: app.Context) @(account: Option[gitbucket.core.model.Account], members: List[gitbucket.core.model.GroupMember])(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main(if(account.isEmpty) "Create group" else "Edit group"){ @html.main(if(account.isEmpty) "Create group" else "Edit group"){
<div class="container"> <div class="container">
<form id="form" method="post" action="@if(account.isEmpty){@path/groups/new} else {@path/@account.get.userName/_editgroup}" validate="true"> <form id="form" method="post" action="@if(account.isEmpty){@path/groups/new} else {@path/@account.get.userName/_editgroup}" validate="true">

View File

@@ -1,7 +1,7 @@
@(account: model.Account, groupNames: List[String], active: String, @(account: gitbucket.core.model.Account, groupNames: List[String], active: String,
isGroupManager: Boolean = false)(body: Html)(implicit context: app.Context) isGroupManager: Boolean = false)(body: Html)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main(account.userName){ @html.main(account.userName){
<div class="container"> <div class="container">
<div class="container-fluid"> <div class="container-fluid">

View File

@@ -1,6 +1,6 @@
@(account: model.Account, members: List[String], isGroupManager: Boolean)(implicit context: app.Context) @(account: gitbucket.core.model.Account, members: List[String], isGroupManager: Boolean)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@main(account, Nil, "members", isGroupManager){ @main(account, Nil, "members", isGroupManager){
@if(members.isEmpty){ @if(members.isEmpty){
No members No members

View File

@@ -1,4 +1,4 @@
@(active: String, ssh: Boolean)(implicit context: app.Context) @(active: String, ssh: Boolean)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
<div class="box"> <div class="box">
<ul class="nav nav-tabs nav-stacked side-menu"> <ul class="nav nav-tabs nav-stacked side-menu">

View File

@@ -1,7 +1,7 @@
@(groupNames: List[String], @(groupNames: List[String],
isCreateRepoOptionPublic: Boolean)(implicit context: app.Context) isCreateRepoOptionPublic: Boolean)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main("Create a New Repository"){ @html.main("Create a New Repository"){
<div style="width: 600px; margin: 10px auto;"> <div style="width: 600px; margin: 10px auto;">
<form id="form" method="post" action="@path/new" validate="true"> <form id="form" method="post" action="@path/new" validate="true">

View File

@@ -1,6 +1,6 @@
@()(implicit context: app.Context) @()(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main("Create your account"){ @html.main("Create your account"){
<div class="container"> <div class="container">
<h3>Create your account</h3> <h3>Create your account</h3>

View File

@@ -1,8 +1,8 @@
@(account: model.Account, groupNames: List[String], @(account: gitbucket.core.model.Account, groupNames: List[String],
repositories: List[service.RepositoryService.RepositoryInfo], repositories: List[gitbucket.core.service.RepositoryService.RepositoryInfo],
isGroupManager: Boolean)(implicit context: app.Context) isGroupManager: Boolean)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@main(account, groupNames, "repositories", isGroupManager){ @main(account, groupNames, "repositories", isGroupManager){
@if(repositories.isEmpty){ @if(repositories.isEmpty){
No repositories No repositories

View File

@@ -1,6 +1,7 @@
@(account: model.Account, sshKeys: List[model.SshKey])(implicit context: app.Context) @(account: gitbucket.core.model.Account, sshKeys: List[gitbucket.core.model.SshKey])(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.ssh.SshUtil
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main("SSH Keys"){ @html.main("SSH Keys"){
<div class="container"> <div class="container">
<div class="row-fluid"> <div class="row-fluid">
@@ -18,7 +19,7 @@
@if(i != 0){ @if(i != 0){
<hr> <hr>
} }
<strong>@key.title</strong> (@_root_.ssh.SshUtil.fingerPrint(key.publicKey).getOrElse("Key is invalid.")) <strong>@key.title</strong> (@SshUtil.fingerPrint(key.publicKey).getOrElse("Key is invalid."))
<a href="@path/@account.userName/_ssh/delete/@key.sshKeyId" class="btn btn-mini btn-danger pull-right">Delete</a> <a href="@path/@account.userName/_ssh/delete/@key.sshKeyId" class="btn btn-mini btn-danger pull-right">Delete</a>
} }
</div> </div>

View File

@@ -1,4 +1,4 @@
@(active: String)(body: Html)(implicit context: app.Context) @(active: String)(body: Html)(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
<div class="container"> <div class="container">
<div class="row-fluid"> <div class="row-fluid">

View File

@@ -1,7 +1,7 @@
@(info: Option[Any])(implicit context: app.Context) @(info: Option[Any])(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import util.Directory._ @import gitbucket.core.view.helpers._
@import view.helpers._ @import gitbucket.core.util.Directory._
@html.main("System Settings"){ @html.main("System Settings"){
@menu("system"){ @menu("system"){
@helper.html.information(info) @helper.html.information(info)

View File

@@ -1,6 +1,6 @@
@(account: Option[model.Account], members: List[model.GroupMember])(implicit context: app.Context) @(account: Option[gitbucket.core.model.Account], members: List[gitbucket.core.model.GroupMember])(implicit context: gitbucket.core.controller.Context)
@import context._ @import context._
@import view.helpers._ @import gitbucket.core.view.helpers._
@html.main(if(account.isEmpty) "New Group" else "Update Group"){ @html.main(if(account.isEmpty) "New Group" else "Update Group"){
@admin.html.menu("users"){ @admin.html.menu("users"){
<form method="POST" action="@if(account.isEmpty){@path/admin/users/_newgroup} else {@path/admin/users/@account.get.userName/_editgroup}" validate="true"> <form method="POST" action="@if(account.isEmpty){@path/admin/users/_newgroup} else {@path/admin/users/@account.get.userName/_editgroup}" validate="true">

Some files were not shown because too many files have changed in this diff Show More